标签:
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运行在独立的进程中。
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(); |
} |
} |
< 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