Android面試題:如何提升後臺進程存活率

  在Android系統中,應用進程中止運行每一位開發者均可能會面臨的問題,直接影響着用戶的體驗。那麼怎樣能提升後臺應用的存活率?尚學堂李老師爲你們總結了幾點緣由和應對方法:
  1.用戶主動退出; 2.Crash異常退出; 3.系統經過中止掉進程回收內存。
  其中,用戶主動退出是合理行爲;進程發生Crash後須要從新啓動應用(有些狀況會自動重啓)。系統經過中止掉應用進程回收內存,理論上也是合理的行爲。這裏咱們重點分析第三種狀況。
  咱們知道,Android有一個淘汰機制,即Android系統會根據應用的運行狀態設置一個進程的優先級,而後根據系統總體內存使用狀態進行調整,當內存佔用達到必定閾值時,就須要把一些優先級低的進程中止掉,以保證其餘進程可以有足夠的內存使用。網絡


  可是中止掉應用進程會對體驗有較大的影響。如再次打開應用耗時會更長(冷啓動),若是能從最大程序上提升應用進程的存活率,能夠提升熱啓動的機率,減小冷啓動的機率,讓用戶更快進入應用。因此提升應用進程的存活率是很是有意義的。
  應用進程優先級
  在Android系統中,應用進程的優先級(oom_adj值)分爲如下等級,不一樣定義的進程系統採用了不一樣的管理機制。oom_adj值從-17到16,oom_adj越大,進程優先級越低。
  常見的五個等級爲: 前臺進程(FOREGROUND_APP_ADJ=0); 可見進程(PERCEPTIBLE_APP_ADJ=2); 服務進程(SERVICE_ADJ=5); 後臺進程(CACHED_APP_ADJ=8); 空進程(HIDDEN_APP_MIN_ADJ=15)。
  當內存不足時,進程優先級低的(oom_adj越大的)、佔內存大的App進程將會被優先中止掉,系統進程的規則以下:
  1.進程優先級設置爲PERSISTENT_PROC_ADJ(-12)被中止機率要低。 2.進程優先級HEAVY_WEIGHT_APP_ADJ(4),這種是Activity僅次於主進程,系統認爲是高權重進程。 3.前臺進程FORGROUND_APP_ADJ(0),前臺進程,是指正在前臺運行的應用,被中止機率不大。 4.進程中沒有任何Activity存在會優先被中止。 5.空進程最容易被中止。
  提升進程優先級進程保活
  上述分析能夠,能夠提升進程優先級使應用在後臺的存活時間更長,通常使用如下幾種方法實現。
  1)網絡鏈接
  經過長鏈接心跳和進程保持通訊,使進程保持活動狀態,但若是系統內存很是緊張,也有可能被中止。
  2)利用系統現有機制
  通常能夠利用註冊系統消息(AlarmReceiver,RootReceiver等),經過系統消息響應掛起進程。
  3)利用SyncAdapter
  利用Android系統提供的帳號同步機制SyncAdapter,實現進程優先級提升。SyncAdapter是一個系統服務,經過系統的定時器更新應用程序數據ContentProvider,由於Sync服務工做在獨立進程,而且由操做系統調度,進程屬於核心進程級別,系統不會將其中止,而使用了SyncAdapter的進程優先級自己也會提升,從而下降應用進程被中止的機率。
  4)此外,下降應用內存開銷是減少進程被系統回收機率的一個很是有效的方法。
 ide

相關文章
相關標籤/搜索