面試題一天一題——第五天 · (Activity的啟動模式)

在使用編寫界面時爵川,我們可能從來沒有關(guān)注過Activity的啟動模式敷鸦,其實默認(rèn)的啟動模式為標(biāo)準(zhǔn)的啟動模式(standard);在Activity任務(wù)棧中寝贡,標(biāo)準(zhǔn)的啟動模式會為每一個Activity創(chuàng)建一個實例轧膘,其實在很多需求中,這樣的使用明顯是不準(zhǔn)確的兔甘,我們應(yīng)該盡可能的將每個Activity的啟動模式設(shè)置正確以便程序更加健壯谎碍。

四大啟動模式如下:

standard
singleTop
singleTask
singleInstance


下面我們看看官方對啟動模式的解釋

啟動模式 用例 多個實例? 解釋
standard 大多數(shù) Activity 的正常啟動 默認(rèn)值洞焙。系統(tǒng)始終會在目標(biāo)任務(wù)中創(chuàng)建新的 Activity 實例并向其傳送 Intent蟆淀。
singleTop 大多數(shù) Activity 的正常啟動 有條件 如果目標(biāo)任務(wù)的頂部已存在一個 Activity 實例,則系統(tǒng)會通過調(diào)用該實例的 onNewIntent()方法向其傳送 Intent澡匪,而不是創(chuàng)建新的 Activity 實例熔任。
singleTask 專用啟動(不建議用作常規(guī)用途) 系統(tǒng)在新任務(wù)的根位置創(chuàng)建 Activity 并向其傳送 Intent。 不過唁情,如果已存在一個 Activity 實例疑苔,則系統(tǒng)會通過調(diào)用該實例的 onNewIntent()方法向其傳送 Intent,而不是創(chuàng)建新的 Activity 實例甸鸟。
singleInstance 專用啟動(不建議用作常規(guī)用途) 與“singleTask"”相同惦费,只是系統(tǒng)不會將任何其他 Activity 啟動到包含實例的任務(wù)中。 該 Activity 始終是其任務(wù)唯一僅有的成員抢韭。



看到上面的的解釋是否都明白呢薪贫?下面我們使用一個例子來說明一下使用方法, 創(chuàng)建了四個Activity刻恭,分別使用Standard瞧省、SingleTop、SingleTask鳍贾、SingleInstance 啟動模式鞍匾, 并且SingleTask作為程序的啟動Activity:

Manifest文件聲明.png

每個Activity都是同樣的代碼,獲取到當(dāng)前Task任務(wù)棧中的Activity數(shù)量以及跳轉(zhuǎn)到每個Activity的點擊事件:

class SingleTaskActivity : AppCompatActivity() {

    val TAG = "ActivityManagerDemo"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_single_task)

    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    fun getActivityStack(view: View) {
        var activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        var appTasks = activityManager.appTasks
        for (appTask in appTasks) {
            val taskInfo = appTask.taskInfo
            Log.d(TAG, taskInfo.numActivities.toString())
        }
    }

    fun standard(view: View) {
        // 跳轉(zhuǎn)到標(biāo)準(zhǔn)
        startActivity(Intent(this@SingleTaskActivity, StandardActivity::class.java))
    }

    fun singleInstance(view: View) {
        // 單例
        startActivity(Intent(this@SingleTaskActivity, SingleInstanceActivity::class.java))
    }

    fun singleTop(view: View) {
        // 棧頂
        startActivity(Intent(this@SingleTaskActivity, SingleTopActivity::class.java))
    }

    fun singleTask(view: View) {
        // 去除棧上
        startActivity(Intent(this@SingleTaskActivity, SingleTaskActivity::class.java))
    }
}

為了方便我們查看骑科,將Standard頁面設(shè)置為 1 橡淑, SingleTop 設(shè)置為 2 ,SingleTask 設(shè)置為 3纵散, SingleInstance設(shè)置為 4梳码;接下來測試Standard啟動模式隐圾,程序開始進(jìn)入到SingleTaskActivity。


SingleTask頁面.png

Standard 模式測試

按照 3 -> 1 -> 1-> 1->1 測試
09-29 09:15:27.036 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:1 棧id為:26
09-29 09:15:31.752 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:2 棧id為:26
09-29 09:15:33.486 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:3 棧id為:26
09-29 09:15:35.267 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:4 棧id為:26
09-29 09:15:37.236 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:5 棧id為:26

可以看到掰茶,每次跳轉(zhuǎn)都會生成一個StandardActivity實例暇藏!

SingleTop模式測試

按照 3 -> 1 -> 2-> 2 測試
09-29 09:16:10.076 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:1 棧id為:26
09-29 09:16:42.851 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:2 棧id為:26
09-29 09:16:46.896 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:3 棧id為:26
09-29 09:16:49.631 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:3 棧id為:26

在測試的時候,跳轉(zhuǎn)到2之后濒蒋,2已經(jīng)處于棧頂盐碱,再次點擊跳轉(zhuǎn)到SingleTop界面無變化,說明已經(jīng)復(fù)用了棧頂存在Activity沪伙。

SingleTask模式測試

按照 3 -> 1 -> 2-> 3 測試
09-29 09:18:27.561 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:1 棧id為:26
09-29 09:18:33.782 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:2 棧id為:26
09-29 09:18:40.754 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:3 棧id為:26
09-29 09:18:43.580 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:1 棧id為:26

當(dāng)兩個頁面跳轉(zhuǎn)完之后再次跳轉(zhuǎn)到SingleTask頁面瓮顽,獲取到棧內(nèi)的數(shù)量為1,說明了跳轉(zhuǎn)到SingleTask頁面的時候围橡,會將位于SingleTask棧上的所有頁面銷毀暖混。

SingleInstance模式測試

按照 3 -> 1 -> 2-> 4->1->1->4 測試
09-29 09:18:58.824 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:1 棧id為:26
09-29 09:19:06.654 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:2 棧id為:26
09-29 09:19:13.225 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:3 棧id為:26
09-29 09:19:17.038 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:1 棧id為:27
09-29 09:19:24.149 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:4 棧id為:26
09-29 09:19:28.156 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:5 棧id為:26
09-29 09:19:33.445 9208-9208/com.ellison.manager D/ActivityManagerDemo: 當(dāng)前任務(wù)棧中Activity數(shù)量為:1 棧id為:27

SingleInstance模式可能比較難理解,上面沒有說到棧id翁授,這是app給每個task設(shè)置的棧id拣播,一般一個應(yīng)用存在同一個棧中,所以id相同收擦,而SingleInstance模式在系統(tǒng)在只存在一個實例贮配,而且還會給Activity分配一個不同的任務(wù)棧,所以當(dāng)我們第一次跳轉(zhuǎn)到SingleInstance的Activity時塞赂,會為Activity創(chuàng)建一個新的棧id泪勒,等同于該Activity和其他Activity分隔開了,而后面我們再次回到Standard模式的Activity時宴猾,又回到了之前的任務(wù)棧圆存。

總結(jié)

面試首先說出Activity啟動模式,再結(jié)合實用場景鳍置,比如SIngleTask模式:現(xiàn)在許多的應(yīng)用都是使用Tab頁面加載Fragment辽剧,此時MainTabActivity就可以使用SingleTask模式送淆,因為當(dāng)使用多級頁面跳轉(zhuǎn)之后再回到MainTabActivity税产,此時在回退,會發(fā)現(xiàn)有多個MainTabActivity偷崩,這樣設(shè)計肯定是不合理的辟拷,使用SingleTask模式則很好的解決了這一問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阐斜,一起剝皮案震驚了整個濱河市衫冻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谒出,老刑警劉巖隅俘,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻奠,死亡現(xiàn)場離奇詭異,居然都是意外死亡为居,警方通過查閱死者的電腦和手機碌宴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒙畴,“玉大人贰镣,你說我怎么就攤上這事∩拍” “怎么了碑隆?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹬音。 經(jīng)常有香客問我上煤,道長,這世上最難降的妖魔是什么著淆? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任楼入,我火速辦了婚禮,結(jié)果婚禮上牧抽,老公的妹妹穿的比我還像新娘嘉熊。我一直安慰自己,他們只是感情好扬舒,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布阐肤。 她就那樣靜靜地躺著,像睡著了一般讲坎。 火紅的嫁衣襯著肌膚如雪孕惜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天晨炕,我揣著相機與錄音衫画,去河邊找鬼。 笑死瓮栗,一個胖子當(dāng)著我的面吹牛削罩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播费奸,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼弥激,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了愿阐?” 一聲冷哼從身側(cè)響起微服,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缨历,沒想到半個月后以蕴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糙麦,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年丛肮,在試婚紗的時候發(fā)現(xiàn)自己被綠了喳资。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡腾供,死狀恐怖仆邓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伴鳖,我是刑警寧澤节值,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站榜聂,受9級特大地震影響搞疗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜须肆,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一匿乃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豌汇,春花似錦幢炸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逻澳,卻和暖如春闸天,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斜做。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工苞氮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓤逼。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓笼吟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抛姑。 傳聞我的和親對象是個殘疾皇子赞厕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容