关于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()会尝试再次启动对应的应用进程。

 

 

 

部分资料源自互联网,如有侵权,请联系作者删除。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android(安卓)AsyncTask
  5. 浅析Android如何从不同的层次保证安全性
  6. 创建android Notification
  7. Android周学习Step By Step(6)--Android的数据库SQLite
  8. Android(安卓)WebView 开发详解(一)
  9. android sdk 的下载方法,其他的方法都是非常慢的

随机推荐

  1. android 获取农历日期和天干、地支
  2. Android显示网络图片相关实现方法浅谈
  3. Android(安卓)O 去掉Launcher3 背景阴影
  4. Android开场透明度渐变动画
  5. android 网络判断
  6. Android(安卓)屏幕滑动事件
  7. 卸载android应用程序
  8. AJAX 自学练习 无刷新提交并修改数据库数
  9. jsp 文件上传浏览,支持ie6,ie7,ie8
  10. JSP application(return String)用法详例