關於android service 重啟


  現在有這樣的需求,防止自己的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后一定能重啟。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM