Binder學(xué)習(xí)(一)Android中的進(jìn)程

概述

我么知道福稳,Android底層是基于Linux內(nèi)核的,當(dāng)某個應(yīng)用組件啟動且該應(yīng)用沒有運行其他任何組件時嘉冒,Android 系統(tǒng)會使用單個執(zhí)行線程為應(yīng)用啟動新的 Linux 進(jìn)程音五。默認(rèn)情況下潘酗,同一應(yīng)用的所有組件在相同的進(jìn)程和線程(稱為主線程)中運行。對于線程揪阿,基本上大家都比較熟悉疗我,因為主線程中不允許有耗時的操作咆畏,基本上會根據(jù)需要開一些子線程來處理一些耗時的操作,諸如IO吴裤,網(wǎng)絡(luò)之類的旧找,然后最好用線程池統(tǒng)一進(jìn)行管理。但是對于進(jìn)程來說麦牺,其實比線程要復(fù)雜的多钮蛛,有時候想一下,其實有很多問題是值得研究的:

  • 為什么每個應(yīng)用都可以接收到系統(tǒng)的廣播剖膳?
  • 為什么不同的應(yīng)用之間可以相互喚起魏颓?
  • 為什么不同的應(yīng)用都可以訪問系統(tǒng)相冊,通訊錄潮秘?

自己不是做底層的琼开,也不打算去研究底層的源碼,只打算從應(yīng)用層上了解一下Android系統(tǒng)應(yīng)用間的通信機制枕荞。

正文

四大組件的進(jìn)程

默認(rèn)情況下柜候,同一應(yīng)用的所有組件均在相同的進(jìn)程中運行,且大多數(shù)應(yīng)用都不會改變這一點躏精。 但是渣刷,如果您發(fā)現(xiàn)需要控制某個組件所屬的進(jìn)程,則可在清單文件中執(zhí)行此操作矗烛。

開啟多進(jìn)程

對于一個Application來講辅柴,系統(tǒng)會默認(rèn)分配一個進(jìn)程,但是這個屬性可以在清單文件中通過android:process屬性進(jìn)行配置瞭吃,另外這個屬性同樣適用于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>

進(jìn)程的分類

前臺進(jìn)程

用戶當(dāng)前操作所必需的進(jìn)程股冗。如果一個進(jìn)程滿足以下任一條件,即視為前臺進(jìn)程:

  • 托管用戶正在交互的 Activity(已調(diào)用 Activity 的 onResume() 方法)
  • 托管某個 Service和蚪,后者綁定到用戶正在交互的 Activity
  • 托管正在“前臺”運行的 Service(服務(wù)已調(diào)用 startForeground())
  • 托管正執(zhí)行一個生命周期回調(diào)的 Service(onCreate()止状、onStart() 或 onDestroy())
  • 托管正執(zhí)行其 onReceive() 方法的 BroadcastReceiver
可見進(jìn)程

沒有任何前臺組件、但仍會影響用戶在屏幕上所見內(nèi)容的進(jìn)程攒霹。 如果一個進(jìn)程滿足以下任一條件怯疤,即視為可見進(jìn)程:

  • 托管綁定到可見(或前臺)Activity 的 Service。
  • 托管不在前臺催束、但仍對用戶可見的 Activity(已調(diào)用其 onPause() 方法)集峦。例如,如果前臺 Activity 啟動了一個對話框,允許在其后顯示上一 Activity少梁,則有可能會發(fā)生這種情況洛口。
服務(wù)進(jìn)程

正在運行已使用 startService() 方法啟動的服務(wù)且不屬于上述兩個更高類別進(jìn)程的進(jìn)程。盡管服務(wù)進(jìn)程與用戶所見內(nèi)容沒有直接關(guān)聯(lián)凯沪,但是它們通常在執(zhí)行一些用戶關(guān)心的操作(例如第焰,在后臺播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))。

后臺進(jìn)程

包含目前對用戶不可見的 Activity 的進(jìn)程(已調(diào)用 Activity 的 onStop() 方法)妨马。 通常會有很多后臺進(jìn)程在運行挺举,因此它們會保存在 LRU (最近最少使用)列表中,以確保包含用戶最近查看的 Activity 的進(jìn)程最后一個被終止烘跺。如果某個 Activity 正確實現(xiàn)了生命周期方法湘纵,并保存了其當(dāng)前狀態(tài),則終止其進(jìn)程不會對用戶體驗產(chǎn)生明顯影響滤淳,因為當(dāng)用戶導(dǎo)航回該 Activity 時梧喷,Activity 會恢復(fù)其所有可見狀態(tài)。 有關(guān)保存和恢復(fù)狀態(tài)的信息脖咐。

空進(jìn)程

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

進(jìn)程生命周期

Android 系統(tǒng)將盡量長時間地保持應(yīng)用進(jìn)程偿凭,但為了新建進(jìn)程或運行更重要的進(jìn)程,最終需要移除舊進(jìn)程來回收內(nèi)存派歌。 為了確定保留或終止哪些進(jìn)程弯囊,系統(tǒng)會根據(jù)進(jìn)程中正在運行的組件以及這些組件的狀態(tài),將每個進(jìn)程放入“重要性層次結(jié)構(gòu)”中胶果。 必要時匾嘱,系統(tǒng)會首先消除重要性最低的進(jìn)程,然后是重要性略遜的進(jìn)程早抠,依此類推奄毡,以回收系統(tǒng)資源。

  • 前臺進(jìn)程:通常贝或,在任意給定時間前臺進(jìn)程都為數(shù)不多。只有在內(nèi)存不足以支持它們同時繼續(xù)運行這一萬不得已的情況下锐秦,系統(tǒng)才會終止它們咪奖。 此時,設(shè)備往往已達(dá)到內(nèi)存分頁狀態(tài)酱床,因此需要終止一些前臺進(jìn)程來確保用戶界面正常響應(yīng)羊赵。
  • 可見進(jìn)程:可見進(jìn)程被視為是極其重要的進(jìn)程,除非為了維持所有前臺進(jìn)程同時運行而必須終止,否則系統(tǒng)不會終止這些進(jìn)程昧捷。
  • 服務(wù)進(jìn)程:除非內(nèi)存不足以維持所有前臺進(jìn)程和可見進(jìn)程同時運行闲昭,否則系統(tǒng)會讓服務(wù)進(jìn)程保持運行狀態(tài)。
  • 后臺進(jìn)程:這些進(jìn)程對用戶體驗沒有直接影響靡挥,系統(tǒng)可能隨時終止它們序矩,以回收內(nèi)存供前臺進(jìn)程、可見進(jìn)程或服務(wù)進(jìn)程使用
  • 空進(jìn)程:為使總體系統(tǒng)資源在進(jìn)程緩存和底層內(nèi)核緩存之間保持平衡跋破,系統(tǒng)往往會終止這些進(jìn)程簸淀。

提高進(jìn)程優(yōu)先級

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

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

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

針對上述原理琼了,所以常用的提升進(jìn)程優(yōu)先級的方法大致有以下2種:

設(shè)置進(jìn)程優(yōu)先級

對于Service被系統(tǒng)回收逻锐,一般做法是通過提高優(yōu)先級可以解決,有以下幾種做法:

  • 在AndroidManifest.xml文件中對于intent-filter可以通過android:priority = “1000”這個屬性設(shè)置最高優(yōu)先級,1000是最高值昧诱,如果數(shù)字越小則優(yōu)先級越低晓淀。

  • Android中的進(jìn)程是托管的,當(dāng)系統(tǒng)進(jìn)程空間緊張的時候盏档,會依照優(yōu)先級自動進(jìn)行進(jìn)程的回收凶掰, 設(shè)置setForeground(true) 來設(shè)置 Service 的優(yōu)先級。

雙進(jìn)程守護(hù)

APP中同時開啟兩個Service妆丘,分別是A和B锄俄,那么: 如果A守護(hù)B,則B掛掉的同時勺拣,A就應(yīng)該把B啟動起來奶赠,反之亦然,也就是說A和B應(yīng)該是互相守護(hù)药有,無論誰被殺掉毅戈,對方就把它拉起來。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仓洼,更是在濱河造成了極大的恐慌,老刑警劉巖扇单,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奠旺,居然都是意外死亡蜘澜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門响疚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鄙信,“玉大人,你說我怎么就攤上這事忿晕∽肮睿” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵践盼,是天一觀的道長鸦采。 經(jīng)常有香客問我,道長咕幻,這世上最難降的妖魔是什么赖淤? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谅河,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己绷耍,他們只是感情好吐限,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褂始,像睡著了一般诸典。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崎苗,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天狐粱,我揣著相機與錄音,去河邊找鬼胆数。 笑死肌蜻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的必尼。 我是一名探鬼主播蒋搜,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼判莉!你這毒婦竟也來了豆挽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤券盅,失蹤者是張志新(化名)和其女友劉穎帮哈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锰镀,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡娘侍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了互站。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片私蕾。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胡桃,靈堂內(nèi)的尸體忽然破棺而出踩叭,到底是詐尸還是另有隱情,我是刑警寧澤翠胰,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布容贝,位于F島的核電站,受9級特大地震影響之景,放射性物質(zhì)發(fā)生泄漏斤富。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一锻狗、第九天 我趴在偏房一處隱蔽的房頂上張望满力。 院中可真熱鬧焕参,春花似錦、人聲如沸油额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潦嘶。三九已至涩嚣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掂僵,已是汗流浹背航厚。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锰蓬,地道東北人幔睬。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像互妓,于是被迫代替她去往敵國和親溪窒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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