Android Service保活方法总结(不被杀死)双进程守护
写在前头
保活Service我们需要做什么:
1.在应用被关闭后保活(最难)
2.在内用占用过大,系统自动释放内存时保活(优先杀死占用较高的Service)
3.重启手机后自动开启Service
4.手机息屏后不被释放内存
5.手动清理内存时保活
首先介绍一下Service的等级:
一、前台进程
二、可见进程
三、服务进程
四、后台进程
五、空进程 ---关闭应用后,没有清理缓存
所以为了提高优先级我们可以使用startForeground()方法将Service设置为前台进程。
一、在AndroidManifest中添加Service
<service android:name=".modle.StepService"android:process="istep.service" //放入新进程><intent-filter android:priority="1000"><!-- 系统启动完成后会调用--><action android:name="android.intent.action.BOOT_COMPLETED"/><action android:name="android.intent.action.DATE_CHANGED"/><action android:name="android.intent.action.MEDIA_MOUNTED" /><action android:name="android.intent.action.USER_PRESENT" /><action android:name="android.intent.action.ACTION_TIME_TICK" /><action android:name="android.intent.action.ACTION_POWER_CONNECTED" /><action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /></intent-filter>
</service><service android:name=".modle.GuardService"android:process=":GuardService"><intent-filter ><!-- 系统启动完成后会调用--><action android:name="android.intent.action.BOOT_COMPLETED"/><action android:name="android.intent.action.DATE_CHANGED"/><action android:name="android.intent.action.MEDIA_MOUNTED" /><action android:name="android.intent.action.USER_PRESENT" /><action android:name="android.intent.action.ACTION_TIME_TICK" /><action android:name="android.intent.action.ACTION_POWER_CONNECTED" /><action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /></intent-filter></service>
二、双进程保护
1.创建aidl实现跨进程通信(新建一个aidl)
interface ProcessConnection {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*///删除不必要方法}
2.创建主服务
/*** 主进程 双进程通讯* Created by db on 2018/1/11.*/public class StepService extends Service{@Nullable@Overridepublic IBinder onBind(Intent intent) {return new ProcessConnection.Stub() {};}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {startForeground(1,new Notification());//绑定建立链接bindService(new Intent(this,GuardService.class),mServiceConnection, Context.BIND_IMPORTANT);return START_STICKY;}private ServiceConnection mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {//链接上Log.d("test","StepService:建立链接");}@Overridepublic void onServiceDisconnected(ComponentName componentName) {//断开链接startService(new Intent(StepService.this,GuardService.class));//重新绑定bindService(new Intent(StepService.this,GuardService.class),mServiceConnection, Context.BIND_IMPORTANT);}};}
3.创建守护服务
/*** 守护进程 双进程通讯* Created by db on 2018/1/11.*/public class GuardService extends Service{@Nullable@Overridepublic IBinder onBind(Intent intent) {return new ProcessConnection.Stub() {};}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {startForeground(1,new Notification());//绑定建立链接bindService(new Intent(this,StepService.class),mServiceConnection, Context.BIND_IMPORTANT);return START_STICKY;}private ServiceConnection mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {//链接上Log.d("test","GuardService:建立链接");}@Overridepublic void onServiceDisconnected(ComponentName componentName) {//断开链接startService(new Intent(GuardService.this,StepService.class));//重新绑定bindService(new Intent(GuardService.this,StepService.class),mServiceConnection, Context.BIND_IMPORTANT);}};}
返回参数含义:
- START_STICKY:在Service被关闭后,重新开启Service
- START_NOT_STICKY:服务被异常杀掉后,系统将会被设置为started状态,系统不会重启该服务,直到startService(Intent intent)方法再次被调用。
- START_REDELIVER_INTENT:重传Intent,使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
- START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
三、使用JobService来实现应用退出后重启Service
1、在AndroidManifest中添加Service和权限
<service android:name=".service.JobWakeUpService"android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
2、JobService代码
/*** 用于判断Service是否被杀死* Created by db on 2018/1/11.*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)//5.0以后可用
public class JobWakeUpService extends JobService{private int JobWakeUpId = 1;@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//开启轮寻JobInfo.Builder mJobBulider = new JobInfo.Builder(JobWakeUpId,new ComponentName(this,JobWakeUpService.class));//设置轮寻时间mJobBulider.setPeriodic(2000);JobScheduler mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);mJobScheduler.schedule(mJobBulider.build());return START_STICKY;}@Overridepublic boolean onStartJob(JobParameters jobParameters) {//开启定时任务 定时轮寻 判断应用Service是否被杀死//如果被杀死则重启Serviceboolean messageServiceAlive = serviceAlive(StepService.class.getName());if(!messageServiceAlive){startService(new Intent(this,StepService.class));}return false;}@Overridepublic boolean onStopJob(JobParameters jobParameters) {return false;}/*** 判断某个服务是否正在运行的方法* @param serviceName* 是包名+服务的类名(例如:net.loonggg.testbackstage.TestService)* @return true代表正在运行,false代表服务没有正在运行*/private boolean serviceAlive(String serviceName) {boolean isWork = false;ActivityManager myAM = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningServiceInfo> myList = myAM.getRunningServices(100);if (myList.size() <= 0) {return false;}for (int i = 0; i < myList.size(); i++) {String mName = myList.get(i).service.getClassName().toString();if (mName.equals(serviceName)) {isWork = true;break;}}return isWork;}
}
四、保证Service在开机后自动启动
(1)注册广播
<receiver android:name=".modle.mReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>
(2)广播代码
/*** 开机完成广播*/public class mReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent){Intent mIntent = new Intent(context,StepService.class);context.startService(mIntent);}
}
五、保证息屏后不被释放资源杀死(WakeLock的使用)
(1)添加权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
(2)在创建Service以后调用方法
/*** 同步方法 得到休眠锁* @param context* @return*/synchronized private void getLock(Context context){if(mWakeLock==null){PowerManager mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE);mWakeLock=mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,StepService.class.getName());mWakeLock.setReferenceCounted(true);Calendar c=Calendar.getInstance();c.setTimeInMillis((System.currentTimeMillis()));int hour =c.get(Calendar.HOUR_OF_DAY);if(hour>=23||hour<=6){mWakeLock.acquire(5000);}else{mWakeLock.acquire(300000);}}Log.v(TAG,"get lock");}
(3)在onDestroy()方法中调用释放锁的方法(避免占用内存)
synchronized private void releaseLock(){if(mWakeLock!=null){if(mWakeLock.isHeld()) {mWakeLock.release();Log.v(TAG,"release lock");}mWakeLock=null;}}
PARTIAL_WAKE_LOCK | 保持CPU运转,屏幕和键盘灯有可能是关闭的。 |
SCREEN_DIM_WAKE_LOCK | 保持CPU运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯。 |
SCREEN_BRIGHT_WAKE_LOCK | 保持CPU运转,保持屏幕高亮显示,允许关闭键盘灯。 |
FULL_WAKE_LOCK | 保持CPU运转,保持屏幕高亮显示,键盘灯也保持亮度。 |
ACQUIRE_CAUSES_WAKEUP | 不会唤醒设备,强制屏幕马上高亮显示,键盘灯开启。有一个例外,如果有notification弹出的话,会唤醒设备。 |
ON_AFTER_RELEASE | Wake Lock被释放后,维持屏幕亮度一小段时间,减少Wake Lock循环时的闪烁情况。 |
六、启动所有Service(在Activity中)
/*** 开启所有Service*/private void startAllServices(){startService(new Intent(this, StepService.class));startService(new Intent(this, GuardService.class));if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.LOLLIPOP) {Log.d(TAG, "startAllServices: ");//版本必须大于5.0startService(new Intent(this, JobWakeUpService.class));}}
注意:该方法不能保证在所有机型上有效,而且除非在必要时,否则不建议写这样的流氓软件。特别是谷歌在android7.0以后对管理加强,想要保活Service其实已经变得不太可能了,谷歌这样做无疑是为了减少流氓软件的数量,这样做也是可取的。
Android Service保活方法总结(不被杀死)双进程守护相关推荐
- Android Service保活方法总结
在Android开发中我们经常会需要让一个Service长久的存活下去,直到海枯石烂,但是总有一些刁民想干掉朕的服务,比如手机内存不足.应用被关闭.重启手机.手机息屏被释放内存.手动清理内存等-- 因 ...
- 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )
文章目录 一. 双进程守护保活 + JobScheduler 原理 二. 双进程守护保活 + JobScheduler 源码 1.JobService 代码 2.判定服务运行工具类 3.清单文件 4. ...
- Android 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护
本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ↳Android.content.Context ↳an ...
- 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 3
第二部分: 做过android开发的人应该都知道应用会在系统资源匮乏的情况下被系统杀死!当后台的应用被系统回收之后,如何重新恢复它呢?网上对此问题有很多的讨论.这里先总结一下网上流传的各种解决方案,看 ...
- android进程守护 失效,保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 1...
本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ?Android.content.Context ?and ...
- Android进程保活——双进程守护
作为一名知乎重度使用患者,前几天刷知乎的时候,看到一篇帖子. 怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死? 这样的一款手机应用,就一流氓软件,后台一直有service在跑着,如果 ...
- 【Android】锁屏后应用保活、拉活、双进程守护
最近在使用高德地图实时获取定位时遇到了个问题,锁屏后一段时间(5~10分钟左右)后程序会被系统杀死,为了保活,特研究了下进程保活机制. 0.基本操作和概念 针对root过的手机,可以通过下列命令查看内 ...
- 【Android 进程保活】应用进程拉活 ( 双进程守护保活 )
文章目录 一. 双进程守护保活原理 二. 双进程守护保活完整源码 1.AIDL 接口 2.本地前台服务 Service 3.远程前台服务 Service 4.清单配置 5.启动两个服务 5.执行效果 ...
- 红橙Darren视频笔记 App保活-双进程守护与JobService
App为什么会被杀死 一般情况App被杀有以下几种情况 1 手机内存不足,系统需要花费更多资源去运行优先级较高的应用 2 第三方的管理软件比如360,腾讯管家,清理进程也可能会杀死进程 Android ...
最新文章
- VMware 12.0 在安装的时候出现 microsoft runtime dll
- 自然语言处理(NLP)前沿进展报告
- [书目]软件制胜之道:执行的策略
- 使用苹果版博客编辑器发布的文章
- 查看MongoDB索引的使用,管理索引
- Java多线程中run和start的区别
- 使用Java解决您的数据科学问题
- 如何写计算机会议的rebuttal
- color a dir/s_发布十个月后,依然是一个残品——小米手表COLOR深度体验
- OC中NSString 的常用方法
- IEnumerable和使用收益回报的递归
- 专业好用的数据恢复软件推荐
- python __set__ __get___python __get__ __set__
- iOS开发-iOS学习完整路线
- 循环冗余校验码(CRC码)
- HTML table border 属性
- jQ知识补全(供已经入门jq开发者)
- python 全角字符和半角字符切换
- RFC5731 - 中文翻译(原创)
- 同时拥有多个子域名和主域名?推荐申请GlobalSign SANs SSL证书
热门文章
- Windows10如何查看剪切板
- android 闹钟定时提醒,安卓手机便签怎么设定三天后的闹钟提醒?
- 几何图形识别 python_OpenCV中几何形状识别与测量
- 分享网站文章到微信朋友圈,缩略图怎么设置
- 信息安全管理过程方法和PDCA戴明环
- 『ORACLE』安装oracle(11g)
- 喜报|九州云获评“浙江省高新技术企业研究开发中心”
- git push提交代码到服务器报remote: [session-xx] Access denie The requested URL returned error: 403
- 数据合并处理concat
- oracle有金额数据类型,Oracle有几种数据类型?