1 Service 是什么,有什么作用
Service 是不与用户交互,再后台运行的一个组件。因为是在后台运行,所以 Service 多用于处理耗时任务,或者需要在后台不被打扰的任务,如音乐播放、录音等等。
2 如何使用 Service
前面说了什么是 Service ,那我们来说说如何使用。
Service 的生命周期函数
- onCreate() 方法,第一次被创建的时候调用,一般用来做初始化操作。
- onBind() 方法,抽象函数,必须要实现。返回一个和服务通信的信道,一般用来获取 service 实例。
- onStartCommand() 方法,接受传入的 Intent,需要注意的是不能做耗时的操作。
- onDestory() 方法。Service 退出时候会调用,释放资源的操作一般在这里。
注册 service
首先每个组件都需要在清单文件 AndroidManifest.xml 中注册,Service 也不例外,Service 的注册可参考如下代码。
<manifest ... >
...
<application ... >
<service
android:name="packagename.DemoService"
... />
...
</application>
</manifest>
启动 Service
然后是启动一个 Service ,启动的话,一般有 2 种方法。
- 调用 startService( Intent intent ) 方法
- 调用 bindService(Intent service, ServiceConnection conn, int flags)
这两种方式是有区别的,我们先说 startService() 方法。
startService() 启动方式
这种启动方式启动的 service 会在后台一直运行(忽略系统因内存不够等杀死Service的情况),直到调用了 stopService() 方法。所以 startService() 的时候需要注意要在合适的时候调用 stopService() 以释放内存。startService() 启动的时候,Service 的生命周期函数调用顺序是
onCreate() -> onStartCommand()
bindService() 启动方式。
bindService()方法启动的话,会通过 ServiceConnection 将 onBind() 返回的和 Service 通信的信道(IBinder)回调给调用方,调用方通过 IBinder 可以得到 Service,然后可以控制 Service。整个过程的生命周期函数调用如下:
onCreate()->onBind()->ServiceConnection 的方法回调
注: bindService() 方法需要的 onBind() 返回非空的 IBinder 。否则会绑定失败。
3 Service 保活的常用方法
1 提高进程优先级,在清单文件
intent-filter
中设置android:priority
,没试过,很多人说并不一定有效。2 通过
startForeground
方法,将 Service 转变为前台进程。3 在 startCommand() 方法返回
START_STICKY
,这样系统杀死 Service 后会从新传 Intent ,从而有机会继续处理。但是短时间连续被杀死后,系统不会回传 Intent 。4 在 onDestory() 方法里发送广播唤醒自己。
5 接收腾讯、淘宝等发出的广播 。
6 监听系统广播。
7 接入 小米push,华为push 等。
8 守护进程,没实际用过,据说5.0以后不好使,5.0 以后 jni 代码 fork 出来的进程不能作为守护进程。Android5.0 在应用退出后,ActivityManagerService不仅把主进程给杀死,另外把主进程所属的进程组一并杀死,这样一来,由于子进程和主进程在同一进程组,子进程在做的事情,也就停止了。但是有方法,点击跳转到大牛博客。
暂时写到这里,如有错误,请告知。