日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

android activity啟動(dòng)流程 全網(wǎng)最全Android開發(fā)筆記

一.先理解棧的概念(放置Activity實(shí)例的容器)
1.Task(線性表)
任務(wù)棧Task,用來(lái)放置Activity實(shí)例的容器,先進(jìn)后出,主要有2個(gè)基本操作:壓棧和出棧,其所存放的Activity是不支持重新排序的,只能根據(jù)壓棧和出棧操作更改Activity的順序 。
2.app啟動(dòng)時(shí),系統(tǒng)會(huì)為它默認(rèn)創(chuàng)建一個(gè)對(duì)應(yīng)的Task,用來(lái)放置根Activity
ps: Activity之間可以相互啟動(dòng),當(dāng)前應(yīng)用的Activity可以去啟動(dòng)其他應(yīng)用的Activity(相機(jī)),那么就是說(shuō)棧的功能可以把其它app的activity加入到自己app的棧里.
所以Task可以理解為負(fù)責(zé)管理所有用到的Activity實(shí)例的棧,但是.android5.0之后 跨進(jìn)程調(diào)用activity,這個(gè)activity會(huì)被放入到一個(gè)新的棧中 。
二.啟動(dòng)模式(只能根據(jù)壓棧和出棧操作更改Activity的順序,所以是啟動(dòng)模式是以哪種姿勢(shì)入棧)
通過(guò)在AndroidManifest文件中的屬性andorid:launchMode來(lái)設(shè)置或者通過(guò)Intent的flag來(lái)設(shè)置
1.standard(常規(guī)姿勢(shì)入棧)
默認(rèn)模式 。在這個(gè)模式下,都會(huì)默認(rèn)創(chuàng)建一個(gè)新的實(shí)例 。因此,在這種模式下,可以有多個(gè)相同的實(shí)例,也允許多個(gè)相同Activity疊加 。應(yīng)用場(chǎng)景:絕大多數(shù)Activity 。
2.singleTop(棧頂復(fù)用姿勢(shì)入棧)==FLAG_ACTIVITY_SINGLE_TOP
棧頂復(fù)用模式,如果要開啟的activity在任務(wù)棧的頂部已經(jīng)存在,就不會(huì)創(chuàng)建新的實(shí)例,而是調(diào)用 onNewIntent() 方法 。避免棧頂?shù)腶ctivity被重復(fù)的創(chuàng)建 。應(yīng)用場(chǎng)景:在通知欄點(diǎn)擊收到的通知,然后需要啟動(dòng)一個(gè)Activity,這個(gè)Activity就可以用singleTop,否則每次點(diǎn)擊都會(huì)新建一個(gè)Activity 。某個(gè)場(chǎng)景下連續(xù)快速點(diǎn)擊,啟動(dòng)了兩個(gè)Activity 。如果這個(gè)時(shí)候待啟動(dòng)的Activity使用 singleTop模式也是可以避免這個(gè)Bug的 。
3.singleTask(棧內(nèi)復(fù)用姿勢(shì)入棧)==FLAG_ACTIVITY_CLEAR_TOP
棧內(nèi)復(fù)用模式,activity只會(huì)在任務(wù)棧里面存在一個(gè)實(shí)例 。如果要激活的activity,在任務(wù)棧里面已經(jīng)存在,就不會(huì)創(chuàng)建新的activity,而是復(fù)用這個(gè)已經(jīng)存在的activity,調(diào)用 onNewIntent() 方法,并且清空這個(gè)activity任務(wù)棧上面所有的activity(CLEAR_TOP回到棧頂) 。應(yīng)用場(chǎng)景:大多數(shù)App的主頁(yè) 。對(duì)于大部分應(yīng)用,當(dāng)我們?cè)谥鹘缑纥c(diǎn)擊回退按鈕的時(shí)候都是退出應(yīng)用,那么當(dāng)我們第一次進(jìn)入主界面之后,主界面位于棧底,以后不管我們打開了多少個(gè)Activity,只要我們?cè)俅位氐街鹘缑妫紤?yīng)該使用將主界面Activity上所有的Activity移除的方式來(lái)讓主界面Activity處于棧頂,而不是往棧頂新加一個(gè)主界面Activity的實(shí)例,通過(guò)這種方式能夠保證退出應(yīng)用時(shí)所有的Activity都能報(bào)銷毀 。
4.singleInstance(不入棧)
單一實(shí)例模式,整個(gè)手機(jī)操作系統(tǒng)里面只有一個(gè)實(shí)例存在 。不同的應(yīng)用去打開這個(gè)activity 共享公用的同一個(gè)activity 。他會(huì)運(yùn)行在自己?jiǎn)为?dú),獨(dú)立的任務(wù)棧里面,并且任務(wù)棧里面只有他一個(gè)實(shí)例存在 。應(yīng)用場(chǎng)景:呼叫來(lái)電界面 。這種模式的使用情況比較罕見,在Launcher中可能使用 。或者你確定你需要使Activity只有一個(gè)實(shí)例 。建議謹(jǐn)慎使用 。
【android activity啟動(dòng)流程 全網(wǎng)最全Android開發(fā)筆記】5.FLAG_ACTIVITY_NO_HISTORY
Activity使用這種模式啟動(dòng)Activity,當(dāng)該Activity啟動(dòng)其他Activity后,該Activity就消失了,不會(huì)保留在Activity棧中 。
三.FLAG_ACTIVITY_NEW_TASK這個(gè)屬性原則是:設(shè)置此狀態(tài),首先會(huì)查找是否存在和被啟動(dòng)的Activity具有相同的親和性的任務(wù)棧(即taskAffinity,同一個(gè)應(yīng)用程序中的activity的親和性一樣),如果有,則直接把這個(gè)棧整體移動(dòng)到前臺(tái),并保持棧中的狀態(tài)不變,即棧中的activity順序不變,如果沒(méi)有,則新建一個(gè)棧來(lái)存放被啟動(dòng)的activity 。1.getTaskId();獲取當(dāng)前activity所處的棧

推薦閱讀