前言:
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一定存在
- Back按鍵
- 標(biāo)題欄back
Launcher 啟動(dòng)
- Task 不存在
- 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
- 獲得FragmentTransaction對(duì)象fm.beginTransaction()
- 調(diào)用add()或者replace方法加載Fragment;
add(要傳入的容器,fragment對(duì)象) - 調(diào)用commit()提交事務(wù)虱疏。(還有remove等)
Fragment 靜態(tài)加載
- 定義Fragment布局文件xml
- 自定義Fragment類惹骂,繼承Fragment類或子類,實(shí)現(xiàn)onCreateView(),通過inflate.inflate加載布局文件做瞪,返回View
- 在需要加載Fragment的Activity中對(duì)應(yīng)的布局文件中加入<fragment name=權(quán)限定名稱
- 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被銷毀
onNewIntent 聲明周期
? 注意有特殊情況的時(shí)候
1万皿、只對(duì)singleTop摧找,singleTask,singleInstance有效牢硅,大多數(shù)情況standard每次都是新建蹬耘,所以不存在onNewIntent
;
2减余、只對(duì)startActivity有效综苔,對(duì)于從Navigation切換回來的恢復(fù)無效;
)
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创橄。
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 壓入棧中 桨菜。
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)
啟動(dòng)模式的應(yīng)用場(chǎng)景
singleTop
適合啟動(dòng)同類型的 Activity夭禽,例如:
- 接收通知啟動(dòng)的內(nèi)容顯示頁面
- 耗時(shí)操作返回頁面
- 登錄頁面
singleTask
適合作為程序入口,例如:
- WebView頁面
- 掃一掃頁面
- 確認(rèn)訂單界面
- 付款界面
singleInstance
適合需要與程序分離開的頁面谊路,例如:
- 鬧鈴的響鈴界面
- 來電頁面
- 鎖屏頁