本文来自刘兆贤的博客_CSDN博客-Java高级,Android旅行,Android基础领域博主 ,引用必须注明出处!
一般情况下应用保活的场景在于:后台要不断定位描述一条清晰轨迹、IM通信需要及时收到消息提醒等。
所谓保活就是避免被应用杀死,前台应用自然不用说,主要是后台应用。我们知道Android的应用优先级是-16到15,系统进程一般拥有-16到-1的优先级,而普通应用只拥有0-15的优先级;级别越小优先级越高。
首先进入后台的应用不能是流氓进程,比如频率的定位、发送网络请求、不允许屏幕关闭等;如果做心跳,需要选择合适的周期比如2分钟一次,进行socket长连;可以设计一个前台进程一个后台进程,互相监测重启对方;保持至少有1像素位于前台。
其次如果强制保活,那么90%的可能会杀死进程;4.4以前可以用AlarmManager的setRepeating方法可定时保活,之后可以使用setAndAllWhileIdle方法在保持在一段时间内集体唤醒;
再者可以通过注册通知,比如开机启动、时间变动、锁屏解屏、网络开关、收到短信、打入电话等;5.0以后可以使用JobSchedule的Api进行轮循操作,通过主动注册网络切换广播来监听(配置文件注册方式已被禁止)
如果是Service还可以通过startForeGround的方式来让服务处于前台,避免杀死,关闭时使用stopForeGround来去掉。另外在重写onStartCommand,返回START_STICKY,使service被杀死后自动重启
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
还有通过WakeLock,需要申请到权限
获取锁:
- WakeLock mWakeLock=null;
- PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- /**
- * PowerManager.PARTIAL_WAKE_LOCK:保持CPU运转,屏幕和键盘灯可能是关闭的
- * PowerManager.SCREEN_DIM_WAKE_LOCK:保持CPU运转,运行屏幕显示但是屏幕有可能是灰的,允许关闭键盘灯
- * PowerManager.SCREEN_BRIGHT_WAKE_LOCK:保持CPU运转,屏幕高亮显示,允许关闭键盘灯
- * PowerManager.FULL_WAKE_LOCK:保持CPU运转,屏幕高亮显示,键盘灯高亮显示
- * PowerManager.ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间
- * PowerManager.ACQUIRE_CAUSES_WAKEUP:强制屏幕亮起
- */
- mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "SoundRecorder");
- mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
- mWakeLock.acquire();
释放锁
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- }
如果是Root手机,可以设置应用的persistent标签为true。
终归这样的方式很流氓,就像张小龙对微信的期许一下:希望它是个人们有需要用一下,用完就放开的工具。
给Activity设置如下标签,当用户点击最近任务时,App不会显示在内,达到隐藏的目的
android:excludeFromRecents="true"
tips:另外针对线程做双重UncaughtExceptionHandler,有助于防止App直接挂掉。
附斑马行车对用户权限的要求(主要设置白名单)
恭喜你,看到最后发现新天地!无论如何,在保活的时候要考虑下用户的感受,理性保活!
其他如启动1像素的activity,Native进程保活,通知拉起保存Service、监听第三方和系统的公开广播
Android进程保活招数大全
目前市面上的应用,貌似除了微信和手Q都会比较