保證Android后台不被殺死的幾種方法


由於各種原因,在開發Android應用時會提出保證自己有一個后台一直運行的需求,如何保證后台始終運行,不被系統因為內存低殺死,不被任務管理器殺死,不被軟件管家等軟件殺死等等還是一個比較困難的問題。網上也有各種方案,筆者經過自己試驗學習嘗試總結了3中還可以的方式,記錄如下。並不是絕對保證,不過確實提高了存活率不少。

方式一:service綁定通知欄成為前台服務

android中實現后台一般通過service方式,但系統本身會在內存低等情況下殺死service。通過將service綁定到notification,就成為了一個用戶可見的前台服務,這樣可以大大提高存活率。

Open Declaration具體實現方式為在service中創建一個notification,再調用void android.app. Service.startForeground(int id, Notification notification)方法運行在前台即可。
 
該方式基本可以保證在正常運行情況下,以及任務欄移除歷史任務后(小米、魅族手機除外),service不被殺死。但是360等軟件管家依然可以殺死。
 

方式二: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等軟件管家依然可以殺死。另外還有不斷啟動的邏輯處理麻煩。

 

方式三:通過jni調用,在c層啟動多進程

該方式主要通過底層啟動另外一個進程來實現。筆者猜測系統和三方軟件管家殺死應用進程是通過包名相關線程等來遍歷關閉。因此在c語言里啟動另一個進程可以躲過殺死的命運。

該方式思路是應用通過jni調用c,再c語言中啟動一個進程fork()。

該方式基本可以保證在正常運行情況下,以及任務欄移除歷史任務后(小米、魅族手機除外),service不被殺死。360等軟件管家也不會清理。但是帶來了jni交互,稍微有點麻煩。

 

以上3中方式都逃不過小米、魅族手機的任務欄清理,原因需要進一步學習。

 


免責聲明!

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



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