android 進(jìn)程相關(guān)

現(xiàn)在android采用多進(jìn)程來執(zhí)行多模塊任務(wù),的確是一種流行,大廠的 app 哪個(gè)不是一堆進(jìn)程,再簡單一些,推送哪個(gè)不是采用單進(jìn)程模式的。

進(jìn)程

我們都知道Android系統(tǒng)是基于Linux改造而來的,進(jìn)程系統(tǒng)也是一脈相承,進(jìn)程,其實(shí)就是程序的具體實(shí)現(xiàn)。當(dāng)程序第一次啟動(dòng),Android會(huì)啟動(dòng)一個(gè)Linux進(jìn)程(具體由Zygote fork出來)以及一個(gè)主線程,默認(rèn)的情況下,所有組件都將運(yùn)行在該進(jìn)程內(nèi)。同一個(gè)應(yīng)用由系統(tǒng)分配一個(gè)獨(dú)立的Linux賬戶,該應(yīng)用的產(chǎn)生的所有進(jìn)程,都會(huì)是這同一個(gè)Linux賬戶。

進(jìn)程分類

android 里的進(jìn)程分5種,基于:android 中文站 API

  1. 前臺(tái)進(jìn)程
    用戶當(dāng)前操作所必需的進(jìn)程。如果一個(gè)進(jìn)程滿足以下任一條件,即視為前臺(tái)進(jìn)程:
  • 托管用戶正在交互的 Activity(已調(diào)用 Activity 的 onResume() 方法)
  • 托管某個(gè) Service,后者綁定到用戶正在交互的 Activity
  • 托管正在“前臺(tái)”運(yùn)行的 Service(服務(wù)已調(diào)用 startForeground())
  • 托管正執(zhí)行一個(gè)生命周期回調(diào)的 Service(onCreate()、onStart() 或 onDestroy())
  • 托管正執(zhí)行其 onReceive() 方法的 BroadcastReceiver

通常,在任意給定時(shí)間前臺(tái)進(jìn)程都為數(shù)不多。只有在內(nèi)存不足以支持它們同時(shí)繼續(xù)運(yùn)行這一萬不得已的情況下,系統(tǒng)才會(huì)終止它們。 此時(shí),設(shè)備往往已達(dá)到內(nèi)存分頁狀態(tài),因此需要終止一些前臺(tái)進(jìn)程來確保用戶界面正常響應(yīng)。
這就需要依靠系統(tǒng)的資源。

  1. 可見進(jìn)程
    沒有任何前臺(tái)組件、但仍會(huì)影響用戶在屏幕上所見內(nèi)容的進(jìn)程。 如果一個(gè)進(jìn)程滿足以下任一條件,即視為可見進(jìn)程:
  • 托管不在前臺(tái)、但仍對(duì)用戶可見的 Activity(已調(diào)用其 onPause() 方法)。例如,如果前臺(tái) Activity 啟動(dòng)了一個(gè)對(duì)話框,允許在其后顯示上一 Activity,則有可能會(huì)發(fā)生這種情況。
    托管綁定到可見(或前臺(tái))Activity 的 Service。

  • 可見進(jìn)程被視為是極其重要的進(jìn)程,除非為了維持所有前臺(tái)進(jìn)程同時(shí)運(yùn)行而必須終止,否則系統(tǒng)不會(huì)終止這些進(jìn)程。

  1. 服務(wù)進(jìn)程
    正在運(yùn)行已使用 startService() 方法啟動(dòng)的服務(wù)且不屬于上述兩個(gè)更高類別進(jìn)程的進(jìn)程。盡管服務(wù)進(jìn)程與用戶所見內(nèi)容沒有直接關(guān)聯(lián),但是它們通常在執(zhí)行一些用戶關(guān)心的操作(例如,在后臺(tái)播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))。因此,除非內(nèi)存不足以維持所有前臺(tái)進(jìn)程和可見進(jìn)程同時(shí)運(yùn)行,否則系統(tǒng)會(huì)讓服務(wù)進(jìn)程保持運(yùn)行狀態(tài)。

  2. 后臺(tái)進(jìn)程
    包含目前對(duì)用戶不可見的 Activity 的進(jìn)程(已調(diào)用 Activity 的 onStop() 方法)。這些進(jìn)程對(duì)用戶體驗(yàn)沒有直接影響,系統(tǒng)可能隨時(shí)終止它們,以回收內(nèi)存供前臺(tái)進(jìn)程、可見進(jìn)程或服務(wù)進(jìn)程使用。 通常會(huì)有很多后臺(tái)進(jìn)程在運(yùn)行,因此它們會(huì)保存在 LRU (最近最少使用)列表中,以確保包含用戶最近查看的 Activity 的進(jìn)程最后一個(gè)被終止。如果某個(gè) Activity 正確實(shí)現(xiàn)了生命周期方法,并保存了其當(dāng)前狀態(tài),則終止其進(jìn)程不會(huì)對(duì)用戶體驗(yàn)產(chǎn)生明顯影響,因?yàn)楫?dāng)用戶導(dǎo)航回該 Activity 時(shí),Activity 會(huì)恢復(fù)其所有可見狀態(tài)。 有關(guān)保存和恢復(fù)狀態(tài)的信息,請(qǐng)參閱 Activity文檔。

  3. 空進(jìn)程
    不含任何活動(dòng)應(yīng)用組件的進(jìn)程。保留這種進(jìn)程的的唯一目的是用作緩存,以縮短下次在其中運(yùn)行組件所需的啟動(dòng)時(shí)間。 為使總體系統(tǒng)資源在進(jìn)程緩存和底層內(nèi)核緩存之間保持平衡,系統(tǒng)往往會(huì)終止這些進(jìn)程。

根據(jù)進(jìn)程中當(dāng)前活動(dòng)組件的重要程度,Android 會(huì)將進(jìn)程評(píng)定為它可能達(dá)到的最高級(jí)別。例如,如果某進(jìn)程托管著服務(wù)和可見 Activity,則會(huì)將此進(jìn)程評(píng)定為可見進(jìn)程,而不是服務(wù)進(jìn)程。

此外,一個(gè)進(jìn)程的級(jí)別可能會(huì)因其他進(jìn)程對(duì)它的依賴而有所提高,即服務(wù)于另一進(jìn)程的進(jìn)程其級(jí)別永遠(yuǎn)不會(huì)低于其所服務(wù)的進(jìn)程。 例如,如果進(jìn)程 A 中的內(nèi)容提供程序?yàn)檫M(jìn)程 B 中的客戶端提供服務(wù),或者如果進(jìn)程 A 中的服務(wù)綁定到進(jìn)程 B 中的組件,則進(jìn)程 A 始終被視為至少與進(jìn)程 B 同樣重要。

由于運(yùn)行服務(wù)的進(jìn)程其級(jí)別高于托管后臺(tái) Activity 的進(jìn)程,因此啟動(dòng)長時(shí)間運(yùn)行操作的 Activity 最好為該操作啟動(dòng)服務(wù),而不是簡單地創(chuàng)建工作線程,當(dāng)操作有可能比 Activity 更加持久時(shí)尤要如此。例如,正在將圖片上傳到網(wǎng)站的 Activity 應(yīng)該啟動(dòng)服務(wù)來執(zhí)行上傳,這樣一來,即使用戶退出 Activity,仍可在后臺(tái)繼續(xù)執(zhí)行上傳操作。使用服務(wù)可以保證,無論 Activity 發(fā)生什么情況,該操作至少具備“服務(wù)進(jìn)程”優(yōu)先級(jí)。 同理,廣播接收器也應(yīng)使用服務(wù),而不是簡單地將耗時(shí)冗長的操作放入線程中。

現(xiàn)實(shí)如何呢?

上面的5種分類是理論上的總結(jié),在真是執(zhí)行時(shí)要復(fù)雜的多,比如在 activity 開線程放音樂和開 service 放音樂在點(diǎn)擊返回鍵后,按照上述理論分類應(yīng)該是前者算是后臺(tái)進(jìn)程,后者算是服務(wù)進(jìn)程,但其實(shí)2者都是后臺(tái)進(jìn)程都是容易被系統(tǒng) kill 回收的,為啥啊,因?yàn)槲覀凕c(diǎn)擊 home 或是 back 退出時(shí)會(huì)對(duì)進(jìn)程的ADJ值進(jìn)行重新計(jì)算,除非你是開啟的前臺(tái)進(jìn)程,雖有出入,但是總體上還是按照上面的理論情況執(zhí)行的。

具體的看 Android多進(jìn)程使用場景

在上面這品文章中還分析了5種activity/service/多進(jìn)程執(zhí)行各自的進(jìn)程優(yōu)先級(jí),非常推薦

參考資料:

Spiny:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,296評(píng)論 25 708
  • 為了面試,為了高工資,廢話不多說,不定期更新。 1. Activity正常和異常情況下的生命周期分析。 Activ...
    24K男閱讀 853評(píng)論 0 0
  • 轉(zhuǎn)自:https://developer.android.com/guide/components/process...
    畫峰閱讀 218評(píng)論 0 0
  • [cp]偶然,聽到電臺(tái)[微風(fēng)]已是深夜,深夜似乎是萬物休息的時(shí)間,可總有一些人在這時(shí)候有著自己的一些小情緒[音樂]...
    頁生活閱讀 125評(píng)論 0 0
  • 十五歲,在迷茫 我一直認(rèn)為我不同于同齡的孩子,我說實(shí)話,我有些早熟。我仿佛,與他們有著太多的隔閡。我是一名標(biāo)準(zhǔn)的0...
    喬棲Jon閱讀 721評(píng)論 0 0