写在前头

保活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保活方法总结(不被杀死)双进程守护相关推荐

  1. Android Service保活方法总结

    在Android开发中我们经常会需要让一个Service长久的存活下去,直到海枯石烂,但是总有一些刁民想干掉朕的服务,比如手机内存不足.应用被关闭.重启手机.手机息屏被释放内存.手动清理内存等-- 因 ...

  2. 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )

    文章目录 一. 双进程守护保活 + JobScheduler 原理 二. 双进程守护保活 + JobScheduler 源码 1.JobService 代码 2.判定服务运行工具类 3.清单文件 4. ...

  3. Android 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ↳Android.content.Context  ↳an ...

  4. 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 3

    第二部分: 做过android开发的人应该都知道应用会在系统资源匮乏的情况下被系统杀死!当后台的应用被系统回收之后,如何重新恢复它呢?网上对此问题有很多的讨论.这里先总结一下网上流传的各种解决方案,看 ...

  5. android进程守护 失效,保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 1...

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ?Android.content.Context ?and ...

  6. Android进程保活——双进程守护

    作为一名知乎重度使用患者,前几天刷知乎的时候,看到一篇帖子. 怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死? 这样的一款手机应用,就一流氓软件,后台一直有service在跑着,如果 ...

  7. 【Android】锁屏后应用保活、拉活、双进程守护

    最近在使用高德地图实时获取定位时遇到了个问题,锁屏后一段时间(5~10分钟左右)后程序会被系统杀死,为了保活,特研究了下进程保活机制. 0.基本操作和概念 针对root过的手机,可以通过下列命令查看内 ...

  8. 【Android 进程保活】应用进程拉活 ( 双进程守护保活 )

    文章目录 一. 双进程守护保活原理 二. 双进程守护保活完整源码 1.AIDL 接口 2.本地前台服务 Service 3.远程前台服务 Service 4.清单配置 5.启动两个服务 5.执行效果 ...

  9. 红橙Darren视频笔记 App保活-双进程守护与JobService

    App为什么会被杀死 一般情况App被杀有以下几种情况 1 手机内存不足,系统需要花费更多资源去运行优先级较高的应用 2 第三方的管理软件比如360,腾讯管家,清理进程也可能会杀死进程 Android ...

最新文章

  1. VMware 12.0 在安装的时候出现 microsoft runtime dll
  2. 自然语言处理(NLP)前沿进展报告
  3. [书目]软件制胜之道:执行的策略
  4. 使用苹果版博客编辑器发布的文章
  5. 查看MongoDB索引的使用,管理索引
  6. Java多线程中run和start的区别
  7. 使用Java解决您的数据科学问题
  8. 如何写计算机会议的rebuttal
  9. color a dir/s_发布十个月后,依然是一个残品——小米手表COLOR深度体验
  10. OC中NSString 的常用方法
  11. IEnumerable和使用收益回报的递归
  12. 专业好用的数据恢复软件推荐
  13. python __set__ __get___python __get__ __set__
  14. iOS开发-iOS学习完整路线
  15. 循环冗余校验码(CRC码)
  16. HTML table border 属性
  17. jQ知识补全(供已经入门jq开发者)
  18. python 全角字符和半角字符切换
  19. RFC5731 - 中文翻译(原创)
  20. 同时拥有多个子域名和主域名?推荐申请GlobalSign SANs SSL证书

热门文章

  1. Windows10如何查看剪切板
  2. android 闹钟定时提醒,安卓手机便签怎么设定三天后的闹钟提醒?
  3. 几何图形识别 python_OpenCV中几何形状识别与测量
  4. 分享网站文章到微信朋友圈,缩略图怎么设置
  5. 信息安全管理过程方法和PDCA戴明环
  6. 『ORACLE』安装oracle(11g)
  7. 喜报|九州云获评“浙江省高新技术企业研究开发中心”
  8. git push提交代码到服务器报remote: [session-xx] Access denie The requested URL returned error: 403
  9. 数据合并处理concat
  10. oracle有金额数据类型,Oracle有几种数据类型?