Android Activity 啟動(dòng)模式

前言:

Activity 代碼屬于Application,但是Task屬于Android操作系統(tǒng)
(科學(xué)沒有國(guó)界耻涛,科學(xué)家卻有祖國(guó))醇王。

Tasks

啟動(dòng)方式(新建)
通知:系統(tǒng)朵你,自己
其他:schema,第三方應(yīng)用start

啟動(dòng)方式(恢復(fù))
Navigation 按鈕啟動(dòng) : Task一定存在

  1. Back按鍵
  2. 標(biāo)題欄back

Launcher 啟動(dòng)

  1. Task 不存在
  2. Task 已經(jīng)存在

怎樣查看正在運(yùn)行的Tasks

通過手機(jī)界面:手機(jī)的navigations按鈕蝴光。

通過代碼命令查看:

adb shell dumpsys activity activities | sed -En -e '/Stack #/p' -e '/Running activities/,/Run #0/p'

打印

    「?  ShareHappy」 adb shell dumpsys activity activities | sed -En -e '/Stack #/p' -e '/Running activities/,/Run #0/p'
    Stack #24: type=standard mode=fullscreen
    Running activities (most recent first):
    TaskRecord{33f3efa #480 A=top.zcwfeng.sharehappy U=0 StackId=24 sz=1}
    Run #0: ActivityRecord{5f17539 u0 top.zcwfeng.sharehappy/.TestActivity t480}
    Stack #0: type=home mode=fullscreen
    Running activities (most recent first):
    TaskRecord{9640131 #2 I=com.google.android.apps.nexuslauncher/.NexusLauncherActivity U=0 StackId=0 sz=1}
    Run #0: ActivityRecord{f6c8fd1 u0 com.google.android.apps.nexuslauncher/.NexusLauncherActivity t2}

Activity 和 Fragment

Fragment 動(dòng)態(tài)加載
1嘱能,獲得FragmentMananger通過getFragmentManager

  1. 獲得FragmentTransaction對(duì)象fm.beginTransaction()
  2. 調(diào)用add()或者replace方法加載Fragment;
    add(要傳入的容器,fragment對(duì)象)
  3. 調(diào)用commit()提交事務(wù)虱疏。(還有remove等)

Fragment 靜態(tài)加載

  1. 定義Fragment布局文件xml
  2. 自定義Fragment類惹骂,繼承Fragment類或子類,實(shí)現(xiàn)onCreateView(),通過inflate.inflate加載布局文件做瞪,返回View
  3. 在需要加載Fragment的Activity中對(duì)應(yīng)的布局文件中加入<fragment name=權(quán)限定名稱
  4. Activity 調(diào)用setContentView加載布局文件

Activity 聲明周期


onRestart
onCreate--------------->onStart-------------->onResume
----------------------------------------------------- |
創(chuàng)建对粪,銷毀                   是否可見            是否可編輯
----------------------------------------------------- |
onDestroy--------------->onStop<--------onPause<------


在撇一眼生命周期

[圖片上傳失敗...(image-877ba-1594368779549)]

相鄰狀態(tài)之間的區(qū)別

1.onCreate和onStart之間有什么區(qū)別?
(1)可見與不可見的區(qū)別装蓬。前者不可見著拭,后者可見。
(2)執(zhí)行次數(shù)的區(qū)別牍帚。onCreate方法只在Activity創(chuàng)建時(shí)執(zhí)行一次儡遮,而onStart方法在Activity的切換以及按Home鍵返回桌面再切回應(yīng)用的過程中被多次調(diào)用。因此Bundle數(shù)據(jù)的恢復(fù)在onStart中進(jìn)行比onCreate中執(zhí)行更合適暗赶。
(3)onCreate能做的事onStart其實(shí)都能做鄙币,但是onstart能做的事onCreate卻未必適合做。如前文所說的蹂随,setContentView和資源初始化在兩者都能做十嘿,然而像動(dòng)畫的初始化在onStart中做比較好。

2.onStart方法和onResume方法有什么區(qū)別岳锁?
(1)是否在前臺(tái)绩衷。onStart方法中Activity可見但不在前臺(tái),不可交互,而在onResume中在前臺(tái)咳燕。
(2)職責(zé)不同勿决,onStart方法中主要還是進(jìn)行初始化工作,而onResume方法招盲,根據(jù)官方的建議剥险,可以做開啟動(dòng)畫和獨(dú)占設(shè)備的操作。

3.onPause方法和onStop方法有什么區(qū)別宪肖?
(1)是否可見表制。onPause時(shí)Activity可見,onStop時(shí)Activity不可見控乾,但Activity對(duì)象還在內(nèi)存中么介。(2)在系統(tǒng)內(nèi)存不足的時(shí)候可能不會(huì)執(zhí)行onStop方法,因此程序狀態(tài)的保存蜕衡、獨(dú)占設(shè)備和動(dòng)畫的關(guān)閉壤短、以及一些數(shù)據(jù)的保存最好在onPause中進(jìn)行,但要注意不能太耗時(shí)慨仿。

4.onStop方法和onDestroy方法有什么區(qū)別久脯?
onStop階段Activity還沒有被銷毀,對(duì)象還在內(nèi)存中镰吆,此時(shí)可以通過切換Activity再次回到該Activity帘撰,而onDestroy階段Acivity被銷毀

A啟動(dòng)B,B返回A

onNewIntent 聲明周期

? 注意有特殊情況的時(shí)候
1万皿、只對(duì)singleTop摧找,singleTask,singleInstance有效牢硅,大多數(shù)情況standard每次都是新建蹬耘,所以不存在onNewIntent
2减余、只對(duì)startActivity有效综苔,對(duì)于從Navigation切換回來的恢復(fù)無效;

onNewIntent周期

)

Activity 的啟動(dòng)模式

1位岔、standard 默認(rèn)模式
系統(tǒng)在啟動(dòng) Activity 的任務(wù)中創(chuàng)建 Activity 的新實(shí)例并向其傳送 Intent如筛。Activity 可以多次實(shí)例化,不管這個(gè)實(shí)例是否已經(jīng)存在赃承,而每個(gè)實(shí)例均可屬于不同的任務(wù)妙黍,并且一個(gè)任務(wù)可以擁有多個(gè)實(shí)例。這種模式的 Activity 被創(chuàng)建時(shí)它的 onCreate瞧剖、onStart 都會(huì)被調(diào)用。這是一種典型的多實(shí)例實(shí)現(xiàn),一個(gè)任務(wù)棧中可以有多個(gè)實(shí)例抓于,每個(gè)實(shí)例也可以屬于不同的任務(wù)棧做粤。在這種模式下,誰啟動(dòng)了這個(gè) Activity捉撮,那么這個(gè) Activity 就運(yùn)行在啟動(dòng)它的那個(gè) Activity 所在的棧中怕品。

a、當(dāng)從非Activity的context啟動(dòng)activity時(shí)巾遭,需要帶new_task的flag肉康;
b、當(dāng)啟動(dòng)一個(gè)帶有affinity的activity灼舍,如果這個(gè)activity已經(jīng)有實(shí)例存在該task吼和,則不會(huì)重新創(chuàng)建;
c骑素、如果從應(yīng)用內(nèi)啟動(dòng)的standard activity的Affinity就是App默認(rèn)的Affinity炫乓,則會(huì)每次新建一個(gè)實(shí)例;

2. singleTop的啟動(dòng)模式
一個(gè)singleTop Activity 的實(shí)例可以無限多献丑,唯一的區(qū)別是如果在棧頂已經(jīng)有一個(gè)相同類型的Activity實(shí)例末捣,Intent不會(huì)再創(chuàng)建一個(gè)Activity,而是通過onNewIntent()被發(fā)送到現(xiàn)有的Activity创橄。

SingleTop 啟動(dòng)模式

3. SingleTask 啟動(dòng)模式
這是一種單實(shí)例模式箩做,在這種模式下,只要 Activity 在一個(gè)棧中存在妥畏,那么多次啟動(dòng)此 Activity 都不會(huì)重新創(chuàng)建實(shí)例卒茬,和 singleTop一樣,系統(tǒng)也會(huì)回調(diào)其 onNewIntent咖熟。當(dāng)一個(gè)具有 singleTask 模式的Activity請(qǐng)求啟動(dòng)后圃酵,比如 Activity A,系統(tǒng)首先會(huì)尋找是否存在 A 想要的任務(wù)棧馍管,如果不存在郭赐,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建 A 的實(shí)例后把 A 放到棧中确沸。如果存在 A 所需的任務(wù)棧捌锭,這時(shí)要看 A 是否在棧中有實(shí)例存在,如果有實(shí)例存在罗捎,那么系統(tǒng)就會(huì)把 A 調(diào)到棧頂并調(diào)用它的 onNewIntent 方法观谦,如果實(shí)例不存在,就創(chuàng)建 A 的實(shí)例并把 A 壓入棧中 桨菜。

singleTask周期

4. singleInstance 模式
與 singleTask 相同豁状,只是系統(tǒng)不會(huì)將任何其他 Activity 啟動(dòng)到包含實(shí)例的任務(wù)中捉偏。該 Activity 始終是其任務(wù)唯一僅有的成員;由此 Activity 啟動(dòng)的任何 Activity 均在單獨(dú)的任務(wù)中打開泻红。也就是有此種模式的 Activity 只能單獨(dú)地位于一個(gè)任務(wù)棧中

Intent Activity Flag

對(duì)應(yīng)的狀態(tài)

Intent Activity Flag

啟動(dòng)模式的應(yīng)用場(chǎng)景

singleTop

適合啟動(dòng)同類型的 Activity夭禽,例如:

  • 接收通知啟動(dòng)的內(nèi)容顯示頁面
  • 耗時(shí)操作返回頁面
  • 登錄頁面

singleTask

適合作為程序入口,例如:

  • WebView頁面
  • 掃一掃頁面
  • 確認(rèn)訂單界面
  • 付款界面

singleInstance

適合需要與程序分離開的頁面谊路,例如:

  • 鬧鈴的響鈴界面
  • 來電頁面
  • 鎖屏頁

推薦開源助記項(xiàng)目

TaskDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載讹躯,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末缠劝,一起剝皮案震驚了整個(gè)濱河市潮梯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惨恭,老刑警劉巖秉馏,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喉恋,居然都是意外死亡沃饶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門轻黑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糊肤,“玉大人,你說我怎么就攤上這事氓鄙」萑啵” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵抖拦,是天一觀的道長(zhǎng)升酣。 經(jīng)常有香客問我,道長(zhǎng)态罪,這世上最難降的妖魔是什么噩茄? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮复颈,結(jié)果婚禮上绩聘,老公的妹妹穿的比我還像新娘山卦。我一直安慰自己爹谭,他們只是感情好辆亏,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布割卖。 她就那樣靜靜地躺著,像睡著了一般湿痢。 火紅的嫁衣襯著肌膚如雪慕爬。 梳的紋絲不亂的頭發(fā)上膀斋,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天似将,我揣著相機(jī)與錄音获黔,去河邊找鬼蚀苛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肢执,可吹牛的內(nèi)容都是我干的枉阵。 我是一名探鬼主播译红,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼预茄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了侦厚?” 一聲冷哼從身側(cè)響起耻陕,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刨沦,沒想到半個(gè)月后诗宣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡想诅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年召庞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片来破。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篮灼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出徘禁,到底是詐尸還是另有隱情诅诱,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布送朱,位于F島的核電站娘荡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驶沼。R本人自食惡果不足惜炮沐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望回怜。 院中可真熱鬧大年,春花似錦、人聲如沸鹉戚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抹凳。三九已至遏餐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赢底,已是汗流浹背失都。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工柏蘑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粹庞。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓咳焚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親庞溜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子革半,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361