在Android开发中我们经常会需要让一个Service长久的存活下去,直到海枯石烂,但是总有一些刁民想干掉朕的服务,比如手机内存不足、应用被关闭、重启手机、手机息屏被释放内存、手动清理内存等……
因此我们要保证一个Service长久存活下去就需要解决掉上面说的这些刁民。下面介绍几种常用的服务保活的方法。
1 onStartCommand方法,返回START_STICKY
在运行onStartCommand后service进程被杀死后,那将保留在开始状态,但不会保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建 service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那获取到的Intent为null。手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,但是不能保证任何情况下都被重建,比如进程被干掉了…. 
2 提升Service优先级
在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
3 提升Service进程优先级
Android中将进程分成6个等级,由高到低分别是:前台进程、可视进程、次要服务进程、后台进程、内容供应节点以及空进程。当系统进程空间紧张时,会按照优先级自动进行进程回收。可以使用startForeground()将服务设置为前台进程。在onStartCommand中添加如下代码:

    Notification.Builder builder=new Notification.Builder(this);builder.setSmallIcon(R.mipmap.ic_launcher);builder.setTicker("uploadservice");builder.setContentText("请保持程序在后台运行");builder.setWhen(System.currentTimeMillis());intent=new Intent(this,MainActivity.class);PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);builder.setContentIntent(pendingIntent);NotificationManager manager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);Notification notification=builder.build();startForeground(1,notification);

在onDestory加上:

 stopForeground(true);

4 在onDestory中重启Service
直接在onDestroy()里startService或service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。
代码如下:

Intent intent=new Intent("com.my.learn.code.BaseService");
startService(intent);

service+broadcast方式:
1.定义一个广播:

    public class BaseReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals("com.my.learn.code.basereceiver")){Intent sintent=new Intent("com.my.learn.code.BaseService");startService(sintent);}}}
    <receiver android:name="com.my.learn.code.BaseReceiver" >  <intent-filter>  <action android:name="android.intent.action.BOOT_COMPLETED" />  <action android:name="android.intent.action.USER_PRESENT" />  <action android:name="com.my.learn.code.basereceiver" />//这个就是自定义的action  </intent-filter>  </receiver>  

在onDestory中:

Intent intent = new Intent("com.my.learn.code.basereceiver");  sendBroadcast(intent);  

5 监听系统广播判断Service状态
通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,但要记得加权限。代码如下:

   public class MonitorReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {Log.v(TAG,"手机开机");Intent sintent=new Intent("com.my.learn.code.BaseService");startService(sintent);}if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) {Log.v(TAG,"解锁");Intent sintent=new Intent("com.my.learn.code.BaseService");startService(sintent);}}}<receiver android:name="com.my.learn.code.MonitorReceiver" >  <intent-filter>  <action android:name="android.intent.action.BOOT_COMPLETED" />  <action android:name="android.intent.action.USER_PRESENT" />  <action android:name="android.intent.action.PACKAGE_RESTARTED" />  <action android:name="com.my.learn.code.monitor" /></intent-filter>
</receiver> 

6 将APK安装到/system/app,变身系统级应用
这种方式适合调试来用,并不算是一种解决办法,不推荐使用,因为你的APP是给用户使用的。

Android Service保活方法总结相关推荐

  1. Android Service保活方法总结(不被杀死)双进程守护

    写在前头 保活Service我们需要做什么: 1.在应用被关闭后保活(最难) 2.在内用占用过大,系统自动释放内存时保活(优先杀死占用较高的Service) 3.重启手机后自动开启Service 4. ...

  2. Android Service使用方法--简单音乐播放实例

    Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了.Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行. Androi ...

  3. Android Service保活的几种方法总结

    保活Service我们需要做什么: 1.在应用被关闭后保活(最难) 2.在内用占用过大,系统自动释放内存时保活(优先杀死占用较高的Service) 3.重启手机后自动开启Service 4.手机息屏后 ...

  4. Android 进程保活资料汇总与华为白名单那些事

    现在发现App在后台运行越来越难了.App在华为手机后台死的非常快,之前看网上说华为有白名单,网上也通过改包名的方式来验证了.但是半信半疑的,直到咨询了华为的客服给了一个邮箱 developer@hu ...

  5. 【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 启动相同 id 的第二个前台 Service 关闭通知 )

    文章目录 一. 前台 Service 通知问题 二. 设置 startForeground id 参数为 0 三. 启动相同 id 的第二个前台 Service 关闭通知 1. 前台服务 1 2. 关 ...

  6. 【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 )

    文章目录 一. 使用前台 Service 提高应用进程优先级 1. 前台 Service 代码 2. 前台 Service 代码 3. 启动服务 二.效果展示 三.源码资源 一. 使用前台 Servi ...

  7. android service 休眠,保持Android Service在手机休眠后继续运行的方法

    最近项目中用到了service进行计时,在连接USB的情况下一切正常,但是拔掉USB后发现,手机进入休眠后service停止了工作.最后通过 PowerManager.WakeLock 在屏幕休眠后保 ...

  8. android Service的stopself方法

    今天被stopself坑了,mark一下... 一直知道stopself是停掉Service的方法,但是却不知道什么时候停止.以为调用了stopself就会马上停止,实际上我错了. 在onStartC ...

  9. Android进程保活方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...

最新文章

  1. 清华芯片研究再获顶会MICRO加持:软件定义芯片团队出品,最佳论文提名后又一突破...
  2. Nginx Rewrite详解
  3. 根据图片地址得到文件流
  4. 使用Combres 库 ASP.NET 网站优化
  5. 嵌入式linux 网络唤醒,C语言实现wake on lan(网络唤醒...-Windows系统下用命令行编译C/C++...-字符串常量引起的思考_169IT.COM...
  6. 【消息队列之rabbitmq】学习RabbitMQ必备品之一
  7. 一个物理CPU如何划分成多个虚拟CPU
  8. 合肥师范学院计算机与技术,合肥师范学院计算机科学与技术系JAVA复习提纲
  9. 设置代理_PC客户端爬虫,这样设置代理就对了
  10. 急!Mac无法修复磁盘,应该怎么办? 看 这 里!
  11. Linux学习笔记5 - Shell编程(类似于Windows下的批处理)
  12. signature=3e113c2e337ada93de6227c65daceed1,Informed Consent: It Is More Than Just a Document
  13. ts的.d.ts和declare究竟是干嘛用的
  14. 滴滴资深分析专家:数据如何驱动业务增长
  15. Android pdf填充表单,预览,图片填充,水印添加
  16. 你觉得什么叫做幸福?
  17. 使用公式使用户输入年利率,贷款额度和支付年数,计算支付额度
  18. 眼图观测实验报告_眼图观测实验..doc
  19. Scala - 睡眠排序应用与分析
  20. python爬虫报错:不信任证书问题的解决

热门文章

  1. js-最常用的js表单校验1
  2. 3.10 Ctrl+A快捷键在表格中的使用 [原创Excel教程]
  3. Mac新手使用技巧——Mac如何强制关机
  4. php 自定义生成短链工具
  5. 苹果x屏幕失灵乱跳_苹果iphone11 pro max屏幕触摸失灵怎么办?
  6. 学校运动会广播稿计算机,学校运动会广播稿十篇
  7. 误传了数千年的几个名句
  8. quill上传本地视频(保姆级教学)
  9. prometheus监控之postgresql
  10. 战术板将要下岗 iPad登陆橄榄球场