有时候我们希望我们程序中的Service不被杀死,即使杀死也能自动重启。下面简单的备忘下一种思路。
github:
【 https://github.com/cstriker1407/android/tree/master/UnkillService 】
CONTENTS
这次先备注下思路:
1)经过测试,QQ安全管家和android系统附带的进程工具无法杀死我们的Service,但是360可以完全杀死。
2)本思路的核心思想是启用一个AlarmManager,通过AlarmManager定时启动来实现android的Service不被杀死。
3)Service运行在独立的进程中。
Service代码:
public class TargetService extends Service { private static final String tag = "TargetService"; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { Log.e(tag, "onCreate callded"); AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); //包装需要执行Service的Intent Intent intent = new Intent(this, this.getClass()); PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //触发服务的起始时间 long triggerAtTime = SystemClock.elapsedRealtime(); //使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime, 3 * 1000, pendingIntent); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(tag, "onStartCommand called"); return START_STICKY; } @Override public void onDestroy() { Log.e(tag, "onDestroy callded"); super.onDestroy(); } }
XML文件:
<service android:name="TargetService" android:process=":remotetargetservice" > </service>
android:process前面增加:,表明它运行在自己的进程里,需要通过【 AIDL 】来进行通讯。
开机自动启动Service:
public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.startService(new Intent(context, TargetService.class)); } }
XML代码:
<receiver android:name="BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </receiver>
备注:
1)关于Service的自动启动有很多讨论,另外有篇文章可以【 参考 】。
发表评论