Android中利用服务来守护进程
? ? ? ? 我們寫程序的時候,肯定會用到Service,而且還不止使用一個。當我們的程序中用到了Service的時候,說不定會被停掉。例如像360這樣的殺毒軟件可能會誤操作對我們的Service有威脅。那么我們就需要對我們的Service進行一個保護,也就是這里所說的守護。
? ? ? ? 那么問題就來了,要怎么守護呢?說到守護,當然不可能是自己守護自己,那么這里就必然會存在另一個進程,理論上用Context的向下轉(zhuǎn)型的類都是可以的,不過一般情況下我們只是用Service對Service進行一個守護,原因很簡單,我們不關(guān)心Service是否存在,因為它對于用戶是一個“暗地里”的東西。試想一下,如果我們利用Activity對Service進行一個守護,那么當Activity因為某種操作銷毀了,怎么辦?可能你要問,可不可以,我想是可以的。
? ? ? ? 這里如果我們要用A來守護B,那我們就可以會說如果A被停掉了,又該怎么辦。既然A可以守護B,B當然也是可以守護A的。
具體實現(xiàn)的關(guān)鍵代碼如下:
首先,重寫Service的onStartCommand方法,這里要注意不是onStart方法,因為在Android2.0以后,對于Service的開始方法,用的是onStartCommand,而onStart會在有onStartCommand的情況下,被忽視。
Thread thread = new Thread(new Runnable() {@Overridepublic void run() {Timer timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic 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是否還活著。實現(xiàn)如下:
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;}這里程序沒有寫測試線程的方法,不過我想難不到大家,筆者在這里偷了個懶。
如果你跟我一樣不想寫這一部分的代碼,你大可打開手機設(shè)置中的應(yīng)用程序功能,里面就有關(guān)于測試的方法。你可以選擇運行的程序頁,再選擇你現(xiàn)在的程序,會看到程序的進程和服務(wù)個數(shù)以及具體情況,點進去,會看到你程序中所開啟的服務(wù)和進行,有一個停止按鈕,點擊停止,如果你的程序可以用,那么在停止一兩秒之后,服務(wù)又會被開啟的。
右側(cè)是本博文工程連接:http://download.csdn.net/detail/u013761665/8061695
總結(jié)
以上是生活随笔為你收集整理的Android中利用服务来守护进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中绘制圆形和圆角图片
- 下一篇: 关于Android中Service的手动