Android中的進(jìn)程與線程

一、簡(jiǎn)介

應(yīng)用啟動(dòng)時(shí),Android 系統(tǒng)會(huì)為應(yīng)用啟動(dòng)新的 Linux 進(jìn)程。默認(rèn)情況下,同一應(yīng)用的所有組件在相同的進(jìn)程和線程(稱為“主”線程)中運(yùn)行。 但是,也可以設(shè)置應(yīng)用中的其他組件在單獨(dú)的進(jìn)程中運(yùn)行,并為任何進(jìn)程創(chuàng)建額外的線程。

二、進(jìn)程

2.1設(shè)置組件的進(jìn)程

AndroidManifest文件中的<activity>、<service>、<receiver> 和 <provider>標(biāo)簽均支持android:process 屬性,此屬性可以指定該組件應(yīng)在哪個(gè)進(jìn)程運(yùn)行。
注意:對(duì)于不同應(yīng)用的組件,還可以設(shè)置相同的android:process,使其在同一進(jìn)程中運(yùn)行,但前提是這些應(yīng)用共享相同的UserId并且具有相同的簽名。

2.2 進(jìn)程的重要性等級(jí)

當(dāng)Android系統(tǒng)回收內(nèi)存時(shí),會(huì)根據(jù)進(jìn)程的重要性順序回收。Android系統(tǒng)對(duì)進(jìn)程的重要性有五個(gè)級(jí)別,分別是前臺(tái)進(jìn)程、可見進(jìn)程、服務(wù)進(jìn)程、后臺(tái)進(jìn)程、空進(jìn)程。系統(tǒng)會(huì)根據(jù)進(jìn)程中正在運(yùn)行的組件以及這些組件的狀態(tài),將每個(gè)進(jìn)程放入“重要性層次結(jié)構(gòu)”中。

  • 前臺(tái)進(jìn)程
    進(jìn)程中有正在與用戶交互的Activity(已調(diào)用 Activity 的 onResume() 方法)
    進(jìn)程中有和前臺(tái)Activity綁定的Service
    進(jìn)程中有前臺(tái)Service(服務(wù)已調(diào)用 startForeground())
    進(jìn)程中正執(zhí)行Service的生命周期方法(onCreate,onStart,onDestroy)
    進(jìn)程中有正執(zhí)行其 onReceive() 方法的 BroadcastReceiver

  • 可見進(jìn)程
    托管不在前臺(tái)、但仍對(duì)用戶可見的 Activity(已調(diào)用其 onPause() 方法)。
    托管綁定到可見(或前臺(tái))Activity 的 Service

  • 服務(wù)進(jìn)程
    正在運(yùn)行已使用 startService() 方法啟動(dòng)的服務(wù)且不屬于上述兩個(gè)更高類別進(jìn)程的進(jìn)程。

  • 后臺(tái)進(jìn)程
    包含目前對(duì)用戶不可見的 Activity 的進(jìn)程(已調(diào)用 Activity 的 onStop() 方法)。

  • 空進(jìn)程
    不含任何活動(dòng)應(yīng)用組件的進(jìn)程。保留這種進(jìn)程的的唯一目的是用作緩存,以縮短下次在其中運(yùn)行組件所需的啟動(dòng)時(shí)間。

2.3 進(jìn)程間通信

Android 利用遠(yuǎn)程過程調(diào)用 (RPC) 提供了一種進(jìn)程間通信 (IPC) 機(jī)制,通過這種機(jī)制,由 Activity 或其他應(yīng)用組件調(diào)用的方法將(在其他進(jìn)程中)遠(yuǎn)程執(zhí)行,而所有結(jié)果將返回給調(diào)用方。這就要求把方法調(diào)用及其數(shù)據(jù)分解至操作系統(tǒng)可以識(shí)別的程度,并將其從本地進(jìn)程和地址空間傳輸至遠(yuǎn)程進(jìn)程和地址空間,然后在遠(yuǎn)程進(jìn)程中重新組裝并執(zhí)行該調(diào)用。 然后,返回值將沿相反方向傳輸回來。 Android 提供了執(zhí)行這些 IPC 事務(wù)所需的全部代碼,因此您只需集中精力定義和實(shí)現(xiàn) RPC 編程接口即可。

三、線程

應(yīng)用啟動(dòng)時(shí),系統(tǒng)會(huì)為應(yīng)用創(chuàng)建一個(gè)名為“主線程”的執(zhí)行線程。 此線程非常重要,是應(yīng)用與 Android UI 進(jìn)行交互的線程,負(fù)責(zé)響應(yīng)用戶交互事件,主線程有時(shí)也稱為 UI 線程。
Android 的單線程模式必須遵守兩條規(guī)則:
不要阻塞 UI 線程(特別Android禁止網(wǎng)絡(luò)操作放在UI線程)
不要在 UI 線程之外訪問 Android UI(因?yàn)閁I方法是線程不安全的)

3.1 工作線程

要保證應(yīng)用 UI 的響應(yīng)能力,關(guān)鍵是不能阻塞 UI 線程。如果執(zhí)行的操作不能很快完成,則應(yīng)確保它們?cè)趩为?dú)的線程(“后臺(tái)”或“工作”線程)中運(yùn)行。
Android 提供了幾種途徑來從其他線程訪問 UI 線程。以下列出了幾種有用的方法:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)
  • Handler機(jī)制訪問UI線程
  • AsyncTask類

3.2 線程安全方法

對(duì)于實(shí)現(xiàn)的方法可能在多線程中調(diào)用的,要注意線程安全。比如:
綁定服務(wù)中提供的遠(yuǎn)程調(diào)用方法和內(nèi)容提供程序接收來自其他進(jìn)程的數(shù)據(jù)請(qǐng)求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容