在Android开发中我们经常会遇到一些特殊的需求需要让我们的服务常驻内存,但是会遇到各种清理软件或者用户在设置中手动停止程序的情况而导致我们的服务被异常的终止掉。虽然没有办法保证绝对的常驻内存,但是通过策略我们还是可以尽最大的可能保证服务不被杀死。

1、应对用户在设置中主动停止的case

这种情况好对付一些,我们首先新建一个TargetService来继承Service

package com.example.testundead;import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;public class TargetService extends Service {@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubAlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);//创建IntentIntent intent = new Intent(this, this.getClass());PendingIntent pendingIntent = PendingIntent.getService(this, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);//定义开始时间long triggerAtTime = SystemClock.elapsedRealtime();//周期触发manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime, 5 * 1000, pendingIntent);super.onCreate();Log.d("un", "Service onCreate");}@Override@Deprecatedpublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stubsuper.onStart(intent, startId);Log.d("un", "Service onStart");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d("un", "Service onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.d("un", "Service onDestory");Intent i = new Intent("com.example.service_destory");sendBroadcast(i);super.onDestroy();}@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubreturn super.onUnbind(intent);}}

然后在Service的onDestory方法中发出广播,然后写一个广播接收器,收到此广播时可以重新启动一个Service

public class PushReciver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){Log.d("un", "开机启动");}else if(Intent.ACTION_USER_PRESENT.equals(intent.getAction())){Log.d("un", "手机被唤醒");Intent i = new Intent();i.setClass(context, TargetService.class);context.startService(i);}else if("com.example.service_destory".equals(intent.getAction())){Log.d("un", "上次服务被挂了");Intent i = new Intent();i.setClass(context, TargetService.class);context.startService(i);}else if("com.example.clock".equals(intent.getAction())){Log.d("un", "定时闹钟的广播");Intent i = new Intent();i.setClass(context, TargetService.class);context.startService(i);}}
}

如上图所示,用户主动点击停止后,onDestory中的广播会被发出,可以在广播接收器中重新启动service。这种做法也比较流氓,但是对于使用清理软件是不能应对的,因为onDestory可能根本得不到执行,广播也就无从发出。

2、用对百度手机助手、QQ手机管家、360卫士等清理软件

应对清理软件的话不能使用上面的手段了,因为onDestory可能根本得不到执行。所以我们应该考虑使用其他的手段了。我理解的不死的服务不是说服务一刻也不能停止,而是说在服务被杀死后的最短时间内可以使服务重新被启动起来。

2.1使用系统的闹钟定时启动服务

在Service的onCreate方法中设置闹钟定时启动

AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);//创建IntentIntent intent = new Intent(this, PushReciver.class);intent.setAction("com.example.clock");PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);//周期触发manager.setRepeating(AlarmManager.RTC, 0, 5 * 1000, pendingIntent);

但是该方法并不是万无一失的,有时候确实会出现不能自启的现象。所以我们还需要增加其他的手段去弥补。没错,就是利用系统广播,我们可以使用静态的Receiver接收相对频繁的广播消息。

2.2在广播中重启service

我们可以接收比如系统启动、屏幕唤醒等容易发生的广播,当收到广播消息时去重启我们的服务。

<receiver android:name="com.example.testundead.PushReciver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/><action android:name="android.intent.action.USER_PRESENT"/><action android:name="com.example.service_destory"/></intent-filter></receiver>

至此,通过以上几种手段相结合,基本可以保证我们的服务不会出现长时间的停顿。当然以上只是基本初级的代码,具体的情况需要结合实际的项目进行探讨。

最后提供示例的下载地址:点击打开链接

Android创建杀不死的Service相关推荐

  1. Android中创建杀不死的APP进程(5.0以下)

    所谓的杀不死指的时进程被杀掉后,会自动重启. 即便时在设置里面强行停止后,也能够自动重启. 那么如何自动重启呢?目前想到的有3种方式: 1.使用AlarmManager来定时发intent启动 2.N ...

  2. android 后台杀不死的进行实现

    1. 要想永远不被系统kill掉,那你只能是升级成系统应用(例如launcher,systemUI这些应用怎么杀,也是杀不死的). 我们写的当然不是系统应用,只能说,在很大概率上不被杀死.也就是说也不 ...

  3. Android APP杀不死(最大存活方法)

    前言: 有很多APP和需求,需要让APP不被系统杀死.然而,我在这里,必须明确的跟各位安卓开发者说的就是,这个需求就跟让物理学家发明永动机一样,是不可行的.然而,我们却可以尽最大的可能性让APP存活下 ...

  4. 杀不死的Service

    项目需要,这两天研究了一下Service长驻后台的方法与实现.网上此类文章很多,本文只是一个总结.大概有以下几种: 1.onStartCommand()中return START_STICK 2.on ...

  5. docker容器杀不死_了解如何停止,杀死和清理Docker容器

    docker容器杀不死 In the previous article 'learn how to create and start Docker containers', we discussed ...

  6. Android APP 提高进程服务优先级 常驻内存 服务杀不死

    首先明确,国内定制的系统(小米,华为,OPPO等)都实现了 无论自启或提升进程优先级的策略都能被杀死,而对于用户量大的APP(如微信)和系统级别APP 系统有做白名单;抛开那些定制系统,还是有很多原生 ...

  7. (转)Android 从底层实现让应用杀不死【失效Closed】(1)

    转自:http://klob.diandi.life/?p=21#symple-tab-%e8%b0%83%e6%9f%a5%e5%af%b9%e8%b1%a1 情景还原: 我的应用调用了Notifi ...

  8. app之 杀不死的进程

    有些需求要求app进程杀不死 我觉的扯再多都是没用的  不如 给你们看看~~~人家是如何实现的 demo是可以用的 我已经测试成功了 感觉很厉害哦~~好佩服的哦~~~哦哦哦~~~    常驻进程 An ...

  9. Android_常驻进程(杀不死的进程)

    Android常驻进程,就是要让进程在内存中永远存在,让进程保活,不被杀死.可能这时都会喷,这不是流氓软件吗?刚接触android的时候,我也是认为这是很流氓的做法,可是慢慢发现很多场景(应用),要为 ...

最新文章

  1. Google将如何改变你观看电视的习惯
  2. 相关的类代表的颜色和文本对齐方式
  3. 关于多线程的一点感想
  4. 关于tomcat内路径跳转的一些思考
  5. Linux 服务器中文乱码编码解决
  6. 收藏 | PyTorch实现各种注意力机制
  7. IDL编程实现拟合树的圆心代码
  8. python快递价格查询系统
  9. python-for x in range (注意要点、细节)
  10. bzoj 4199: [Noi2015]品酒大会 (后缀自动机+DP)
  11. 空城机在CSDN的四周年创作纪念日
  12. 聊点高考往事和驾照科目二考试(r12笔记第86天)
  13. 北京智源大会圆满闭幕!150名国际AI领袖、50万名专业观众共襄盛会(含嘉宾观点集锦)...
  14. 学习java随堂练习-20220617
  15. 电机学他励直流发电机matlab,基于Matlab并励直流发电机的自励过程分析
  16. 安卓沉浸式状态栏_《宫廷秘传》今日安卓计费删档开测
  17. 计算机视觉技术英语论文,【毕业论文】外文翻译--计算机视觉技术在工业中的应用.doc...
  18. 如何在网上周游世界?
  19. Python主流的四大编程框架
  20. Java创建大小顶堆

热门文章

  1. 如何使用Node.js连接数据库
  2. Fecshop的安装以及配置
  3. android webview 关闭缓存,Android WebView删除缓存
  4. 最强chrome、edge的广告拦截插件
  5. 尊品永耀电商源码--尊品永耀广告电商系统开发源码分享
  6. 2022年道路运输企业安全生产管理人员考试内容及道路运输企业安全生产管理人员操作证考试
  7. 精力管理2—劳逸结合的平衡
  8. undeclared name问题,一定要仔细啊
  9. ibm x3250 m4 安装linux,IBM system X3250 M4 配置RAID磁盘阵列的方法
  10. Android自定义控件 - 彩虹表盘