Android服務重啓

如何讓自己的服務重啓一直讓本人頭疼,儘自己所能還是無法克服,原因是使用小米手機做測試,卻沒留意小米的“自啓動管理”,發現自己的應用沒有添加到列表中,結束進程無法復活,允許後就變得生猛活虎。


原文轉自:http://blog.csdn.net/guijiaoba/article/details/12911633

現在有這樣的需求,防止自己的app被其他的應用程序(比如qq手機管家)殺死,該怎麼實現呢。我們知道app都是運行在進程中的,android是怎樣管理這些進程的呢。要想app不被殺死,只要做到進程不被結束就解決了問題。但是不幸的是,第三方app很容易利用系統的api(比如killBackProgress())輕易殺死其他進程。那該怎麼辦呢?


   目前有這樣的解決方案。在本進程被其他應用程序殺死後,就立即重啓,這樣就可以間接防止進程被結束(其實已結束了,只重新開啓)。至今爲止,還未知道怎樣完全防止第三方結束本進程,正在尋找中。。。。。。。。。。。。。


   現在問題又來了,自己的應用怎麼知道什麼時候被殺死了,殺死之後又怎麼重啓呢?答案是,無法知道,自己也無法重啓。幸好android提供了service,android規範中指出進駐有service的進程的優先級別很高,除非是本應用自己調用stopService結束服務,否則即使第三方應用殺死該進程,而後進程也會自己重啓(服務也重啓)


   所以說,要想進程被殺死後能自動重啓,那麼只需要在該進程中開啓某個服務就可以了。


補充:


1、通過 設定-》應用程序-》運行  結束某個進程或服務,這樣進程或服務不會重啓。


2、如果採用bindService()方法啓動服務,那麼在 設定-》應用程序-》運行是看不到此項服務信息的。這樣的服務也可被”qq手機管家“永遠殺死,不在重啓。


 


結論:無法防止其他應用程序殺死自己進程或服務(系統自帶的服務管理外),但是可以在殺死後重啓。


 


另外,可以設置service屬性:
 


每次調用startService(Intent)的時候,都會調用該Service對象的onStartCommand(Intent,int,int)方法,這個方法return 一個int值,return 的值有四種:
 
START_STICKY:如果service進程被kill掉,保留service的狀態爲開始狀態,但不保留遞送的intent對象。隨後系統會嘗試重新創建service,由於服務狀態爲開始狀態,所以創建服務後一定會調用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啓動命令被傳遞到service,那麼參數Intent將爲null。
 
START_NOT_STICKY:“非粘性的”。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統不會自動重啓該服務。
 
START_REDELIVER_INTENT:重傳Intent。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統會自動重啓該服務,並將Intent的值傳入。
 
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保證服務被kill後一定能重啓。




另外我使用的是小米手機,小米自帶一個一鍵清理的功能,大部分服務都是不能重啓,可能是這個它的清理功能具有的權限是很高的,可以直接強制結束你的應用,但還發現還有個別應用能夠重啓,比如微信什麼的。
google,百度很長時間都沒有實現,後來發現小米手機有個“自啓動管理”,發現裏面有個微信的名字,然後我把我的應用添加到裏面,發現一鍵清理後,我的應用可以重啓服務了,結論:小米的一件清理雖然比較犀利,但是人家提供一個黑白名單的功能,然用戶選擇性的讓應用自啓動。

發佈了33 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章