Activity是一個應(yīng)用組件卵贱,用戶可與其提供的屏幕進行交互累颂,以執(zhí)行撥打電話敷燎、拍攝照片、發(fā)送電子郵件或查看地圖等操作澄惊。 每個 Activity 都會獲得一個用于繪制其用戶界面的窗口唆途。窗口通常會充滿屏幕,但也可小于屏幕并浮動在其他窗口之上掸驱。
一個應(yīng)用通常由多個彼此松散聯(lián)系的 Activity 組成肛搬。 一般會指定應(yīng)用中的某個 Activity 為“主”Activity,即首次啟動應(yīng)用時呈現(xiàn)給用戶的那個 Activity亭敢。 而且每個 Activity 均可啟動另一個 Activity滚婉,以便執(zhí)行不同的操作。 每次新 Activity 啟動時帅刀,前一 Activity 便會停止让腹,但系統(tǒng)會在堆棧(“返回棧”)中保留該 Activity扣溺。 當(dāng)新 Activity 啟動時骇窍,系統(tǒng)會將其推送到返回棧上,并取得用戶焦點锥余。 返回棧遵循基本的“后進先出”堆棧機制腹纳,因此,當(dāng)用戶完成當(dāng)前 Activity 并按“返回”按鈕時驱犹,系統(tǒng)會從堆棧中將其彈出(并銷毀)嘲恍,然后恢復(fù)前一 Activity。
當(dāng)一個 Activity 因某個新 Activity 啟動而停止時雄驹,系統(tǒng)會通過該 Activity 的生命周期回調(diào)方法通知其這一狀態(tài)變化佃牛。Activity 因狀態(tài)變化—系統(tǒng)是創(chuàng)建 Activity、停止 Activity医舆、恢復(fù) Activity 還是銷毀 Activity— 而收到的回調(diào)方法可能有若干種俘侠,每一種回調(diào)都會為您提供執(zhí)行與該狀態(tài)變化相應(yīng)的特定操作的機會。 例如蔬将,停止時爷速,您的 Activity 應(yīng)釋放任何大型對象,例如網(wǎng)絡(luò)或數(shù)據(jù)庫連接霞怀。 當(dāng) Activity 恢復(fù)時惫东,您可以重新獲取所需資源,并恢復(fù)執(zhí)行中斷的操作毙石。 這些狀態(tài)轉(zhuǎn)變都是 Activity 生命周期的一部分凿蒜。
1. activity生命周期
1.1 四種狀態(tài)
- 運行狀態(tài):Running禁谦,當(dāng)一個活動位于返回棧的棧頂時,這時活動就處于運行狀態(tài)废封,最不會被系統(tǒng)回收的就是運行狀態(tài)的活動州泊。
- 暫停狀態(tài):Paused,當(dāng)一個活動不再處于棧頂?shù)奈恢闷螅匀豢梢娨T恚瑥棾鲆粋€對話框或者一個不能占滿屏幕的活動都會導(dǎo)致前一個活動處于暫停狀態(tài),系統(tǒng)也不會輕易回收這樣的活動刽漂,除非是內(nèi)存極低的情況(回收可見的活動都會造成極不好的用戶體驗)
- 停止?fàn)顟B(tài):Stopped演训,當(dāng)一個活動不處于棧頂位置,且完全不可見的時候贝咙,就進入停止?fàn)顟B(tài)样悟,當(dāng)內(nèi)存較低時系統(tǒng)會回收這樣的活動
- 銷毀狀態(tài):Killed,當(dāng)一個活動從棧中移除后就編程銷毀狀態(tài)庭猩,系統(tǒng)會回收這樣的活動
1.2 生命周期
- onCreate() :當(dāng)Activity第一次被創(chuàng)建時調(diào)用窟她,完成活動的初始化操作。
- onStart() :當(dāng)用戶可以看到這個Activity時調(diào)用
- onResume() :當(dāng)獲得了用戶的焦點時,就是用戶點擊了屏幕
- onPause() :當(dāng)系統(tǒng)準(zhǔn)備啟動或回復(fù)另一個活動時調(diào)用蔼水。在這個方法中將一些小號CPU的資源釋放震糖,保存一些重要數(shù)據(jù)。
- onStop() :當(dāng)活動完全不可見是調(diào)用趴腋,當(dāng)新啟動的活動時對話框式的吊说,還處于可見時,該方法是不會被調(diào)用
- onDestroy():活動被銷毀時調(diào)用
- onRestart():當(dāng)活動有停止?fàn)顟B(tài)變?yōu)檫\行狀態(tài)時調(diào)用优炬。
- Activity啟動→onCreate()→onStart()→onResume()
- 點擊Home鍵回到主界面(Activity不可見)→onPause()→onStop()
- 再次回到Activity→onRestart()→onStart()→onResume()
- 退出當(dāng)前Activity→onPause()→onStop→onDestory()
1.3 android進程優(yōu)先級
android將進程的優(yōu)先級分為5個層次颁井,按照優(yōu)先級由高到低排列如下:
- 前臺進程(Foreground process):它表明用戶正在與該進程進行交互操作,android系統(tǒng)依據(jù)下面的條件來將一個進程標(biāo)記為前臺進程:
- 該進程持有一個用戶正在與其交互的Activity(也就是這個activity的生命周期方法走到了onResume()方法)蠢护。
- 該進程持有一個Service雅宾,并且這個Service與一個用戶正在交互中的Activity進行綁定。
- 該進程持有一個前臺運行模式的Service(也就是這個Service調(diào)用了startForegroud()方法)糊余。
- 該進程持有一個正在執(zhí)行生命周期方法(onCreate()、onStart()单寂、onDestroy()等)的Service贬芥。
- 該進程持有一個正在執(zhí)行onReceive()方法的BroadcastReceiver。
一般情況下宣决,不會有太多的前臺進程蘸劈。殺死前臺進程是操作系統(tǒng)最后無可奈何的做法。當(dāng)內(nèi)存嚴(yán)重不足的時候尊沸,前臺進程一樣會被殺死威沫。
- 可見進程(Visible process):它表明雖然該進程沒有持有任何前臺組件贤惯,但是它還是能夠影響到用戶看得到的界面。android系統(tǒng)依據(jù)下面的條件將一個進程標(biāo)記為可見進程:
- 該進程持有一個非前臺Activity棒掠,但這個Activity依然能被用戶看到(也就是這個Activity調(diào)用了onPause()方法)孵构。例如,當(dāng)一個activity啟動了一個對話框烟很,這個activity就被對話框擋在后面颈墅。
- 該進程持有一個與可見(或者前臺)Activity綁定的Service。
服務(wù)進程(Service process):除了符合前臺進程和可見進程條件的Service雾袱,其它的Service都會被歸類為服務(wù)進程恤筛。
后臺進程(Background process):持有不可見Activity(調(diào)用了onStop()方法)的進程即為后臺進程。通常情況下都會有很多后臺進程芹橡,當(dāng)內(nèi)存不足的時候毒坛,在所有的后臺進程里面,會按照LRU(最近使用)規(guī)則林说,優(yōu)先回收最長時間沒有使用過的進程煎殷。
空進程(Empty process):不持有任何活動組件的進程。保持這種進程只有一個目的述么,就是為了緩存蝌数,以便下一次啟動該進程中的組件時能夠更快響應(yīng)。當(dāng)資源緊張的時候度秘,系統(tǒng)會平衡進程緩存和底層的內(nèi)核緩存情況進行回收顶伞。
前臺>可見>服務(wù)>后臺>空
如果一個進程同時滿足上述5種優(yōu)先級中的多個等級條件,android系統(tǒng)會優(yōu)先選取其中最高的等級作為該進程的優(yōu)先級剑梳。
2. Android任務(wù)棧
任務(wù)是指在執(zhí)行特定作業(yè)時與用戶交互的一系列 Activity唆貌。 這些 Activity 按照各自的打開順序排列在堆棧(即返回棧)中。
當(dāng)前 Activity 啟動另一個 Activity 時垢乙,該新 Activity 會被推送到堆棧頂部锨咙,成為焦點所在。 前一個 Activity 仍保留在堆棧中追逮,但是處于停止?fàn)顟B(tài)酪刀。Activity 停止時,系統(tǒng)會保持其用戶界面的當(dāng)前狀態(tài)钮孵。 用戶按“返回”按鈕時骂倘,當(dāng)前 Activity 會從堆棧頂部彈出(Activity 被銷毀),而前一個 Activity 恢復(fù)執(zhí)行(恢復(fù)其 UI 的前一狀態(tài))巴席。 堆棧中的 Activity 永遠(yuǎn)不會重新排列历涝,僅推入和彈出堆棧:由當(dāng)前 Activity 啟動時推入堆棧;用戶使用“返回”按鈕退出時彈出堆棧。 因此荧库,返回棧以“后進先出”對象結(jié)構(gòu)運行堰塌。
如果用戶繼續(xù)按“返回”,堆棧中的相應(yīng) Activity 就會彈出分衫,以顯示前一個 Activity场刑,直到用戶返回主屏幕為止(或者,返回任務(wù)開始時正在運行的任意 Activity)丐箩。 當(dāng)所有 Activity 均從堆棧中移除后摇邦,任務(wù)即不復(fù)存在。
Activity 和任務(wù)的默認(rèn)行為總結(jié)如下:
- 當(dāng) Activity A 啟動 Activity B 時屎勘,Activity A 將會停止施籍,但系統(tǒng)會保留其狀態(tài)(例如,滾動位置和已輸入表單中的文本)概漱。如果用戶在處于 Activity B 時按“返回”按鈕丑慎,則 Activity A 將恢復(fù)其狀態(tài),繼續(xù)執(zhí)行瓤摧。
- 用戶通過按“主頁”按鈕離開任務(wù)時竿裂,當(dāng)前 Activity 將停止且其任務(wù)會進入后臺。 系統(tǒng)將保留任務(wù)中每個 Activity 的狀態(tài)照弥。如果用戶稍后通過選擇開始任務(wù)的啟動器圖標(biāo)來恢復(fù)任務(wù)腻异,則任務(wù)將出現(xiàn)在前臺并恢復(fù)執(zhí)行堆棧頂部的 Activity。
- 如果用戶按“返回”按鈕这揣,則當(dāng)前 Activity 會從堆棧彈出并被銷毀悔常。 堆棧中的前一個 Activity 恢復(fù)執(zhí)行。銷毀 Activity 時给赞,系統(tǒng)不會保留該 Activity 的狀態(tài)机打。
- 即使來自其他任務(wù)呛哟,Activity 也可以多次實例化提揍。
3. 啟動模式
- "standard"(默認(rèn)模式)
默認(rèn)镰矿。系統(tǒng)在啟動 Activity 的任務(wù)中創(chuàng)建 Activity 的新實例并向其傳送 Intent自娩。Activity 可以多次實例化,而每個實例均可屬于不同的任務(wù)苟耻,并且一個任務(wù)可以擁有多個實例棋弥。 - "singleTop"
如果當(dāng)前任務(wù)的頂部已存在 Activity 的一個實例杖爽,則系統(tǒng)會通過調(diào)用該實例的 onNewIntent()方法向其傳送 Intent耻台,而不是創(chuàng)建 Activity 的新實例空免。Activity 可以多次實例化,而每個實例均可屬于不同的任務(wù)粘我,并且一個任務(wù)可以擁有多個實例(但前提是位于返回棧頂部的 Activity 并不是 Activity 的現(xiàn)有實例)鼓蜒。
注:為某個 Activity 創(chuàng)建新實例時,用戶可以按“返回”按鈕返回到前一個 Activity征字。 但是都弹,當(dāng) Activity 的現(xiàn)有實例處理新 Intent 時,則在新 Intent 到達(dá) onNewIntent()之前匙姜,用戶無法按“返回”按鈕返回到 Activity 的狀態(tài)畅厢。
- "singleTask"
系統(tǒng)創(chuàng)建新任務(wù)并實例化位于新任務(wù)底部的 Activity。但是氮昧,如果該 Activity 的一個實例已存在于一個單獨的任務(wù)中框杜,則系統(tǒng)會通過調(diào)用現(xiàn)有實例的onNewIntent() 方法向其傳送 Intent,而不是創(chuàng)建新實例袖肥。一次只能存在 Activity 的一個實例咪辱。
注:盡管 Activity 在新任務(wù)中啟動,但是用戶按“返回”按鈕仍會返回到前一個 Activity椎组。
- "singleInstance".
與 "singleTask" 相同油狂,只是系統(tǒng)不會將任何其他 Activity 啟動到包含實例的任務(wù)中。該 Activity 始終是其任務(wù)唯一僅有的成員寸癌;由此 Activity 啟動的任何 Activity 均在單獨的任務(wù)中打開专筷。
4. scheme跳轉(zhuǎn)協(xié)議
Android中的scheme是一種頁面內(nèi)跳轉(zhuǎn)協(xié)議,是一種非常好的實現(xiàn)機制蒸苇,通過定義自己的scheme協(xié)議磷蛹,可以非常方便的跳轉(zhuǎn)app內(nèi)的各個頁面;通過scheme協(xié)議溪烤,服務(wù)器可以定制化告訴App跳轉(zhuǎn)到哪個頁面味咳,可以通過通知欄消息定制化跳轉(zhuǎn)頁面,可以通過H5頁面跳轉(zhuǎn)頁面等氛什。
參考莺葫、感謝