1. 程式人生 > >Android中利用服務來守護程序

Android中利用服務來守護程序

        我們寫程式的時候,肯定會用到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的情況下,被忽視。

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        thread.start();
        return START_STICKY;
    }
接下來就通過一個子執行緒來實時檢測我們Service是否死掉了,如果發現我們所檢測的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);
        }
    });
大家可以看到上面有一個isServiceWorked方法,顧名思義,這個方法就是用來檢測所守護的Service是否還活著。實現如下:
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;
    }
這裡程式沒有寫測試執行緒的方法,不過我想難不到大家,筆者在這裡偷了個懶。
如果你跟我一樣不想寫這一部分的程式碼,你大可開啟手機設定中的應用程式功能,裡面就有關於測試的方法。你可以選擇執行的程式頁,再選擇你現在的程式,會看到程式的程序和服務個數以及具體情況,點進去,會看到你程式中所開啟的服務和進行,有一個停止按鈕,點選停止,如果你的程式可以用,那麼在停止一兩秒之後,服務又會被開啟的。