Android Activity

Activity是一個(gè)應(yīng)用組件,用戶可與其提供的屏幕進(jìn)行交互,以執(zhí)行撥打電話、拍攝照片、發(fā)送電子郵件或查看地圖等操作。 每個(gè) Activity 都會(huì)獲得一個(gè)用于繪制其用戶界面的窗口。窗口通常會(huì)充滿屏幕,但也可小于屏幕并浮動(dòng)在其他窗口之上。

一個(gè)應(yīng)用通常由多個(gè)彼此松散聯(lián)系的 Activity 組成。 一般會(huì)指定應(yīng)用中的某個(gè) Activity 為“主”Activity,即首次啟動(dòng)應(yīng)用時(shí)呈現(xiàn)給用戶的那個(gè) Activity。 而且每個(gè) Activity 均可啟動(dòng)另一個(gè) Activity,以便執(zhí)行不同的操作。 每次新 Activity 啟動(dòng)時(shí),前一 Activity 便會(huì)停止,但系統(tǒng)會(huì)在堆棧(“返回棧”)中保留該 Activity。 當(dāng)新 Activity 啟動(dòng)時(shí),系統(tǒng)會(huì)將其推送到返回棧上,并取得用戶焦點(diǎn)。 返回棧遵循基本的“后進(jìn)先出”堆棧機(jī)制,因此,當(dāng)用戶完成當(dāng)前 Activity 并按“返回”按鈕時(shí),系統(tǒng)會(huì)從堆棧中將其彈出(并銷毀),然后恢復(fù)前一 Activity。

當(dāng)一個(gè) Activity 因某個(gè)新 Activity 啟動(dòng)而停止時(shí),系統(tǒng)會(huì)通過該 Activity 的生命周期回調(diào)方法通知其這一狀態(tài)變化。Activity 因狀態(tài)變化—系統(tǒng)是創(chuàng)建 Activity、停止 Activity、恢復(fù) Activity 還是銷毀 Activity— 而收到的回調(diào)方法可能有若干種,每一種回調(diào)都會(huì)為您提供執(zhí)行與該狀態(tài)變化相應(yīng)的特定操作的機(jī)會(huì)。 例如,停止時(shí),您的 Activity 應(yīng)釋放任何大型對象,例如網(wǎng)絡(luò)或數(shù)據(jù)庫連接。 當(dāng) Activity 恢復(fù)時(shí),您可以重新獲取所需資源,并恢復(fù)執(zhí)行中斷的操作。 這些狀態(tài)轉(zhuǎn)變都是 Activity 生命周期的一部分。


1. activity生命周期

1.1 四種狀態(tài)

  1. 運(yùn)行狀態(tài):Running,當(dāng)一個(gè)活動(dòng)位于返回棧的棧頂時(shí),這時(shí)活動(dòng)就處于運(yùn)行狀態(tài),最不會(huì)被系統(tǒng)回收的就是運(yùn)行狀態(tài)的活動(dòng)。
  2. 暫停狀態(tài):Paused,當(dāng)一個(gè)活動(dòng)不再處于棧頂?shù)奈恢?,但仍然可見,彈出一個(gè)對話框或者一個(gè)不能占滿屏幕的活動(dòng)都會(huì)導(dǎo)致前一個(gè)活動(dòng)處于暫停狀態(tài),系統(tǒng)也不會(huì)輕易回收這樣的活動(dòng),除非是內(nèi)存極低的情況(回收可見的活動(dòng)都會(huì)造成極不好的用戶體驗(yàn))
  3. 停止?fàn)顟B(tài):Stopped,當(dāng)一個(gè)活動(dòng)不處于棧頂位置,且完全不可見的時(shí)候,就進(jìn)入停止?fàn)顟B(tài),當(dāng)內(nèi)存較低時(shí)系統(tǒng)會(huì)回收這樣的活動(dòng)
  4. 銷毀狀態(tài):Killed,當(dāng)一個(gè)活動(dòng)從棧中移除后就編程銷毀狀態(tài),系統(tǒng)會(huì)回收這樣的活動(dòng)

1.2 生命周期

activity_lifecycle
Activity 生命周期回調(diào)方法匯總表
  • onCreate() :當(dāng)Activity第一次被創(chuàng)建時(shí)調(diào)用,完成活動(dòng)的初始化操作。
  • onStart() :當(dāng)用戶可以看到這個(gè)Activity時(shí)調(diào)用
  • onResume() :當(dāng)獲得了用戶的焦點(diǎn)時(shí),就是用戶點(diǎn)擊了屏幕
  • onPause() :當(dāng)系統(tǒng)準(zhǔn)備啟動(dòng)或回復(fù)另一個(gè)活動(dòng)時(shí)調(diào)用。在這個(gè)方法中將一些小號CPU的資源釋放,保存一些重要數(shù)據(jù)。
  • onStop() :當(dāng)活動(dòng)完全不可見是調(diào)用,當(dāng)新啟動(dòng)的活動(dòng)時(shí)對話框式的,還處于可見時(shí),該方法是不會(huì)被調(diào)用
  • onDestroy():活動(dòng)被銷毀時(shí)調(diào)用
  • onRestart():當(dāng)活動(dòng)有停止?fàn)顟B(tài)變?yōu)檫\(yùn)行狀態(tài)時(shí)調(diào)用。
  1. Activity啟動(dòng)→onCreate()→onStart()→onResume()
  2. 點(diǎn)擊Home鍵回到主界面(Activity不可見)→onPause()→onStop()
  3. 再次回到Activity→onRestart()→onStart()→onResume()
  4. 退出當(dāng)前Activity→onPause()→onStop→onDestory()

1.3 android進(jìn)程優(yōu)先級

android將進(jìn)程的優(yōu)先級分為5個(gè)層次,按照優(yōu)先級由高到低排列如下:

  1. 前臺(tái)進(jìn)程(Foreground process):它表明用戶正在與該進(jìn)程進(jìn)行交互操作,android系統(tǒng)依據(jù)下面的條件來將一個(gè)進(jìn)程標(biāo)記為前臺(tái)進(jìn)程:
  • 該進(jìn)程持有一個(gè)用戶正在與其交互的Activity(也就是這個(gè)activity的生命周期方法走到了onResume()方法)。
  • 該進(jìn)程持有一個(gè)Service,并且這個(gè)Service與一個(gè)用戶正在交互中的Activity進(jìn)行綁定。
  • 該進(jìn)程持有一個(gè)前臺(tái)運(yùn)行模式的Service(也就是這個(gè)Service調(diào)用了startForegroud()方法)。
  • 該進(jìn)程持有一個(gè)正在執(zhí)行生命周期方法(onCreate()、onStart()、onDestroy()等)的Service。
  • 該進(jìn)程持有一個(gè)正在執(zhí)行onReceive()方法的BroadcastReceiver。
    一般情況下,不會(huì)有太多的前臺(tái)進(jìn)程。殺死前臺(tái)進(jìn)程是操作系統(tǒng)最后無可奈何的做法。當(dāng)內(nèi)存嚴(yán)重不足的時(shí)候,前臺(tái)進(jìn)程一樣會(huì)被殺死。
  1. 可見進(jìn)程(Visible process):它表明雖然該進(jìn)程沒有持有任何前臺(tái)組件,但是它還是能夠影響到用戶看得到的界面。android系統(tǒng)依據(jù)下面的條件將一個(gè)進(jìn)程標(biāo)記為可見進(jìn)程:
  • 該進(jìn)程持有一個(gè)非前臺(tái)Activity,但這個(gè)Activity依然能被用戶看到(也就是這個(gè)Activity調(diào)用了onPause()方法)。例如,當(dāng)一個(gè)activity啟動(dòng)了一個(gè)對話框,這個(gè)activity就被對話框擋在后面。
  • 該進(jìn)程持有一個(gè)與可見(或者前臺(tái))Activity綁定的Service。
  1. 服務(wù)進(jìn)程(Service process):除了符合前臺(tái)進(jìn)程和可見進(jìn)程條件的Service,其它的Service都會(huì)被歸類為服務(wù)進(jìn)程。

  2. 后臺(tái)進(jìn)程(Background process):持有不可見Activity(調(diào)用了onStop()方法)的進(jìn)程即為后臺(tái)進(jìn)程。通常情況下都會(huì)有很多后臺(tái)進(jìn)程,當(dāng)內(nèi)存不足的時(shí)候,在所有的后臺(tái)進(jìn)程里面,會(huì)按照LRU(最近使用)規(guī)則,優(yōu)先回收最長時(shí)間沒有使用過的進(jìn)程。

  3. 空進(jìn)程(Empty process):不持有任何活動(dòng)組件的進(jìn)程。保持這種進(jìn)程只有一個(gè)目的,就是為了緩存,以便下一次啟動(dòng)該進(jìn)程中的組件時(shí)能夠更快響應(yīng)。當(dāng)資源緊張的時(shí)候,系統(tǒng)會(huì)平衡進(jìn)程緩存和底層的內(nèi)核緩存情況進(jìn)行回收。

前臺(tái)>可見>服務(wù)>后臺(tái)>空

如果一個(gè)進(jìn)程同時(shí)滿足上述5種優(yōu)先級中的多個(gè)等級條件,android系統(tǒng)會(huì)優(yōu)先選取其中最高的等級作為該進(jìn)程的優(yōu)先級。


2. Android任務(wù)棧

任務(wù)是指在執(zhí)行特定作業(yè)時(shí)與用戶交互的一系列 Activity。 這些 Activity 按照各自的打開順序排列在堆棧(即返回棧)中。

當(dāng)前 Activity 啟動(dòng)另一個(gè) Activity 時(shí),該新 Activity 會(huì)被推送到堆棧頂部,成為焦點(diǎn)所在。 前一個(gè) Activity 仍保留在堆棧中,但是處于停止?fàn)顟B(tài)。Activity 停止時(shí),系統(tǒng)會(huì)保持其用戶界面的當(dāng)前狀態(tài)。 用戶按“返回”按鈕時(shí),當(dāng)前 Activity 會(huì)從堆棧頂部彈出(Activity 被銷毀),而前一個(gè) Activity 恢復(fù)執(zhí)行(恢復(fù)其 UI 的前一狀態(tài))。 堆棧中的 Activity 永遠(yuǎn)不會(huì)重新排列,僅推入和彈出堆棧:由當(dāng)前 Activity 啟動(dòng)時(shí)推入堆棧;用戶使用“返回”按鈕退出時(shí)彈出堆棧。 因此,返回棧以“后進(jìn)先出”對象結(jié)構(gòu)運(yùn)行。
如果用戶繼續(xù)按“返回”,堆棧中的相應(yīng) Activity 就會(huì)彈出,以顯示前一個(gè) Activity,直到用戶返回主屏幕為止(或者,返回任務(wù)開始時(shí)正在運(yùn)行的任意 Activity)。 當(dāng)所有 Activity 均從堆棧中移除后,任務(wù)即不復(fù)存在。


diagram_backstack

Activity 和任務(wù)的默認(rèn)行為總結(jié)如下:

  • 當(dāng) Activity A 啟動(dòng) Activity B 時(shí),Activity A 將會(huì)停止,但系統(tǒng)會(huì)保留其狀態(tài)(例如,滾動(dòng)位置和已輸入表單中的文本)。如果用戶在處于 Activity B 時(shí)按“返回”按鈕,則 Activity A 將恢復(fù)其狀態(tài),繼續(xù)執(zhí)行。
  • 用戶通過按“主頁”按鈕離開任務(wù)時(shí),當(dāng)前 Activity 將停止且其任務(wù)會(huì)進(jìn)入后臺(tái)。 系統(tǒng)將保留任務(wù)中每個(gè) Activity 的狀態(tài)。如果用戶稍后通過選擇開始任務(wù)的啟動(dòng)器圖標(biāo)來恢復(fù)任務(wù),則任務(wù)將出現(xiàn)在前臺(tái)并恢復(fù)執(zhí)行堆棧頂部的 Activity。
  • 如果用戶按“返回”按鈕,則當(dāng)前 Activity 會(huì)從堆棧彈出并被銷毀。 堆棧中的前一個(gè) Activity 恢復(fù)執(zhí)行。銷毀 Activity 時(shí),系統(tǒng)不會(huì)保留該 Activity 的狀態(tài)。
  • 即使來自其他任務(wù),Activity 也可以多次實(shí)例化。

3. 啟動(dòng)模式

  1. "standard"(默認(rèn)模式)
    默認(rèn)。系統(tǒng)在啟動(dòng) Activity 的任務(wù)中創(chuàng)建 Activity 的新實(shí)例并向其傳送 Intent。Activity 可以多次實(shí)例化,而每個(gè)實(shí)例均可屬于不同的任務(wù),并且一個(gè)任務(wù)可以擁有多個(gè)實(shí)例。
  2. "singleTop"
    如果當(dāng)前任務(wù)的頂部已存在 Activity 的一個(gè)實(shí)例,則系統(tǒng)會(huì)通過調(diào)用該實(shí)例的 onNewIntent()方法向其傳送 Intent,而不是創(chuàng)建 Activity 的新實(shí)例。Activity 可以多次實(shí)例化,而每個(gè)實(shí)例均可屬于不同的任務(wù),并且一個(gè)任務(wù)可以擁有多個(gè)實(shí)例(但前提是位于返回棧頂部的 Activity 并不是 Activity 的現(xiàn)有實(shí)例)。

:為某個(gè) Activity 創(chuàng)建新實(shí)例時(shí),用戶可以按“返回”按鈕返回到前一個(gè) Activity。 但是,當(dāng) Activity 的現(xiàn)有實(shí)例處理新 Intent 時(shí),則在新 Intent 到達(dá) onNewIntent()之前,用戶無法按“返回”按鈕返回到 Activity 的狀態(tài)。

  1. "singleTask"
    系統(tǒng)創(chuàng)建新任務(wù)并實(shí)例化位于新任務(wù)底部的 Activity。但是,如果該 Activity 的一個(gè)實(shí)例已存在于一個(gè)單獨(dú)的任務(wù)中,則系統(tǒng)會(huì)通過調(diào)用現(xiàn)有實(shí)例的onNewIntent() 方法向其傳送 Intent,而不是創(chuàng)建新實(shí)例。一次只能存在 Activity 的一個(gè)實(shí)例。

:盡管 Activity 在新任務(wù)中啟動(dòng),但是用戶按“返回”按鈕仍會(huì)返回到前一個(gè) Activity。

  1. "singleInstance".
    與 "singleTask" 相同,只是系統(tǒng)不會(huì)將任何其他 Activity 啟動(dòng)到包含實(shí)例的任務(wù)中。該 Activity 始終是其任務(wù)唯一僅有的成員;由此 Activity 啟動(dòng)的任何 Activity 均在單獨(dú)的任務(wù)中打開。

4. scheme跳轉(zhuǎn)協(xié)議

Android中的scheme是一種頁面內(nèi)跳轉(zhuǎn)協(xié)議,是一種非常好的實(shí)現(xiàn)機(jī)制,通過定義自己的scheme協(xié)議,可以非常方便的跳轉(zhuǎn)app內(nèi)的各個(gè)頁面;通過scheme協(xié)議,服務(wù)器可以定制化告訴App跳轉(zhuǎn)到哪個(gè)頁面,可以通過通知欄消息定制化跳轉(zhuǎn)頁面,可以通過H5頁面跳轉(zhuǎn)頁面等。


參考、感謝

  1. Activity
  2. 任務(wù)和返回棧
  3. Android-Activity的四狀態(tài)、七生命周期、和四啟動(dòng)模式
  4. Android的進(jìn)程優(yōu)先級
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 【Android Activity】 什么是 Activity? 四大組件之一,通常一個(gè)用戶交互界面對應(yīng)一個(gè) ac...
    Rtia閱讀 3,927評論 3 18
  • 原文地址:Android Activity標(biāo)簽屬性 包含在: 能包含: 表明可以識別的隱式的intent 一、a...
    Amy_LuLu__閱讀 914評論 0 1
  • Activity https://developer.android.com/guide/components/a...
    XLsn0w閱讀 770評論 0 4
  • 學(xué)習(xí)資料: Android群英傳 Android開發(fā)藝術(shù)探索 Activity是與用戶交互的第一接口,感覺說是四大...
    英勇青銅5閱讀 2,848評論 15 41
  • 軍訓(xùn)稿 就像一切迷霧漸漸撥開,隱藏著的是陽光明媚。期待許久的軍訓(xùn)就這么徐徐展開,摸不清心中的悲喜,只是莫名的覺得多...
    暖春仙閱讀 612評論 0 7

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