什麼是Android程序保活?程序保活的目的是什麼?其實就一句話:“當然都希望自己APP的程序盡量的不被殺死”;
1)程序的劃分與優先級
1.1. 前台程序 —— Foreground process
使用者目前操作所必需的程序。通常在任意給定時間前台程序都為數不多。隻有在記憶體不足以支援它們同時繼續運作這一萬不得已的情況下,系統才會終止它們。
A. 擁有使用者正在互動的 Activity(已調用 onResume())
B. 擁有某個 Service,後者綁定到使用者正在互動的 Activity
C. 擁有正在“前台”運作的 Service(服務已調用 startForeground())
D. 擁有正執行一個生命周期回調的 Service(onCreate()、onStart() 或 onDestroy())
E. 擁有正執行其 onReceive() 方法的 BroadcastReceiver
1.2. 可見程序 —— Visible process
沒有任何前台元件、但仍會影響使用者在螢幕上所見内容的程序。可見程序被視為是極其重要的程序,除非為了維持所有前台程序同時運作而必須終止,否則系統不會終止這些程序。
A. 擁有不在前台、但仍對使用者可見的 Activity(已調用 onPause())。
B. 擁有綁定到可見(或前台)Activity 的 Service
1.3. 服務程序 —— Service process
盡管服務程序與使用者所見内容沒有直接關聯,但是它們通常在執行一些使用者關心的操作(例如,在背景播放音樂或從網絡下載下傳資料)。是以,除非記憶體不足以維持所有前台程序和可見程序同時運作,
否則系統會讓服務程序保持運作狀态。
正在運作 startService() 方法啟動的服務,且不屬于上述兩個更高類别程序的程序。
1.4. 背景程序 —— Background process
背景程序對使用者體驗沒有直接影響,系統可能随時終止它們,以回收記憶體供前台程序、可見程序或服務程序使用。 通常會有很多背景程序在運作,是以它們會儲存在 LRU 清單中,
以確定包含使用者最近檢視的 Activity 的程序最後一個被終止。如果某個 Activity 正确實作了生命周期方法,并儲存了其目前狀态,則終止其程序不會對使用者體驗産生明顯影響,
因為當使用者導航回該 Activity 時,Activity 會恢複其所有可見狀态。
對使用者不可見的 Activity 的程序(已調用 Activity的onStop() 方法)
1.5. 空程序 —— Empty process
保留這種程序的的唯一目的是用作緩存,以縮短下次在其中運作元件所需的啟動時間。 為使總體系統資源在程序緩存和底層核心緩存之間保持平衡,系統往往會終止這些程序。
2)程序的回收政策與adj級别
3)程序保活解決方案
3.1. 利用 Activity 提升權限
監控手機鎖屏解鎖事件,在螢幕鎖屏時啟動1個像素的 Activity,在使用者解鎖時将 Activity 銷毀掉。注意該 Activity 需設計成使用者無感覺。通過該方案,可以使程序的優先級在螢幕鎖屏時間由4提升為最高優先級1。
适用場景: 本方案主要解決第三方應用及系統管理工具在檢測到鎖屏事件後一段時間(一般為5分鐘以内)内會殺死背景程序,已達到省電的目的問題。
檢視實作: http://blog.csdn.net/u013263323/article/details/56285475
3.2. 利用 Notification 提升權限
Android 中 Service 的優先級為4,通過 setForeground 接口可以将背景 Service 設定為前台 Service,使程序的優先級由4提升為2,進而使程序的優先級僅僅低于使用者目前正在互動的程序,與可見程序優先級一緻,使程序被殺死的機率大大降低。
檢視實作: http://blog.csdn.net/u013263323/article/details/56285475
3.3. 程序死後拉活的方案
3.3.1.利用系統廣播拉活
1) 廣播接收器被管理軟體、系統軟體通過“自啟管理”等功能禁用的場景無法接收到廣播,進而無法自啟。
2) 系統廣播事件不可控,隻能保證發生事件時拉活程序,但無法保證程序挂掉後立即拉活。
是以,該方案主要作為備用手段。
3.3.2利用系統Service機制拉活
3.4. JobSheduler拉活
Android5.0 以後系統對 Native 程序等加強了管理,Native 拉活方式失效。系統在 Android5.0 以上版本提供了 JobScheduler 接口,系統會定時調用該程序以使應用進行一些邏輯操作。
JobSheduler是作為程序死後複活的一種手段,native程序方式最大缺點是費電, Native 程序費電的原因是感覺主程序是否存活有兩種實作方式,在 Native 程序中通過死循環或定時器,輪訓判斷主程序是否存活,當主程序不存活時進行拉活。其次5.0以上系統不支援。 但是JobSheduler可以替代在Android5.0以上native程序方式,這種方式即使使用者強制關閉,也能被拉起來。
方案适用範圍
該方案主要适用于 Android5.0 以上版本手機。
該方案在 Android5.0 以上版本中不受 forcestop 影響,被強制停止的應用依然可以被拉活,在 Android5.0 以上版本拉活效果非常好。
僅在小米手機可能會出現有時無法拉活的問題。
檢視實作:http://blog.csdn.net/u013263323/article/details/56285475
覺得好的,點個贊吧