服务概览  |  Android 开发者  |  Android Developers (google.cn)

生命周期

Untitled

Service启动方式

从生命周期图可以看出,Service有两种启动方式,startService和bindService

🚀 startService启动后,Service会无限期运行下去,只有外部调用stopService或stopSelf才会停止和销毁。

🚀 bindService启动的服务和调用者之间是典型的Client-Server模式,调用者是Client端,服务Service是Server端。Service只有一个,但绑定到Service上的Client可以有多个。Client可以通过IBinder接口获取Service实例,从而调用Service的方法

启动BindService,需要:

销毁

如何保证Service不被杀死?

  1. onStartCommand方式中,返回START_STICKY

    如果onStartCommand返回START_NOT_STICKY,表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service

    如果onStartCommand返回START_STICKY,表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand方法传入的intent对象,然后Android系统会尝试再次重新创建该Service,并执行onStartCommand回调方法

    如果你的Service可以在任意时刻运行或结束都没什么问题,而且不需要intent信息,那么就可以在onStartCommand方法中返回START_STICKY

  2. 提高Service的优先级

  3. 提升Service进程的优先级

    Android将进程分为6个等级,按照优先级由高到低依次为:

  4. 在onDestroy方法里重启Service

    当service走到onDestroy()时,发送一个自定义广播,当收到广播时,重新启动service。

  5. 系统广播监听Service状态

  6. 将APK安装到/system/app,变身为系统级应用