Android初级第八讲之应用如何保活


 本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!


一般情况下应用保活的场景在于:后台要不断定位描述一条清晰轨迹、IM通信需要及时收到消息提醒等。


所谓保活就是避免被应用杀死,前台应用自然不用说,主要是后台应用。我们知道Android的应用优先级是-16到15,系统进程一般拥有-16到-1的优先级,而普通应用只拥有0-15的优先级;级别越小优先级越高。

首先进入后台的应用不能是流氓进程,比如频率的定位、发送网络请求、不允许屏幕关闭等;如果做心跳,需要选择合适的周期比如2分钟一次,进行socket长连可以设计一个前台进程一个后台进程,互相监测重启对方;保持至少有1像素位于前台。

其次如果强制保活,那么90%的可能会杀死进程;4.4以前可以用AlarmManager的setRepeating方法可定时保活,之后可以使用setAndAllWhileIdle方法在保持在一段时间内集体唤醒;

再者可以通过注册通知,比如开机启动、时间变动、锁屏解屏、网络开关、收到短信、打入电话等;7.0以后可以使用JobSchedule的Api进行轮循操作,通过主动注册网络切换广播来监听(配置文件注册方式已被禁止)

如果是Service还可以通过startForeGround的方式来让服务处于前台,避免杀死,关闭时使用stopForeGround来去掉。另外在重写onStartCommand,返回START_STICKY,使service被杀死后自动重启

public int onStartCommand(Intent intent, int flags, int startId) {        

return START_STICKY;    

}


还有通过WakeLock,需要申请到权限

   获取锁:

[java]  view plain  copy
 
  1. WakeLock mWakeLock=null;  
  2. PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
  3. /** 
  4.  * PowerManager.PARTIAL_WAKE_LOCK:保持CPU运转,屏幕和键盘灯可能是关闭的 
  5.  * PowerManager.SCREEN_DIM_WAKE_LOCK:保持CPU运转,运行屏幕显示但是屏幕有可能是灰的,允许关闭键盘灯 
  6.  * PowerManager.SCREEN_BRIGHT_WAKE_LOCK:保持CPU运转,屏幕高亮显示,允许关闭键盘灯 
  7.  * PowerManager.FULL_WAKE_LOCK:保持CPU运转,屏幕高亮显示,键盘灯高亮显示 
  8.  * PowerManager.ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间 
  9.  * PowerManager.ACQUIRE_CAUSES_WAKEUP:强制屏幕亮起 
  10.  */  
  11. mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "SoundRecorder");  
  12. mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);  
  13. mWakeLock.acquire();  

          释放锁   
[java]  view plain  copy
 
  1. if (mWakeLock.isHeld()) {  
  2.       mWakeLock.release();  
  3.   } 
如果是Root手机,可以设置应用的persistent标签为true。


终归这样的方式很流氓,就像张小龙对微信的期许一下:希望它是个人们有需要用一下,用完就放开的工具。


给Activity设置如下标签,当用户点击最近任务时,App不会显示在内,达到隐藏的目的

android:excludeFromRecents="true"


附斑马行车对用户权限的要求(主要设置白名单)


恭喜你,看到最后发现新天地!无论如何,在保活的时候要考虑下用户的感受,理性保活!

其他如启动1像素的activity,Native进程保活,通知拉起保存Service、监听第三方和系统的公开广播

Android进程保活招数大全

你可能感兴趣的:(Android初级第八讲之应用如何保活)