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