Android Service
1|0Android Service
参考:https://blog.csdn.net/javazejian/article/details/52709857
1|11、Service简单概述
Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行,Service基本上分为两种形式:
- 启动状态
当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。
- 绑定状态
当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
Service在清单文件中的声明
前面说过Service分为启动状态和绑定状态两种,但无论哪种具体的Service启动类型,都是通过继承Service基类自定义而来,也都需要在AndroidManifest.xml中声明,那么在分析这两种状态之前,我们先来了解一下Service在AndroidManifest.xml中的声明语法,其格式如下:
- android:exported:代表是否能被其他应用隐式调用,其默认值是由service中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。为false的情况下,即使有intent-filter匹配,也无法打开,即无法被其他应用隐式调用。
- android:name:对应Service类名
- android:permission:是权限声明
- android:process:是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。
- android:isolatedProcess :设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(bind and start)。
- android:enabled:是否可以被系统实例化,默认为 true因为父标签 也有 enable 属性,所以必须两个都为默认值 true 的情况下服务才会被激活,否则不会激活。
1|22、示例
1. 最简单的Service
让我们从最基本的Service开始:
1.1 MyService.java
1.2 注册服务
1.3 activity
1.4 解释
onCreate()
:初始化服务,启动一个每秒递增count的任务,并打印日志。onStartCommand()
:定义服务的启动行为,这里返回START_STICKY
,表示如果服务被系统杀掉,系统会尝试重新启动它。onDestroy()
:停止任务,清理资源。onBind()
:返回null
,表示这是一个简单的、不可绑定的服务。
2. 绑定服务(Bound Service)
绑定服务允许客户端(如Activity)绑定到服务,并与之交互。绑定服务通常用于与应用组件进行长时间的交互。
2.1 MyBoundService.java
2.2 注册服务
2.3 activity
2.4 解释
LocalBinder
:定义一个内部类,用于客户端绑定服务时获取服务实例。getServiceData()
:提供获取服务数据的接口。setServiceData()
:提供设置服务数据的接口。
3.使用 Messenger 进行进程间通信(IPC)
Messenger需要结合Handler一起使用。需要一个handler,一个Messenger对象。handler最终会负责发送和接收消息。它不仅能够在后台执行任务,还能通过 Messenger 发送和接收消息,从而与客户端进行双向交互。
3.1 MyComplexService
3.2 注册服务
3.3 activity
3.4 解释
Messenger
:用于在进程间传递消息。IncomingHandler
:处理来自服务的消息。
4. 使用AIDL进行跨进程通信(复杂)
允许多个客户端通过消息通信与服务进行复杂交互。在客户端(如Activity)中,通过ServiceConnection
来绑定服务,并使用AIDL接口与服务通信。
4.1 MyBinderService.java
4.2 注册服务
4.3 activity
4.4 解释
-
AIDL接口:
IMyAidlInterface.Stub
是AIDL接口的具体实现。它定义了可以由客户端调用的方法,如startTask()
、stopTask()
和getCount()
。 -
服务在被绑定后,客户端可以通过这个接口与服务通信,执行跨进程任务。
-
ServiceConnection
:用于管理客户端与服务的连接状态。 -
startServiceTask()
和stopServiceTask()
:通过AIDL接口启动和停止服务任务。
总结
- 简单的服务:适用于后台执行不需要与客户端交互的任务。
- 绑定服务:适用于需要与客户端交互的任务,客户端可以通过绑定服务获取数据或执行操作。
- message:适合于需要在服务和客户端之间传递消息的场景。
- AIDL服务:适用于跨进程通信场景,允许客户端与服务进行复杂的数据交互和任务管理。
代码地址
https://gitee.com/lxj_dear/my-android-service
__EOF__

本文链接:https://www.cnblogs.com/20lxj666/p/18400574.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)