以下内容整理自互联网,仅用于个人学习
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进程的优先级从高到低依次为:
- 前台进程( FOREGROUND_APP)
- 可视进程(VISIBLE_APP )
- 次要服务进程(SECONDARY_SERVER )
- 后台进程 (HIDDEN_APP)
- 内容供应节点(CONTENT_PROVIDER)
- 空进程(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很混乱,带来诸多不便。
网友评论