如何保证Service不被杀死

以下内容整理自互联网,仅用于个人学习


1. onStartCommand方法,返回START_STICKY

将Service设置成START_STICKY,在运行onStartCommand后Service进程被kill,那将保留在开始状态,但是不保留那些传入的intent。不久后Service就会再次尝试重新创建,因为保留在开始状态,在创建Service后将保证调用onstartCommand。如果没有传递任何开始命令给Service,那将获取到null的intent。重传intent,保持和重启前一样。

当Service因内存不足被kill,当内存还充足的时候,Service被重新创建,但是不能保证任何情况下都被重建,比如进程被干掉了。

2. 提升Service优先级

在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。

3. 提升service进程优先级

Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。

Android进程的优先级从高到低依次为:

  1. 前台进程( FOREGROUND_APP)
  1. 可视进程(VISIBLE_APP )
  2. 次要服务进程(SECONDARY_SERVER )
  3. 后台进程 (HIDDEN_APP)
  4. 内容供应节点(CONTENT_PROVIDER)
  5. 空进程(EMPTY_APP)

当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以使用startForeground()将service放到前台状态。这样在低内存时被kill的几率会低一些。

如果在极度低内存的压力下,该service还是会被kill掉,并且不一定会restart()

4. onDestroy方法里重启service

直接在onDestroy()里startService或使用service + broadcast方式,就是当service走到onDestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service;

当使用类似某某管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证。

5. 监听系统广播判断Service状态

通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限。

这也能算是一种措施,不过感觉监听多了会导致Service很混乱,带来诸多不便。

6. root之后将app放到system/app变成系统级应用

7. 放一个像素在前台(手机QQ)

你可能感兴趣的:(如何保证Service不被杀死)