Android中利用服務來守護程序
阿新 • • 發佈:2019-02-17
我們寫程式的時候,肯定會用到Service,而且還不止使用一個。當我們的程式中用到了Service的時候,說不定會被停掉。例如像360這樣的防毒軟體可能會誤操作對我們的Service有威脅。那麼我們就需要對我們的Service進行一個保護,也就是這裡所說的守護。
那麼問題就來了,要怎麼守護呢?說到守護,當然不可能是自己守護自己,那麼這裡就必然會存在另一個程序,理論上用Context的向下轉型的類都是可以的,不過一般情況下我們只是用Service對Service進行一個守護,原因很簡單,我們不關心Service是否存在,因為它對於使用者是一個“暗地裡”的東西。試想一下,如果我們利用Activity對Service進行一個守護,那麼當Activity因為某種操作銷燬了,怎麼辦?可能你要問,可不可以,我想是可以的。
這裡如果我們要用A來守護B,那我們就可以會說如果A被停掉了,又該怎麼辦。既然A可以守護B,B當然也是可以守護A的。
具體實現的關鍵程式碼如下:
首先,重寫Service的onStartCommand方法,這裡要注意不是onStart方法,因為在Android2.0以後,對於Service的開始方法,用的是onStartCommand,而onStart會在有onStartCommand的情況下,被忽視。
接下來就通過一個子執行緒來實時檢測我們Service是否死掉了,如果發現我們所檢測的Service死了,則進行重啟。@Override public int onStartCommand(Intent intent, int flags, int startId) { thread.start(); return START_STICKY; }
大家可以看到上面有一個isServiceWorked方法,顧名思義,這個方法就是用來檢測所守護的Service是否還活著。實現如下:Thread thread = new Thread(new Runnable() { @Override public void run() { Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { boolean b = MainActivity.isServiceWorked(ServiceOne.this, "com.example.servicedemo.ServiceTwo"); if(!b) { Intent service = new Intent(ServiceOne.this, ServiceTwo.class); startService(service); } } }; timer.schedule(task, 0, 1000); } });
public static boolean isServiceWorked(Context context, String serviceName) {
ActivityManager myManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ArrayList<RunningServiceInfo> runningService = (ArrayList<RunningServiceInfo>) myManager.getRunningServices(Integer.MAX_VALUE);
for (int i = 0; i < runningService.size(); i++) {
if (runningService.get(i).service.getClassName().toString().equals(serviceName)) {
return true;
}
}
return false;
}
這裡程式沒有寫測試執行緒的方法,不過我想難不到大家,筆者在這裡偷了個懶。如果你跟我一樣不想寫這一部分的程式碼,你大可開啟手機設定中的應用程式功能,裡面就有關於測試的方法。你可以選擇執行的程式頁,再選擇你現在的程式,會看到程式的程序和服務個數以及具體情況,點進去,會看到你程式中所開啟的服務和進行,有一個停止按鈕,點選停止,如果你的程式可以用,那麼在停止一兩秒之後,服務又會被開啟的。