android杀不死的Service
现在项目中要有一种流氓行为,保证服务在后台运行,但是又不能被用户杀死。
搜索了下,总结了下面几种方式:
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
更多相关文章
- 纸上得来终觉浅,绝知此事要躬行。Broadcast和Fragment详解
- Android:Android(安卓)6.0+权限适配--简单粗暴
- android开发之widget控件突然停止更新的原因
- 再谈android studio抽取字符串方法
- Android插件化原理解析——Hook机制之动态代理
- Android开发规范之编码规范
- Android(安卓)WebView使用
- 漫谈Android网络编程
- 2018-6月Android试题整理