singleTask啟動(dòng)模式引發(fā)的問(wèn)題和感悟

1.問(wèn)題描述

今天碰到了一個(gè)問(wèn)題,當(dāng)一個(gè)Activity的啟動(dòng)模式為SingleTask的時(shí)候,Activity間進(jìn)行跳轉(zhuǎn)的時(shí)候,在該Activity的onCreate()方法里接收不到Bundle攜帶過(guò)來(lái)的值,通過(guò)這個(gè)小問(wèn)題也讓我明白了學(xué)習(xí)啟動(dòng)模式的重要性。

在解決這個(gè)問(wèn)題之前,我們先來(lái)看一種情況,假設(shè)現(xiàn)在有ABCDE五個(gè)ActivIty,只有B的啟動(dòng)模式是singleTask,其余Activty是標(biāo)準(zhǔn)模式,Activity跳轉(zhuǎn)的順序是ABCDEAB,問(wèn)現(xiàn)在棧中還有那幾個(gè)Activity,知道singleTask原理的小伙伴們很容易知答案是A和B。

2.找原因

我們先來(lái)對(duì)比一下,standard標(biāo)準(zhǔn)模式和 singleTask 棧內(nèi)復(fù)用模式:

1.如果ABCDE這五個(gè)Activity都是標(biāo)準(zhǔn)啟動(dòng)模式,那依次執(zhí)行完跳轉(zhuǎn)Activity:ABCDEAB,棧內(nèi)的情況是這樣的:


情形1

標(biāo)準(zhǔn)啟動(dòng)模式也是系統(tǒng)默認(rèn)的啟動(dòng)模式,每啟動(dòng)一個(gè)Activity,都會(huì)重新創(chuàng)建一個(gè)實(shí)例,不管這個(gè)實(shí)例是否存在,并且我們知道任務(wù)棧是"先進(jìn)后出的",所以先進(jìn)棧的A位于棧底,最后一個(gè)Activity B位于棧頂。

2.當(dāng)B Acticity的啟動(dòng)模式是singleTask 棧內(nèi)復(fù)用模式時(shí)候,棧內(nèi)的情況是這樣的:


情形2(a)

因?yàn)锽 的實(shí)例在棧內(nèi)存在,所以再次啟動(dòng)的時(shí)候,就不會(huì)重新創(chuàng)建實(shí)例了,所以B 回到棧頂,并且B 上面的 實(shí)例會(huì)被移出棧,最終任務(wù)棧內(nèi)的情況是這樣的:


情形2(b)

回到我開頭說(shuō)的那個(gè)問(wèn)題,啟動(dòng)一個(gè) 啟動(dòng)模式為 SingleTask 的Activity,為什么會(huì)在onCreate()方法里,拿不到Bundle傳遞的值?

原因也很簡(jiǎn)單,假設(shè)在任務(wù)棧中存在該Activity的實(shí)例,再次啟動(dòng)的時(shí)候,也就不會(huì)重新去創(chuàng)建它的實(shí)例,onCreate方法并沒有執(zhí)行,也就獲取不到Bundle傳遞過(guò)來(lái)的值。此時(shí),我們需要重寫 onNewIntent()方法,系統(tǒng)會(huì)回調(diào)其onNewIntent方法,并將 onNewIntent 接收的 intent設(shè)置給 Activity。之后,我們可以在 onStart()方法中接收Bundle傳遞過(guò)來(lái)的值。

假設(shè)任務(wù)棧內(nèi)不存在該Activity的實(shí)例,就會(huì)重新創(chuàng)建,其生命周期方法onCreate(),onStart(),onResume() 都會(huì)正常執(zhí)行。

3.感悟

Activity作為四大組件之一,其重要性不言而喻,除了生命周期之外,它的啟動(dòng)模式也是一個(gè)重點(diǎn)和難點(diǎn),找工作面試被問(wèn)的概率還是很大,當(dāng)然更重要的是,我們?nèi)粘i_發(fā)工作的時(shí)候,為了滿足某些項(xiàng)目的特殊需求,就必須使用到Activity的啟動(dòng)模式,所以我們必須要掌握其四種啟動(dòng)模式。

Android技術(shù)討論Q群: 947460837?

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

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

  • 一、概述 Activity 作為與用戶交互的一個(gè)窗口,是使用非常頻繁的一個(gè)基本組件。Android系統(tǒng)是通過(guò)Act...
    三也視界閱讀 2,402評(píng)論 3 11
  • 第一章主要講了以下幾個(gè)知識(shí)點(diǎn): Activity生命周期 Activity的啟動(dòng)模式 IntentFilter匹配...
    Utte閱讀 1,285評(píng)論 0 3
  • 登錄 小豬快跑22 關(guān)注 一個(gè)實(shí)例讓你徹底明白Activity的4種啟動(dòng)模式 原創(chuàng) 2017年08月03日 14:...
    奔跑的蟲子閱讀 645評(píng)論 0 0
  • 【Android Activity】 什么是 Activity? 四大組件之一,通常一個(gè)用戶交互界面對(duì)應(yīng)一個(gè) ac...
    Rtia閱讀 3,927評(píng)論 3 18
  • 在一個(gè)項(xiàng)目中會(huì)包括著多個(gè)Activity,系統(tǒng)中使用任務(wù)棧來(lái)存儲(chǔ)創(chuàng)建的Activity實(shí)例,任務(wù)棧是一種“后進(jìn)先出...
    CQ_TYL閱讀 860評(píng)論 0 4

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