Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中進程生命周期的優先級

Android中進程生命周期的優先級

編輯:關於Android編程

學習Android最好的途徑當然是強大的官方文檔了,其中在Processes and Threads一節中對於進程生命周期淘汰優先級,有著詳細的介紹。就不給大家轉帖了,直接放譯文吧,如下:

Android系統會盡量維持進程的存在,但畢竟資源有限,當系統資源告急的時候會淘汰一部分進程。淘汰順序的憑據就是系統進程的優先級了,優先級越高越不容易被殺死,反之亦然。系統總共為進程分了五個優先級,如下

一、前台進程(進程滿足如下任一條件即為前台進程):

1. 擁有 一個執行了onresume方法正在與用戶交互(獲得焦點)的Activity
2. 擁有一個service,這個Service跟正在與用戶交互的Activity進行了綁定
3. 擁有一個Service,這個Service調用了startForeground()方法
4. 擁有一個正在執行onCreate()、onStart()或者onDestroy()方法中的任意一個的Service
5. 擁有一個正在執行onReceive方法的BroadcastReceiver

二、可見進程:

1. 擁有一個執行了onPause方法,但仍然可見的Activity
2. 擁有一個Service,這個Service跟一個可見的或前台的Activity綁定了

三、服務進程:

擁有一個通過startService方法啟動的Service的進程

四、後台進程:

擁有一個後台Activity(onStop方法被調用)的進程

五、空進程:

沒有擁有任何活動的應用組件的進程,也就是沒有任何Service和Activity在運行

另外,還有一些需要補充的,當一個進程滿足多個進程條件時,當然是取優先級更高的為准,比如一個進程同時滿足前台進程和服務進程的條件,這個進程就是個前台進程,這點很好理解。另外,進程的優先級也不是一成不變的,而且有時候會隨著一些相關的因素而發生改變;比如,某進程A滿足前台進程的第二個條件,進程A擁有一個service,這個Service跟正在與用戶交互的Activity進行了綁定;當這個Activity變成可見狀態了,進程A便不再滿足前台進程的條件,進而因滿足可見進程的第二個條件,進程A變成了可見進程。總之,在掌握了基本概念之後,需要細心的分析具體的情況,方能得出正確的判斷。

進程優先級的額外說明

1. 系統會賦予進程盡可能高的優先級. 例如一個進程既包含已啟動的service, 也包含前台activity, 則這個進程會被視為前台進程.

2. 由於組件之間的依賴性, 進程的優先級有可能被提高. 假如進程A服務於進程B, 則進程A的優先級不能低於進程B. 比如, 進程A的ContentProvider組件正在服務於進程B的某個組件, 或者進程A的service組件和進程B的某個組件綁定等, 這些情況下, 進程A的優先級都不會低於進程B(如果按照優先級規則, 進程A的優先級確實低於進程B, 則系統會選擇提高進程A的優先級到和進程B相同).

3. 由於服務進程的優先級高於後台進程, 因此如果activity需要執行耗時操作, 最好還是啟動一個service來完成. 當然, 在activity中啟動子線程完成耗時操作也可以, 但是這樣做的缺點在於, 一旦activity不再可見, activity所在的進程成為後台進程, 而內存不足時後台進程隨時都有可能被系統殺死(但是啟動service完成耗時操作會帶來數據交互的問題, 比如耗時操作需要實時更新UI控件的狀態的話, service就不是一個好的選擇). 基於同樣的考慮, 在BroadcastReceiver中也不應該執行耗時操作, 而應該啟動service來完成(當然, BroadcastReceiver的生命周期過於短暫, 也決定了不能在其中執行耗時操作).

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved