如何保證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被清理后,另外沒被清理的進程可以立即重啟進程
參考實現方式如下:
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以下可行)
- 用C編寫守護進程(即子進程),守護進程做的事情就是循環檢查目標進程是否存在,不存在則啟動它。
- 在NDK環境中將1中編寫的C代碼編譯打包成可執行文件(BUILD_EXECUTABLE)。
- 主進程啟動時將守護進程放入私有目錄下,賦予可執行權限,啟動它即可。
7、聯系廠商,加入白名單