如何保證Service在后台不被kill


 

如何保證Service在后台不被kill

相信很多Android開發者在面試過程中會經常被問到“如何保證Service在后台不被kill”這個問題,總結了下一些大神給的答案。

引用知乎Android Developer的一句話:強烈建議不要這么做,不僅僅從用戶角度考慮,作為Android開發者也有責任去維護Android的生態環境。現在很多Android開發工程師,主力機居然是iPhone而不是Android設備,感到相當悲哀。

資料來源:

http://www.zhihu.com/question/29826231

http://toutiao.com/i6244460144755737090/

 

1、Service設置成START_STICKY(onStartCommand方法中),kill 后會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣

2、通過 startForeground將進程設置為前台進程,做前台服務,優先級和前台應用一個級別​,除非在系統內存非常缺,否則此進程不會被 kill.具體實現方式為在service中創建一個notification,再調用void android.app.Service.startForeground(int id,Notificationnotification)方法運行在前台即可。

3、雙進程Service:讓2個進程互相保護,其中一個Service被清理后,另外沒被清理的進程可以立即重啟進程

4、AlarmManager不斷啟動service。該方式原理是通過定時警報來不斷啟動service,這樣就算service被殺死,也能再啟動。同時也可以監聽網絡切換、開鎖屏等廣播來啟動service。

參考實現方式如下:

Intent intent =new Intent(mContext, MyService.class);

PendingIntent sender=PendingIntent

.getService(mContext, 0, intent, 0);

AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);

alarm.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis,5*1000,sender);

該方式基本可以保證在正常運行情況下,以及任務欄移除歷史任務后(小米、魅族手機除外),service不被殺死。但是360等軟件管家依然可以殺死。另外還有不斷啟動的邏輯處理麻煩。

5、QQ黑科技:在應用退到后台后,另起一個只有 1 像素的頁面停留在桌面上,讓自己保持前台狀態,保護自己不被后台清理工具殺死

6、在已經root的設備下,修改相應的權限文件,將App偽裝成系統級的應用(Android4.0系列的一個漏洞,已經確認可行)

  • Android系統中當前進程(Process)fork出來的子進程,被系統認為是兩個不同的進程。當父進程被殺死的時候,子進程仍然可以存活,並不受影響。鑒於目前提到的在Android-Service層做雙守護都會失敗,我們可以fork出c進程,多進程守護。死循環在那檢查是否還存在,具體的思路如下(Android5.0以下可行)
  1. 用C編寫守護進程(即子進程),守護進程做的事情就是循環檢查目標進程是否存在,不存在則啟動它。
  2. 在NDK環境中將1中編寫的C代碼編譯打包成可執行文件(BUILD_EXECUTABLE)。
  3. 主進程啟動時將守護進程放入私有目錄下,賦予可執行權限,啟動它即可。

7、聯系廠商,加入白名單


免責聲明!

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



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