标签:
2013年11月6日作者:cstriker1407
有时候我们希望我们程序中的Service不被杀死,即使杀死也能自动重启。下面简单的备忘下一种思路。
github:
【 https://github.com/cstriker1407/android/tree/master/UnkillService 】
Contents [hide]
1)经过测试,QQ安全管家和android系统附带的进程工具无法杀死我们的Service,但是360可以完全杀死。
2)本思路的核心思想是启用一个AlarmManager,通过AlarmManager定时启动来实现android的Service不被杀死。
3)Service运行在独立的进程中。
| publicclassTargetService extendsService | 
| { | 
|     privatestaticfinalString tag = "TargetService";  | 
|     @Override | 
|     publicIBinder onBind(Intent arg0) | 
|     { | 
|         returnnull; | 
|     }   | 
|     @Override | 
|     publicvoidonCreate() | 
|     { | 
|         Log.e(tag, "onCreate callded"); | 
|         AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); | 
|         //包装需要执行Service的Intent | 
|         Intent intent = newIntent(this, this.getClass()); | 
|         PendingIntent pendingIntent = PendingIntent.getService(this, 0, | 
|                 intent, PendingIntent.FLAG_UPDATE_CURRENT); | 
|         //触发服务的起始时间 | 
|         longtriggerAtTime = SystemClock.elapsedRealtime(); | 
|         //使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service | 
|         manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime, 3* 1000, pendingIntent); | 
|         super.onCreate(); | 
|     } | 
|     @Override | 
|     publicintonStartCommand(Intent intent, intflags, intstartId) | 
|     { | 
|         Log.e(tag, "onStartCommand called"); | 
|         returnSTART_STICKY; | 
|     } | 
|     @Override | 
|     publicvoidonDestroy() | 
|     { | 
|         Log.e(tag, "onDestroy callded"); | 
|         super.onDestroy(); | 
|     } | 
| } | 
| <service | 
|     android:name="TargetService" | 
|     android:process=":remotetargetservice"> | 
| </service> | 
android:process前面增加:,表明它运行在自己的进程里,需要通过【 AIDL 】来进行通讯。
| public class BootReceiver extends BroadcastReceiver | 
| { | 
|     @Override | 
|     public void onReceive(Context context, Intent intent) | 
|     { | 
|         context.startService(new Intent(context, TargetService.class)); | 
|     } | 
| } | 
| <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的自动启动有很多讨论,另外有篇文章可以【 参考 】。
标签:
原文地址:http://my.oschina.net/janson2013/blog/420741