1 四大組件的進程
- 默認情況下,同一應(yīng)用的所有組件均在相同的進程中運行掠手,且大多數(shù)應(yīng)用都不會改變這一點柳恐。
- 但是伐脖,如果您發(fā)現(xiàn)需要控制某個組件所屬的進程热幔,則可在清單文件中執(zhí)行此操作。
2 開啟多進程
對于一個Application來講晓殊,系統(tǒng)會默認分配一個進程断凶,但是這個屬性可以在清單文件中通過android:process*屬性進行配置,另外這個屬性同樣適用于activity巫俺、service认烁、receiver和 provider,下面舉例說明:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:process="application process"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:process="activity process">
</intent-filter>
</activity>
</application>
3 進程的分類
3.1 前臺進程
- 用戶當前操作所必需的進程介汹。如果一個進程滿足以下任一條件却嗡,即視為前臺進程:
- 1.托管用戶正在交互的 Activity(已調(diào)用 Activity 的 onResume() 方法)
- 2.托管某個 Service,后者綁定到用戶正在交互的 Activity
- 3.托管正在“前臺”運行的 Service(服務(wù)已調(diào)用 startForeground())
- 4.托管正執(zhí)行一個生命周期回調(diào)的 Service(onCreate()嘹承、onStart() 或 onDestroy())
- 5.托管正執(zhí)行其 onReceive() 方法的 BroadcastReceiver
3.2 可見進程
- 沒有任何前臺組件窗价、但仍會影響用戶在屏幕上所見內(nèi)容的進程。
- 如果一個進程滿足以下任一條件叹卷,即視為可見進程:
- 1.托管綁定到可見(或前臺)Activity 的 Service撼港。
- 2.托管綁定到可見(或前臺)Activity 的 Service。
托管不在前臺骤竹、但仍對用戶可見的 Activity(已調(diào)用其 onPause() 方法)帝牡。例如,如果前臺 Activity 啟動了一個對話框蒙揣,允許在其后顯示上一 Activity靶溜,則有可能會發(fā)生這種情況。
3.3 服務(wù)進程
- 正在運行已使用 startService() 方法啟動的服務(wù)且不屬于上述兩個更高類別進程的進程懒震。
- 盡管服務(wù)進程與用戶所見內(nèi)容沒有直接關(guān)聯(lián)罩息,但是它們通常在執(zhí)行一些用戶關(guān)心的操作(例如,在后臺播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))个扰。
3.4 后臺進程
- 包含目前對用戶不可見的 Activity 的進程(已調(diào)用 Activity 的 onStop() 方法)瓷炮。
- 通常會有很多后臺進程在運行,因此它們會保存在 LRU (最近最少使用)列表中锨匆,以確保包含用戶最近查看的 Activity 的進程最后一個被終止崭别。
- 如果某個 Activity 正確實現(xiàn)了生命周期方法,并保存了其當前狀態(tài)恐锣,則終止其進程不會對用戶體驗產(chǎn)生明顯影響,因為當用戶導航回該 Activity 時舞痰,Activity 會恢復(fù)其所有可見狀態(tài)土榴。 有關(guān)保存和恢復(fù)狀態(tài)的信息。
3.5 空進程
- 不含任何活動應(yīng)用組件的進程响牛。
- 保留這種進程的的唯一目的是用作緩存玷禽,以縮短下次在其中運行組件所需的啟動時間赫段。
4 進程生命周期
- Android 系統(tǒng)將盡量長時間地保持應(yīng)用進程,但為了新建進程或運行更重要的進程矢赁,最終需要移除舊進程來回收內(nèi)存糯笙。
- 系統(tǒng)會首先消除重要性最低的進程,然后是重要性略遜的進程撩银,依此類推给涕,以回收系統(tǒng)資源。
- 前臺進程:通常额获,在任意給定時間前臺進程都為數(shù)不多够庙。只有在內(nèi)存不足以支持它們同時繼續(xù)運行這一萬不得已的情況下,系統(tǒng)才會終止它們抄邀。 此時耘眨,設(shè)備往往已達到內(nèi)存分頁狀態(tài),因此需要終止一些前臺進程來確保用戶界面正常響應(yīng)境肾。
- 可見進程:可見進程被視為是極其重要的進程剔难,除非為了維持所有前臺進程同時運行而必須終止,否則系統(tǒng)不會終止這些進程奥喻。
- 服務(wù)進程:除非內(nèi)存不足以維持所有前臺進程和可見進程同時運行偶宫,否則系統(tǒng)會讓服務(wù)進程保持運行狀態(tài)。
- 后臺進程:這些進程對用戶體驗沒有直接影響衫嵌,系統(tǒng)可能隨時終止它們读宙,以回收內(nèi)存供前臺進程、可見進程或服務(wù)進程使用
- 空進程:為使總體系統(tǒng)資源在進程緩存和底層內(nèi)核緩存之間保持平衡楔绞,系統(tǒng)往往會終止這些進程结闸。
4 提高進程優(yōu)先級
- 1.根據(jù)進程中當前活動組件的重要程度,Android 會將進程評定為它可能達到的最高級別酒朵。例如桦锄,如果某進程托管著服務(wù)和可見 Activity,則會將此進程評定為可見進程蔫耽,而不是服務(wù)進程结耀。
- 2.一個進程的級別可能會因其他進程對它的依賴而有所提高,即服務(wù)于另一進程的進程其級別永遠不會低于其所服務(wù)的進程匙铡。 例如图甜,如果進程 A 中的內(nèi)容提供程序為進程 B 中的客戶端提供服務(wù),或者如果進程 A 中的服務(wù)綁定到進程 B 中的組件鳖眼,則進程 A 始終被視為至少與進程 B 同樣重要黑毅。
提升進程優(yōu)先級的方法大致有以下2種:
4.1 設(shè)置進程優(yōu)先級
- 對于Service被系統(tǒng)回收,一般做法是通過提高優(yōu)先級可以解決钦讳,有以下幾種做法:
- 在AndroidManifest.xml文件中對于intent-filter可以通過android:priority = “1000”這個屬性設(shè)置最高優(yōu)先級矿瘦,1000是最高值枕面,如果數(shù)字越小則優(yōu)先級越低。
- Android中的進程是托管的缚去,當系統(tǒng)進程空間緊張的時候潮秘,會依照優(yōu)先級自動進行進程的回收, 設(shè)置setForeground(true) 來設(shè)置 Service 的優(yōu)先級易结。
4.2 雙進程守護
APP中同時開啟兩個Service衰倦,分別是A和B款咖,那么: 如果A守護B辐宾,則B掛掉的同時刁笙,A就應(yīng)該把B啟動起來,反之亦然滋尉,也就是說A和B應(yīng)該是互相守護玉控,無論誰被殺掉,對方就把它拉起來狮惜。