Android 面試(一):說說 Activity 的四種啟動模式

我說好的 面試系列 總算開始了研铆。我姑且是想到哪兒寫到哪兒,其中肯定是和我被面試的實際情況息息相關(guān)持隧。

說說 Android 的四種啟動模式

這基本是一道必考題倔叼,和「 Activity 的生命周期 」一樣,基本為必考題空郊。

其實很多人可能存在一個誤區(qū)份招,覺得知道這個啟動模式「launchMode」沒什么意義,但我在毫無準備的前提下狞甚,被問到這個問題的時候锁摔,我被問的瑟瑟發(fā)抖。

這些都是基本

先普及下可能大多數(shù)人都知道的基本見解哼审。

  • standard
    這是 Activity 的默認啟動模式谐腰,每次激活 Activity 的時候都會創(chuàng)建一個新的 Activity 實例,并放入任務(wù)棧中涩盾。使用場景:基本絕大多數(shù)地方都可以用十气。
圖片來源于網(wǎng)絡(luò)
  • singleTop
    這可能也是非常常用的 launchMode 了。如果在任務(wù)的棧頂正好存有該 Activity 的實例春霍,則會通過調(diào)用 onNewIntent() 方法進行重用砸西,否則就會同 standard 模式一樣,創(chuàng)建新的實例并放入棧頂终畅。即便棧中已經(jīng)存在了該 Activity 的實例籍胯,也會創(chuàng)建新的實例竟闪,即:A -> B ->A离福,此時棧內(nèi)為 A -> B -> A,但 A -> B ->B 炼蛤,此時棧內(nèi)為 A -> B妖爷。一句話概述就是:當(dāng)且僅當(dāng)啟動的 Activity 和上一個 Activity 一致的時候才會通過調(diào)用 onNewIntent() 方法重用 Activity 。使用場景:資訊閱讀類 APP 的內(nèi)容界面理朋。
圖片來源于網(wǎng)絡(luò)
  • singleTask
    這個 launchMode專門用于解決上面 singleTop 的另外一種情況絮识,只要棧中已經(jīng)存在了該 Activity 的實例,就會直接調(diào)用 onNewIntent() 方法來實現(xiàn)重用實例嗽上。重用時次舌,直接讓該 Activity 的實例回到棧頂,并且移除之前它上面的所有 Activity 實例兽愤。如果棧中不存在這樣的實例彼念,則和 standard 模式相同挪圾。即: A ->B -> C -> D -> B,此時棧內(nèi)變成了 A -> B逐沙。而 A -> B -> C哲思,棧內(nèi)還是 A -> B -> C。使用場景:瀏覽器的主頁面吩案,或者大部分 APP 的主頁面棚赔。
圖片來源于網(wǎng)絡(luò)
  • singleInstance
    在一個新棧中創(chuàng)建該 Activity 的實例,并讓多個應(yīng)用共享該棧中的該 Activity 實例徘郭。一旦該模式的 Activity 實例已經(jīng)存在于某個棧中靠益,任何應(yīng)用再激活該 Activity 時都會重用該棧中的實例,是的残揉,依然是調(diào)用 onNewIntent() 方法捆毫。其效果相當(dāng)于多個應(yīng)用共享一個應(yīng)用,不管是誰激活冲甘,該 Activity 都會進入同一個應(yīng)用中绩卤。但值得引起注意的是:singleInstance 不要用于中間頁面,如果用戶中間頁面江醇,跳轉(zhuǎn)會出現(xiàn)很難受的問題濒憋。 這個在實際開發(fā)中我暫未遇到過,不過 Android 系統(tǒng)的來電頁面陶夜,多次來電均是使用的同一個 Activity 凛驮。
圖片來源于網(wǎng)絡(luò)

四種模式的背書式理解記憶講完了,你認為這樣就結(jié)束了嗎条辟?

對黔夭,我也一度是這樣認為的。

再說說我們的 Intent 標簽

我們除了需要知道在 AndroidManifest.xml 里面設(shè)置 android:launchMode 屬性羽嫡,我們還需要了解下面這幾個 Intent 標簽的用法本姥。

我們當(dāng)然可以選擇看看官方文檔 Tasks and Back Stack (你可能需要梯子)。

在 Android 中杭棵,我們除了在清單文件 AndroidManifest.xml 中配置 launchMode婚惫,當(dāng)然可以用 Intent 標簽說事兒。啟動 Activity 魂爪,我們需要傳遞一個 Intent先舷,完全可以通過設(shè)置 Intent.setFlags(int flags) 來設(shè)置啟動的 Activity 的啟動模式。

需要注意的是:通過代碼來設(shè)置 Activity 的啟動模式的方式滓侍,優(yōu)先級比清單文件設(shè)置更高蒋川。

  • FLAG_ACTIVITY_NEW_TASK
    這個標識會使新啟動的 Activity 獨立創(chuàng)建一個 Task。

  • FLAG_ACTIVITY_CLEAR_TOP
    這個標識會使新啟動的 Activity 檢查是否存在于 Task 中撩笆,如果存在則清除其之上的 Activity捺球,使它獲得焦點街图,并不重新實例化一個 Activity,一般結(jié)合 FLAG_ACTIVITY_NEW_TASK 一起使用懒构。

  • FLAG_ACTIVITY_SINGLE_TOP
    等同于在 launcherMode 屬性設(shè)置為 singleTop餐济。

nanchen

前面講了這么多,似乎相當(dāng)全面了胆剧,但你以為這樣就結(jié)束了絮姆?No,面試官一般情況下已經(jīng)不會這么問你了秩霍,這樣問你完全可以背出來篙悯。

面試官怎么問 Activity 的啟動模式(launchMode)?

怎么問铃绒?

1鸽照、設(shè)置為 singleTask 的啟動模式,當(dāng) Activity 的實例已經(jīng)存在時颠悬,再啟動它矮燎,它的哪個回調(diào)函數(shù)會被執(zhí)行?我們可以在哪個回調(diào)中處理新的 Intent 協(xié)帶的參數(shù)赔癌?(通過 startActivity(Intent) 方式啟動)

2诞外、設(shè)置為 singleTop 的啟動模式,當(dāng) Activity 的實例已經(jīng)存在于 Task 的棧頂灾票,我們可以在哪個回調(diào)中處理新的 Intent 協(xié)帶的參數(shù)峡谊?(在當(dāng)前 Activity 中從通知欄點擊再跳轉(zhuǎn)到此 Activity 就是這種在棧頂?shù)那闆r)

這兩個問題如果你看了上面的,一定對你來說實在太簡單了刊苍。面試官只是想直接考察你是否真正做過這樣的設(shè)置既们,或者是否知道 onNewIntent() 這個方法的存在。

有沒有其他想說的正什?

有啥纸。

之前在「柳學(xué)兄」的文章中看到過這樣一種情況,發(fā)現(xiàn)之前同事寫的代碼導(dǎo)致了這樣一個問題埠忘。

startActivityForResult 啟動一個 Activity脾拆,還沒有開始界面跳轉(zhuǎn),直接就執(zhí)行了 onActivityResult()莹妒。

不知道有沒有人也遇到過這樣的問題,但我想遇到這個問題的時候绰上,你一樣會因此而抓耳撓腮旨怠。(可能是因為我們一般在排查問題的時候,很少去關(guān)注配置清單文件 AndroidManifests.xml蜈块。)

我們在 Activity.java 的 startActivityForResult() 方法中可以看到這樣一串說明鉴腻。

nanchen

很多人出現(xiàn)這個問題迷扇,確實是因為 startActivityForResult() 啟動的 Activity 設(shè)置了 singleTask 的啟動模式。

好在 Android 5.0 以后爽哎,修正了這個問題蜓席。不過當(dāng)你在 Intent 中設(shè)置 FLAG_ACTIVITY_NEW_TASK 后還是會出現(xiàn)這樣的問題。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

注意:MainActivity 的 onResume() 也會被觸發(fā)课锌。因為 onActivityResult() 被執(zhí)行時厨内,它會重新獲得焦點。很多人也會遇到 onResume() 被無故調(diào)用渺贤,也許就是這種情況雏胃。

所以,最終我們發(fā)現(xiàn)只要是不和原來的 Activity 在同一個 Task 就會產(chǎn)生這種立即執(zhí)行 onActivityResult() 的情況志鞍,從原代碼也可以得到驗證瞭亮,詳情查看 ActivityStackSupervisor.java

小結(jié)

關(guān)于 Activity 的啟動模式相關(guān)的問題固棚,其實還會有很多種考察你掌握情況的問法统翩,建議采用 STAR 法則 進行面試回答。其實只要你掌握了實質(zhì)此洲,后面的運用只看你個人的運用能力和創(chuàng)新了唆缴。

做不完的開源,寫不完的矯情黍翎。歡迎掃描下方二維碼或者公眾號搜索「nanchen」關(guān)注我的微信公眾號面徽,目前多運營 Android ,盡自己所能為你提升匣掸。如果你喜歡趟紊,為我點贊分享吧~


nanchen
最后編輯于
?著作權(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
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纹磺,“玉大人帖烘,你說我怎么就攤上這事¢涎睿” “怎么了秘症?”我有些...
    開封第一講書人閱讀 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)容