Activity

一,初識
由于Android系統(tǒng)資源的有限性以及不同場景需求的不同,Android四大組件可以對應(yīng)不同的使用場景從而提高系統(tǒng)資源的利用率,同時(shí)四大組件分工明確,共同構(gòu)成了可重用、靈活、低耦合的安卓系統(tǒng)。四大組件必須在AndroidManifest文件中進(jìn)行注冊才能使用,接下來說一下四大組件分別是什么以及他們的使用場景。

  • Activity
    基本概念:Activity是一個(gè)應(yīng)用組件,持有一個(gè)Window窗口用于繪制和展示界面,接收和處理用戶操作
    使用場景:主要負(fù)責(zé)與用戶進(jìn)行交互,展示頁面給用戶并能接收和處理用戶的點(diǎn)擊,滑動等操作事件并對用戶操作做出相應(yīng)的反饋
  • Service
    基本概念:Service相對于Activity沒有相應(yīng)的頁面,生命周期較長,執(zhí)行那些不需要和用戶交互但需要長期運(yùn)行 的任務(wù)
    使用場景:執(zhí)行不需要與用戶進(jìn)行交互的任務(wù),比如播放音樂等,用戶在聽歌曲的時(shí)候可以做其他操作提高了用戶體驗(yàn)
  • BroadcastReceiver
    基本概念:BroadcastReceiver是一種消息型組件,用于在不同組件乃至不同應(yīng)用之間傳遞消息。進(jìn)行系統(tǒng)級別的消息通知,Android應(yīng)用采用沙盒機(jī)制,不同應(yīng)用之間相互隔離開來不能直接相互訪問資源,而廣播則提供了一種應(yīng)用內(nèi)組件間以及不同應(yīng)用之間通信的方式
    使用場景:通過注冊相應(yīng)廣播我們可以監(jiān)聽系統(tǒng)啟動廣播實(shí)現(xiàn)應(yīng)用開機(jī)啟動功能,監(jiān)聽wifi,數(shù)據(jù)等狀態(tài)信息實(shí)現(xiàn)我們相應(yīng)的功能,一個(gè)頁面如果要對其他頁面的動作做出相應(yīng)反饋我們也可以通過自定義廣播的方式作出相應(yīng)的處理從而降低不同頁面和組件間的耦合。
  • ContentProvider
    基本概念:Android采用了沙箱機(jī)制,可以保證各個(gè)應(yīng)用程序相對獨(dú)立和安全,可以免受其他應(yīng)用程序的惡意修改和攻擊保證數(shù)據(jù)的安全性,但是現(xiàn)實(shí)中不可能所有應(yīng)用完全獨(dú)立的,有時(shí)候就需要使用到其他應(yīng)用提供的數(shù)據(jù)比如QQ獲取我們的聯(lián)系人信息就涉及到QQ和通訊錄兩應(yīng)用間的數(shù)據(jù)共享,ContentProvider能夠便利的向其他應(yīng)用提供一個(gè)訪問本應(yīng)用數(shù)據(jù)的接口,還可以選擇只對哪一部分?jǐn)?shù)據(jù)進(jìn)行共享,從而保證程序中的隱私數(shù)據(jù)不會有泄漏風(fēng)險(xiǎn)。
    使用場景:第三方應(yīng)用讀取聯(lián)系人,日歷和短信等信息,同時(shí)我們也可以給自己的應(yīng)用定義一系列操作通過ContentProvider提供給其他應(yīng)用程序使用。

二,Activity詳細(xì)介紹

  • Activity生命周期
  • 任務(wù),任務(wù)棧
  • 啟動模式
  • 進(jìn)程和生命周期

1, Activity生命周期

Activity是具有生命周期的,在生命周期的不同階段可以進(jìn)行處理不同的工作和任務(wù),接下來通過Google官方提供圖示來學(xué)習(xí)。
image.png

由圖可以清楚的看到Activity在不同的情況下會走不同的生命周期,常見的生命周期有哪些呢?

  • 一般情況生命周期
    onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()

  • 從Activity A 跳轉(zhuǎn)到Activity B所經(jīng)歷的生命周期
    Activity A onPause() -> Activity B onCreate() -> Activity B onStart() ->Activity B onResume() -> Activity A onStop()
    按下返回鍵:Activity B onPause() -> Activity A onRestart() -> Activity A onStart() -> Activity A onResume() -> Activity B onStop() -> Activity B onDestroy()
    注意:由此可見Activity A進(jìn)入 Activity B時(shí)會先執(zhí)行Activity A的onPause()方法,如果我們在此方法中做了大量復(fù)雜或者資源釋放工作會導(dǎo)致頁面跳轉(zhuǎn)出現(xiàn)延遲效果,造成不好的用戶體驗(yàn)。

  • 當(dāng)前Activity彈出Dialog彈窗不走生命周期

  • 啟動一個(gè)主題為Dialog樣式的Activity
    Activity A onPause() -> Activity B onCreate() -> Activity B onStart() -> Activity B onResume()
    點(diǎn)擊返回:Activity B onPause() -> Activity A onResume() ->Activity B onStop() -> Activity B onDestroy()

  • 如果當(dāng)前Activity啟動模式為SingleTop,啟動自身頁面時(shí)生命周期
    onPause() -> onNewIntent() -> onResume()

  • 橫豎屏切換時(shí)的生命周期
    未配置configChanges屬性:會調(diào)用一個(gè)參數(shù)的onSaveInstanceState方法和onRestoreInstanceState()方法
    生命周期為: onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
    配置configChanges屬性時(shí):不調(diào)用任何生命周期方法 android:configChanges="orientation|screenSize|keyboardHidden"

  • 什么情況下Activity只走onPause() 不走onStop()?
    當(dāng)啟動一個(gè)Theme為Dialog的Activity時(shí),只會執(zhí)行onPause() 點(diǎn)擊返回時(shí)執(zhí)行onResume()

  • 什么情況導(dǎo)致Activity的onDestroy() 方法不執(zhí)行?
    外部強(qiáng)制關(guān)閉進(jìn)程或異常奔潰的時(shí)候
    生命周期長的對象持有當(dāng)前Activity的引用handler比較多
    Activity被收集內(nèi)存強(qiáng)制回收是不會調(diào)用destroy方法的

2,任務(wù)任務(wù)棧
任務(wù):用戶在執(zhí)行某項(xiàng)任務(wù)時(shí)與之交互的一系列Activity集合
返回棧:執(zhí)行某項(xiàng)任務(wù)時(shí)用到的Activity會按照打開的順序排列在一個(gè)返回堆棧中,當(dāng)用戶一直按返回按鈕,Activity會從堆棧中按照后進(jìn)先出的順序退出知道返回主屏幕。移除堆棧中的所有Activity后,該任務(wù)將不復(fù)存在。

任務(wù)是一個(gè)整體單元,當(dāng)用戶開始一個(gè)新的任務(wù)或者通過主屏幕按鈕進(jìn)入主屏幕時(shí),任務(wù)可移至后臺,當(dāng)前任務(wù)失去焦點(diǎn),舉例來說,假設(shè)當(dāng)前任務(wù)(任務(wù) A)的堆棧中有 3 個(gè) Activity,當(dāng)前 Activity 下有 2 個(gè) Activity。用戶按主屏幕按鈕,然后從應(yīng)用啟動器中啟動新應(yīng)用。主屏幕出現(xiàn)后,任務(wù) A 轉(zhuǎn)到后臺。當(dāng)新應(yīng)用啟動時(shí),系統(tǒng)會啟動該應(yīng)用的任務(wù)(任務(wù) B),該任務(wù)具有自己的 Activity 堆棧。與該應(yīng)用互動后,用戶再次返回到主屏幕并選擇最初啟動任務(wù) A 的應(yīng)用?,F(xiàn)在,任務(wù) A 進(jìn)入前臺,其堆棧中的所有三個(gè) Activity 都完好如初,堆棧頂部的 Activity 恢復(fù)運(yùn)行。此時(shí),用戶仍可通過以下方式切換到任務(wù) B:轉(zhuǎn)到主屏幕并選擇啟動該任務(wù)的應(yīng)用圖標(biāo)。

思考一個(gè)問題,Android管理任務(wù)和返回棧的方式是將所有接連啟動的Activity放到同一任務(wù)和一個(gè)“后進(jìn)先出”堆棧中,大多數(shù)應(yīng)用頁面的跳轉(zhuǎn)都符合這種情況,但有些場景這種方式卻不太適合,比如一個(gè)新聞列表頁面,點(diǎn)擊某個(gè)條目會進(jìn)入詳情顯示頁面,但有時(shí)點(diǎn)擊沒反應(yīng)會多點(diǎn)擊幾次這樣會導(dǎo)致詳情頁面打開多個(gè),返回棧中存在了多個(gè)相同的詳情頁Activity,這個(gè)時(shí)候當(dāng)我們點(diǎn)擊退出時(shí)需要點(diǎn)擊關(guān)閉詳情頁多次。再例如我們可能在多個(gè)應(yīng)用中需要獲取驗(yàn)證碼,如果使用目前的管理模式短信詳情頁會被打開多次,使用特別混亂,因此就需要我們對任務(wù)和任務(wù)棧進(jìn)行管理,這就用到了Android提供的啟動模式。

3,啟動模式
Android的啟動模式可以指定Activity的啟動方式,Activity啟動模式有四種分別為"standard"(默認(rèn)模式),"singleTop","singleTask","singleInstance“。

standard:
每次啟動Activity都會創(chuàng)建新的Activity實(shí)例,無論所在回退棧里是否已經(jīng)存在,每個(gè)實(shí)例可以屬于不同任務(wù),一個(gè)任務(wù)也可以有多個(gè)實(shí)例。
singleTop:
棧頂復(fù)用模式,如果要啟動的Activity已經(jīng)存在當(dāng)前回退棧棧頂,則會直接利用已有的Activity而不會再重新創(chuàng)建新的Activity實(shí)例。
singleTask:
棧內(nèi)復(fù)用模式,如果要啟動的Activity已經(jīng)存在于回退棧中,無論它是否在棧頂都不會重新創(chuàng)建新實(shí)例,啟動此Activity會彈出此Activity之上的所有其他Activity從而使此Activity位于回退棧棧頂,直接使用。
singleInstance:
單例復(fù)用模式,使用了此模式的Activity單獨(dú)使用一個(gè)回退棧,此Activity啟動的其他Activity不會包含在此回退棧。

指定Activity以那種模式啟動有兩種方式:通過Intent標(biāo)記和清單文件中使用 <activity>元素的 launchMode屬性指定

launchMode屬性指定:直接將launchMode值設(shè)置為standard或singleTop或singleTask或singleInstance
Intent標(biāo)記:啟動 Activity 時(shí),您可以在傳送給 startActivity() 的 intent 中添加相應(yīng)的標(biāo)記來修改 Activity 與其任務(wù)的默認(rèn)關(guān)聯(lián),intent標(biāo)記包含F(xiàn)LAG_ACTIVITY_NEW_TASK,F(xiàn)LAG_ACTIVITY_SINGLE_TOP,F(xiàn)LAG_ACTIVITY_CLEAR_TOP
三種。
FLAG_ACTIVITY_NEW_TASK:效果相當(dāng)于singleTask。
FLAG_ACTIVITY_SINGLE_TOP:效果相當(dāng)于singleTop。
FLAG_ACTIVITY_CLEAR_TOP:如果要啟動的 Activity 已經(jīng)在當(dāng)前任務(wù)中運(yùn)行,則不會啟動該 Activity 的新實(shí)例,而是會銷毀位于它之上的所有其他 Activity,并通過onNewIntent()將此 intent 傳送給它的已恢復(fù)實(shí)例(現(xiàn)在位于堆棧頂部)launchMode 屬性沒有可產(chǎn)生此行為的值。

清除返回堆棧

如果用戶離開任務(wù)較長時(shí)間,系統(tǒng)會清除任務(wù)中除根 Activity 以外的所有 Activity。當(dāng)用戶再次返回到該任務(wù)時(shí),只有根 Activity 會恢復(fù)。系統(tǒng)之所以采取這種行為方式是因?yàn)?,?jīng)過一段時(shí)間后,用戶可能已經(jīng)放棄了之前執(zhí)行的操作,現(xiàn)在返回任務(wù)是為了開始某項(xiàng)新的操作。

您可以使用一些 Activity 屬性來修改此行為:
alwaysRetainTaskState:如果在任務(wù)的根 Activity 中將該屬性設(shè)為 "true",則不會發(fā)生上述默認(rèn)行為。即使經(jīng)過很長一段時(shí)間后,任務(wù)仍會在其堆棧中保留所有 Activity。

clearTaskOnLaunch:如果在任務(wù)的根 Activity 中將該屬性設(shè)為 "true",那么只要用戶離開任務(wù)再返回,堆棧就會被清除到只剩根 Activity。也就是說,它與 alwaysRetainTaskState正好相反。用戶始終會返回到任務(wù)的初始狀態(tài),即便只是短暫離開任務(wù)也是如此。

finishOnTaskLaunch:該屬性與 clearTaskOnLaunch類似,但它只會作用于單個(gè) Activity 而非整個(gè)任務(wù)。它還可導(dǎo)致任何 Activity 消失,包括根 Activity。如果將該屬性設(shè)為 "true",則 Activity 僅在當(dāng)前會話中歸屬于任務(wù)。如果用戶離開任務(wù)再返回,則該任務(wù)將不再存在。

4,進(jìn)程和生命周期
Android系統(tǒng)為了在系統(tǒng)內(nèi)存不足的時(shí)候應(yīng)該終止那些進(jìn)程,Android會根據(jù)每個(gè)進(jìn)程中運(yùn)行的組件以及組件狀態(tài),將他們放入”重要性層次結(jié)構(gòu)“,這些層次結(jié)構(gòu)包含以下五種。

前臺進(jìn)程:當(dāng)前正在與用戶交互的Activity所在的進(jìn)程
可見進(jìn)程:Activity可見但沒有在前臺所在的進(jìn)程
服務(wù)進(jìn)程:Activity在后臺開啟了Service服務(wù)所在的進(jìn)程
后臺進(jìn)程:Activity完全處于后臺所在的進(jìn)程
空進(jìn)程:沒有任何Activity存在的進(jìn)程優(yōu)先級最低

系統(tǒng)內(nèi)存資源不足是回收順序?yàn)椋嚎者M(jìn)程->后臺進(jìn)程->服務(wù)進(jìn)程->可見進(jìn)程->前臺進(jìn)程。

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

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

  • 前言 基于最近要準(zhǔn)備去面試,特意系統(tǒng)的復(fù)習(xí)了下Android基礎(chǔ),看到Activity這塊時(shí),發(fā)現(xiàn)很多都忘了,而且...
    darryrzhong閱讀 26,123評論 1 17
  • Activity https://developer.android.com/guide/components/a...
    XLsn0w閱讀 773評論 0 4
  • 夜鶯2517閱讀 128,171評論 1 9
  • 版本:ios 1.2.1 亮點(diǎn): 1.app角標(biāo)可以實(shí)時(shí)更新天氣溫度或選擇空氣質(zhì)量,建議處女座就不要選了,不然老想...
    我就是沉沉閱讀 7,468評論 1 6
  • 我是一名過去式的高三狗,很可悲,在這三年里我沒有戀愛,看著同齡的小伙伴們一對兒一對兒的,我的心不好受。怎么說呢,高...
    小娘紙閱讀 3,836評論 4 7

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