ndfweb.cn

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


2021-05-05 11:32:57 (8520)



由於各種原因,在開發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中方式都逃不過小米、魅族手機的任務欄清理,原因需要進一步學習。


本文版权:http://www.ndfweb.cn/news-850.html
  NDF俱乐部
  国际域名注册
  建站咨询
简体中文 NDF网站建设淘宝店 | ICO图标在线生成 | 外贸网站建设 | 联系我们
©2007-2024 NDF Corporation 鲁ICP备08005967号 Sitemap - RSSRSS订阅