现在项目中要有一种流氓行为,保证服务在后台运行,但是又不能被用户杀死。
搜索了下,总结了下面几种方式:

Service是android中的后台解决方案,当我们需要执行那些在后台长期运行又不需要和用户交互的任务时,就可以使用service.

Service默认运行在主线程中,如果我们需要执行耗时任务,需要自己在服务中开启子线程。或者使用IntentService,使用IntentService有两个好处,他会自己运行时创建一个子线程,就不需要自己去new Thread 了;另一方面在完成所有任务后,会自动关闭服务。

如果要启动服务,可以调用startService()方法。关闭Service,调用stopService()方法,如果要实现Activity和service间的通信,则需使用bindService()方法。解绑的话使用unbindService()方法。

1.防止用户在设置中杀死服务
在Service的onDestory()中,发送广播重新启动service,测试过有效,当进入设置->开发者选项->运行中的服务。杀掉服务,又启动了。

  @Override    public void onDestroy() {        super.onDestroy();        Intent i = new Intent("com.example.service_destory");        sendBroadcast(i);    }
   <receiver android:name=".broadcastreciver.PushReciver">            <intent-filter>                <action android:name="com.example.service_destory" />            intent-filter>        receiver>
public class PushReciver extends BroadcastReceiver {    private static final String TAG = "PushReciver";    @Override    public void onReceive(Context context, Intent intent) {        if ("com.example.service_destory".equals(intent.getAction())) {//上次服务被用户在设置中取消的时候,启动Service            Intent i = new Intent();            i.setClass(context, NotKillService.class);            context.startService(i);        }     }}

2.开机启动,屏幕解锁的时候,发送广播,启动service

 <receiver android:name=".broadcastreciver.PushReciver">            <intent-filter>                <action android:name="android.intent.action.BOOT_COMPLETED" />                <action android:name="android.intent.action.USER_PRESENT" />        receiver>
public class PushReciver extends BroadcastReceiver {    private static final String TAG = "PushReciver";    @Override    public void onReceive(Context context, Intent intent) {        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction()))//开机启动的时候        {           Intent i = new Intent();            i.setClass(context, NotKillService.class);            context.startService(i);        } else if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) {// 解锁,手机被唤醒的时候启动service            Intent i = new Intent();            i.setClass(context, NotKillService.class);            context.startService(i);        }     }}

3.在Service中的onCreate()方法中,在Service的onCreate中,用alarmmanager定时启动service,获取定时发广播启动服务。

Alarmmaager getBroadcast()方法是用来发广播的。

 @Override    public void onCreate() {//        //发广播来启动服务        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);        //创建Intent        Intent intent = new Intent(this, PushReciver.class);        intent.setAction("com.example.clock");        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);        long triggerAtTime = SystemClock.elapsedRealtime();        //周期触发        manager.setRepeating(AlarmManager.RTC, triggerAtTime, 2 * 1000, pendingIntent);        super.onCreate();    }

4.双service守护,保证在手机助手一键清理下存活

定义两个service,当一个service被销毁时,将另一个Service启动,达到杀不死。在onTrimMemory()方法中,如果发现另一个不存活了,就将他startService(),详细可看双service守护

但是,发现一个问题,以上方法,当应用程序被关闭的时候,service也被关闭了,不知道有没好的方法处理这种情况的service保活。
参考资料:杀不死service

更多相关文章

  1. 纸上得来终觉浅,绝知此事要躬行。Broadcast和Fragment详解
  2. Android:Android(安卓)6.0+权限适配--简单粗暴
  3. android开发之widget控件突然停止更新的原因
  4. 再谈android studio抽取字符串方法
  5. Android插件化原理解析——Hook机制之动态代理
  6. Android开发规范之编码规范
  7. Android(安卓)WebView使用
  8. 漫谈Android网络编程
  9. 2018-6月Android试题整理

随机推荐

  1. Android 中支持的几种传感器
  2. 【android】shape的使用
  3. Android性能检测--traceview工具各个参数
  4. android 右上角菜单无法显示
  5. a64_7.1android平板关于更改绘制矩形界面
  6. Android 中的 Service 全面总结
  7. android中去掉空格--trim函数
  8. Android避免启动时闪一下黑屏
  9. android:屏幕自适应
  10. Android 示例之 notepad