关于Service保活,提高Andorid 应用中Service 组件优先级的方法,总结起来,大概有这些方法:
- 在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播。
- 在onStartCommand里面调用 startForeground()方法把Service提升为前台进程级别,然后再onDestroy里面要记得调用stopForeground ()方法。
- onStartCommand方法,手动返回START_STICKY。
- 在onDestroy方法里发广播重启service。service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。(第三方应用或是在setting里-应用-强制停止时,APP进程就直接被干掉了,onDestroy方法都进不来,所以无法保证会执行)
- 监听系统广播判断Service状态。通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活。
- 可以多个app相互拉
- 服务互相绑定
- 设置闹钟,定时唤醒
- 开启前台Service(效果好,推荐)
- Service中循环播放一段无声音频(效果较好,但耗电量高,谨慎使用)
- 双进程守护(Android 5.0前有效)
- JobScheduler(Android 5.0后引入,8.0后失效)
- 1 像素activity保活方案(不推荐)
- 广播锁屏、自定义锁屏(不推荐)
- 第三方推送SDK唤醒(效果好,缺点是第三方接入)
- 自己的app在native层fork一个子进程来与主进程互拉
- 与手机厂商沟通好,把我们app放进系统白名单,降低omm_adj值(每个进程都有一个oom权重值,值越小,说明进程的优先级越高,越不容易被进程kill掉),尽量保证进程不被系统杀死。
- 在AndroidManifest.xml 中,对application节点加上Persistent属性。
废话多了点,今天,我们着重讲最后一条。
有人会问:一句代码搞定的事情,前面还列那么多方法干嘛?
当然,这样用的前提是:把自己的App作为系统应用。
即只有安装目录为 /system/apk/ 目录下才会有效。这样的程序需要重启手机后才会起效。
正常的程序安装后路径为 /data/apk/ 目录下,即使设置了该属性也不会有效果。
persistent 的实现原理概述
persistent一词的意思是“持久”,那么persistent应用的意思又是什么呢?简单地说,这种应用会顽固地运行于系统之中,从系统一启动,一直到系统关机。
- 在系统启动之时,AMS(ActivityManagerService)的systemReady()会加载所有persistent为true的应用。
- 为了保证这种持久性,persistent应用必须能够在异常出现时,自动重新启动。在Android里是这样实现的。每个ActivityThread中会有一个专门和AMS通信的binder实体——final ApplicationThread mAppThread。这个实体在AMS中对应的代理接口为IApplicationThread。
- 一般情况下,当一个应用进程挂掉后,AMS当然会清理掉其对应的ProcessRecord,这就是cleanUpApplicationRecordLocked()的主要工作。然而,对于persistent应用,cleanUpApplicationRecordLocked()会尝试再次启动对应的应用进程。
部分资料源自互联网,如有侵权,请联系作者删除。