android保活,有效的代码保活

公众号:码农乐园
• 阅读 1651

需要APP暗屏情况下进行后台执行一些任务,但是google现在为了优化手机的体验,以及流畅性,做了很多的限制,电量优化,休眠模式,以及进入深度睡眠状态,进入深入休眠状态系统会根据黑白名单的应用进行管理,杀掉非白名单的后台进程以及网络请求;Android系统的优化是守护后台进程造成了很大困扰,线程之间守护已经是不在可靠,使用wakelock耗电过大也会是系统杀掉应用进程。下面就对我们的经历说说守护进程的。

1,从官网上可以看出google为了系统更加流畅以及优化内存,Google做了很大的处理,在手机暗屏或者睡眠状态就停止后台运行;若要保持service的常驻,需要做一些前端的活动,Notification重要属性:notification.flags = Notification.FLAG_NO_CLEAR|Notification.FLAG_ONGOING_EVENT;然后startForeground(setClass().hashCode(), notification);使得服务能挂在通知栏。

2,通过wakelock占用CPU,若一直占用CPU的话,当然这是比较耗电的,要是耗电太高的话系统会直接回收,杀死程序进程。

我是使用定时器唤醒cpu 后台服务将接收到定时任务执行未完成的任务:下面是我实现的代码

在mainfest中注册

关键代码定时任务:

publicvoidstartAlarm(Context context){      
Intent intent =newIntent(context, WakeCPUAlarmReceiver.class);      
alarmIntent = PendingIntent.getBroadcast(context,0, intent,0);      
alarmMgr = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE);//    alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,//          1000, alarmIntent);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {   
     alarmMgr.setExactAndAllowWhileIdle(       
       AlarmManager.ELAPSED_REALTIME_WAKEUP,        
      SystemClock.elapsedRealtime() + chekcTime, alarmIntent);    
  }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
      alarmMgr.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,              SystemClock.elapsedRealtime() + chekcTime, alarmIntent);    
  }else{      
  alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,             
 SystemClock.elapsedRealtime() + chekcTime, alarmIntent);    
  }     
 FileLogUtil.e(TAG ,"startAlarm 设置定时任务");  }

接收到定时任务:

publicclassWakeCPUAlarmReceiverextendsWakefulBroadcastReceiver{
privateAlarmManageralarmMgr;
privatePendingIntentalarmIntent;
privatefinallong chekcTime =30*1000;    
public static boolean isCheckFlag =false;
privatestaticStringTAG=WakeCPUAlarmReceiver.class.getSimpleName();
@Override
public void onReceive(Contextcontext,Intentintent) {
// TODO Auto-generated method stub
Intentservice =newIntent(context,WakecpuIntentService.class);
FileLogUtil.e(TAG,"onReceive 接收定时任务");          
startWakefulService(context, service);  
}

在service中执行需要执行的任务:

public class WakecpuIntentService extends IntentService{
private static String TAG=WakecpuIntentService.class.getSimpleName() +" :";
private NotificationManager mNotificationManager;
private PowerManager.WakeLockwl;
NotificationCompat.Builderbuilder;  
public WakecpuIntentService() {
super("WakecpuIntentService");
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intentintent) {
// TODO Auto-generated method stubBundle
extras = intent.getExtras();
FileLogUtil.e(TAG,"Service接收到WakeLock定时任务。");
PollService.startService(getApplicationContext());
FileLogUtil.e(TAG,"Service接收到WakeLock定时任务在定时任务中启动轮询Service。");
// Do the work that requires your app to keep the CPU running.
// Release the wake lock provided by the WakefulBroadcastReceiver.
//checkScreenOff();
WakeCPUAlarmReceiver.completeWakefulIntent(intent);//释放wake
WakeCPUAlarmReceiver.setCheckFlag(false);
WakeCPUAlarmReceivermAlarmReceiver =newWakeCPUAlarmReceiver();      
mAlarmReceiver.startAlarm(WakecpuIntentService.this);
FileLogUtil.e(TAG,"Service释放wakelock后设置定时任务。");  
    }
}

service在后台也能够打印log 保持一直执行,最重要的是不耗电也不会卡机的问题。欢迎大家一起讨论学习。 关注公众号获取更多干货 android保活,有效的代码保活

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
GoCoding GoCoding
3年前
Supervisor 开始
Supervisor是Linux/Unix操作系统上的进程管理工具。本文介绍了于Ubuntu18上如何使用Supervisor开机启动、保活守护自己的服务进程。安装建议系统方式安装,可开机启动。bashsudoaptinstallsupervisorySystemd查看服务状态:bash$sudosystemctlstatu
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
简
3年前
深度剖析APP保活案例
这是作者在去年处理的一个关于进程保活的案例一.引言1.1保活概述什么是保活?保活就是在用户主动杀进程,或者系统基于当前内存不足状态而触发清理进程后,该进程设法让自己免于被杀的命运或者被杀后能立刻重生的手段。保活是”应用的蜜罐,系统的肿瘤“,应用高保活率给自己赢得在线时长,甚至做各种应用想做而用户不期望的行为,给系统带来的是不必要的耗电,以及系统额外的性
Stella981 Stella981
3年前
Android保活从入门到放弃:乖乖引导用户加白名单吧
1、引言IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android8.0后系统大大降低了后台运行应用的保活容忍度(详见《AndroidP正式版即将到来:后台应用保活、消息推送的真正噩梦(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。自从AndroidP(即Android8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《AndroidP正式版即将到来:后台应用保活、消息推送的真正噩梦(https://www.oschina
可莉 可莉
3年前
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。自从AndroidP(即Android8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《AndroidP正式版即将到来:后台应用保活、消息推送的真正噩梦(https://www.oschina
Stella981 Stella981
3年前
Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)
1、引言IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android8.0后系统大大降低了后台运行应用的保活容忍度(详见《AndroidP正式版即将到来:后台应用保活、消息推送的真正噩梦(https://www.oschina.net/action/GoToLink?urlhttps%3A%2
公众号:码农乐园
公众号:码农乐园
Lv1
Android程序员一名,不太会说话,可以关注我的公众号:码农乐园(QXF069)
文章
25
粉丝
2
获赞
7