雖然Service被Killed後,通常系統會再重啓它,
但...萬一系統沒有這麼做呢?
我們是否有另外的方法可以保護自己的Service永生不滅?
有一個簡單方式,就是再建一個monitorService,
它的工作就是發現myService不見時,負責把myService再重啓,
如同[Android] 如何在開機後自動載入程式裡的做法,
有一個BootUpReceiverClass.java來接收開機時系統的訊息,
但其實它同時也可以接收Broadcast過來的訊息,
我們需要在AndroidManifest.xml增加一個intent-filter,
<receiver android:enabled="true" android:name="myTest.com.BootUpReceiverClass" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="myTest.com.BootUpReceiverClass" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>接下來,就是monitorService部份,
假設我們在monitorService裡建了一個monitorThread,
它負責檢查"myTest.com.myServiceClass"有沒有在執行,
如果沒有,就sendBroadcast()給"myTest.com.BootUpReceiverClass"
private boolean isMyServiceRunning(String className) {
try
{
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (className.equals(service.service.getClassName())) {
return true;
}
}
}catch (Exception e) {
e.printStackTrace();
}
return false;
}
private class monitorThread extends Thread {
@Override
public void run() {
super.run();
while(!isInterrupted()) {
try {
if(!isMyServiceRunning("myTest.com.myServiceClass"))
{
try
{
Intent intent = new Intent("myTest.com.BootUpReceiverClass");
if(intent!=null)
{
sendBroadcast(intent);
Thread.sleep(15000);
}
}catch (Exception e) {
e.printStackTrace();
}
}
else
{
Thread.sleep(3000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
那..如果monitorService也被kill掉了呢?所以,在myService裡也要一個類似的機制,
一直監視monitorService有沒有在執行,
如果不見了,就把它重啓,
程式碼是類似的,這邊就不貼了,
至於多久去檢查對方在不在呢?
經驗上,2~5秒應該都可以,
你可以去應用程式的執行中列表去看myService和monitorService是不是都在,
並且,試著關掉myService,看看會不會被重啓,
反過來,關掉monitorService,看看會不會被重啓...
那...如果monitorService和myService同時被killed呢?
人工去砍是很難成功的,
因為其中一個被關掉,立刻就會另一個重啓,
除非是系統才有辦法一次關二個,
這也表示,系統loading或記憶體真的無法負荷了,
就算myService仍然活著,也會卡卡的吧...
沒有留言:
張貼留言