日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android Activity启动模式总结

發(fā)布時(shí)間:2025/3/20 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Activity启动模式总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介

Activity 作為 Android 四大組件之一,幾乎是被接觸得最多的。Activity 中有個(gè)啟動(dòng)模式的概念,分別是 standard、singleTop、singleTask 以及 singleinstance,這篇文章總結(jié)一下這四種啟動(dòng)模式的特點(diǎn)。

任務(wù)棧

當(dāng)我們打開一個(gè) APP,第一個(gè)出現(xiàn)的 Activity 是我們指定的默認(rèn) Activity,通過這個(gè) Activity 可以跳轉(zhuǎn)到其它 Activity,按返回鍵可以依次返回到上一個(gè) Activity。這是因?yàn)橄到y(tǒng)把我們打開的 Activity 放在一個(gè)任務(wù)棧中。打開第一個(gè) Activity 時(shí),系統(tǒng)會(huì)新建一個(gè)任務(wù)棧,如果繼續(xù)打開新的 Activity,會(huì)創(chuàng)建新 Activity 的實(shí)例并且放到任務(wù)棧的棧頂,返回時(shí)將棧頂?shù)?Activity 出棧,新的棧頂 Activity 將呈現(xiàn)在界面上,過程如下圖。

這是默認(rèn)情況下的任務(wù)的入棧出棧,如果指定了不同的啟動(dòng)模式將會(huì)有不同的表現(xiàn)。

standard

standard 是標(biāo)準(zhǔn)啟動(dòng)模式,當(dāng)我們沒有指定 Activity 的啟動(dòng)模式時(shí),默認(rèn)就是這種模式。在 standard 模式下,每次啟動(dòng)一個(gè) Activity 都會(huì)創(chuàng)建一個(gè)新的實(shí)例,它的 onCreate、onStart 以及 onResume均會(huì)被調(diào)用。這個(gè)新創(chuàng)建的 Activity將會(huì)放在啟動(dòng)它的 Activity 所在的任務(wù)棧的棧頂。

  • 比如 Activity A 在棧 S ,它啟動(dòng)了 Activity B(standard 模式),那么 B 將會(huì)進(jìn)入 A 所在的棧 S。
  • 如果在沒有任務(wù)棧的情況下啟動(dòng) standard 模式的 Activity,比如在 Service 中,此時(shí)新的 Activity 沒有任務(wù)棧可入,會(huì)出現(xiàn)異常:
    Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

    此時(shí)應(yīng)該為這個(gè) Activity 指定 FLAG_ACTIVITY_NEW_TASK,這樣就會(huì)新建一個(gè)任務(wù)棧。

singleTop

singleTop 是棧頂復(fù)用模式。在這種模式下,如果新啟動(dòng)的 Activity 已經(jīng)在任務(wù)棧的棧頂了,那么就不會(huì)重新創(chuàng)建新的實(shí)例,而是調(diào)用這個(gè) Activity 的 onPause、onNewIntent 以及 onResume 方法。如果新啟動(dòng)的 Activity 不是位于棧頂,那么還是會(huì)重新創(chuàng)建。

  • 比如現(xiàn)在棧內(nèi)情況是 ABCD 四個(gè)Activity,A 位于棧底,D 位于棧頂。如果 D 的啟動(dòng)模式為 singleTop,那么不會(huì)再次創(chuàng)建 D 的實(shí)例,棧內(nèi)依然是 ABCD。
  • 如果上面的 D 為 standard 啟動(dòng)模式,那么棧內(nèi)將變?yōu)?ABCDD。

singleTask

singleTask 是棧內(nèi)復(fù)用模式。這是最復(fù)雜的一種模式,因?yàn)樗赡苌婕暗蕉鄠€(gè)棧。當(dāng)一個(gè)具有 singleTask 模式的 Activity 啟動(dòng)后,比如 Activity A,系統(tǒng)會(huì)首先尋找是否存在所需的任務(wù)棧,如果不存在,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建 A 的實(shí)例后把 A 放入到棧中。如果存在 A 所需要的任務(wù)棧,這時(shí)要看 A 是否在棧中有實(shí)例存在,如果有,那么系統(tǒng)就會(huì)把它調(diào)到棧頂并且調(diào)用它的 onNewIntent 方法,如果不存在,就創(chuàng)建 A 的實(shí)例并把 A 壓入棧中。這里所說的 A 所需要的任務(wù)棧是什么意思呢?其實(shí) Activity 是可以指定自己想要的任務(wù)棧的名字的,通過一個(gè)參數(shù):TaskAffinity,默認(rèn)情況下,所有的 Activity 所需要的任務(wù)棧的名字為應(yīng)用的包名。

  • 如果任務(wù)棧 S1 中的情況為 ABC,這個(gè)時(shí)候 Activity D 以 singleTask 模式請(qǐng)求啟動(dòng),它需要的任務(wù)棧為 S2,由于 S2 和 D 的實(shí)例均不存在,所以系統(tǒng)就會(huì)先創(chuàng)建任務(wù)棧 S2,然后在創(chuàng)建 D 的實(shí)例并將其入棧到 S2
  • 如果上面 D 所需的任務(wù)棧為 S1,那么因?yàn)?S1 已經(jīng)存在,所以系統(tǒng)直接創(chuàng)建 D 的實(shí)例并且入棧到 S1。
  • 如果 D 所需的任務(wù)棧為 S1,但是 S1 中的情況為 ADBC,此時(shí) D 不會(huì)重新創(chuàng)建,而是把 D 切換到棧頂并調(diào)用 onNewIntent 方法。那 B 和 C 怎么辦? 它們會(huì)全部出棧,相當(dāng)于 clearTop 效果。

singleInstance

singleInstance 是單實(shí)例模式。這種模式是 singleTask 的加強(qiáng)版,它除了具有 singleTask 的所有特性外,還加強(qiáng)了一點(diǎn),那就是此種模式的 Activity 只能單獨(dú)位于一個(gè)任務(wù)棧中。

  • 比如 Activity A 是 singleInstance 模式,當(dāng) A 啟動(dòng)后,系統(tǒng)會(huì)創(chuàng)建一個(gè)新的任務(wù)棧,然后 A 獨(dú)自在這個(gè)新的任務(wù)棧中,由于棧內(nèi)復(fù)用的特性,后續(xù)的請(qǐng)求均不會(huì)創(chuàng)建新的 Activity,除非這個(gè)棧被銷毀了。

總結(jié)

Activity 的四種啟動(dòng)模式就是這樣,除了 singleTask 稍微有點(diǎn)復(fù)雜,其它都很好理解。有的時(shí)候會(huì)出現(xiàn)多個(gè)任務(wù)棧的情況,比如現(xiàn)在有兩個(gè)任務(wù)棧(如下圖),前臺(tái)的任務(wù)棧情況為 Activity1 和 Activity2, 而后臺(tái)任務(wù)棧的情況為 ActivityX 和 ActivityY,假設(shè) XY 的啟動(dòng)模式均為 singleTAsk。現(xiàn)在啟動(dòng)Y, 那么整個(gè)后臺(tái)任務(wù)棧都被切換到前臺(tái),這時(shí)候的后退列表變?yōu)?12XY。當(dāng)按返回鍵的時(shí)候,Activity 會(huì)依次出棧。

參考

  • Android 開發(fā)藝術(shù)探索
  • http://developer.android.com/...
  • 如果我的文章對(duì)您有幫助,不妨點(diǎn)個(gè)贊鼓勵(lì)一下(^_^)

    總結(jié)

    以上是生活随笔為你收集整理的Android Activity启动模式总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。