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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

Android

android任务栈的作用,Android 启动模式以及任务栈

發(fā)布時(shí)間:2025/3/19 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android任务栈的作用,Android 启动模式以及任务栈 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.Android 主要包含4種啟動(dòng)模式,下面分別介紹四種啟動(dòng)方式的特點(diǎn):

1)tandard 默認(rèn)的啟動(dòng)模式,標(biāo)準(zhǔn)模式

每開(kāi)啟一個(gè)Activity,就會(huì)在棧頂添加一個(gè)Activity實(shí)例。多次間隔或者直接啟動(dòng)一個(gè)甲Activity會(huì)添加多個(gè)甲的示例,可重復(fù)添加。(間隔 ABA, 直接 ACC或者AAA)

這里我們需要明白一個(gè)事情,Service和ApplicationContext是沒(méi)辦法直接開(kāi)啟一個(gè)新的Activity,因?yàn)橹挥蠥ctivity類型的Context的Activity才能開(kāi)啟,但還是有解決辦法的,那就是讓我們要開(kāi)的那個(gè)新的Activity設(shè)置為FLAG_ACTIVITY_NEW_TASK標(biāo)識(shí)。

2)singletop 單一頂部模式 (頂部不會(huì)重復(fù))

如果開(kāi)啟的Activity已經(jīng)存在一個(gè)實(shí)例在任務(wù)棧的頂部(僅限于頂部),再去開(kāi)啟這個(gè)Activity,任務(wù)棧不會(huì)創(chuàng)建新的Activity的實(shí)例了,而是復(fù)用已經(jīng)存在的這個(gè)Activity,onNewIntent方法被調(diào)用;之前打開(kāi)過(guò),但不是位于棧頂,那么還是會(huì)產(chǎn)生新的實(shí)例入棧,不會(huì)回調(diào)onNewIntent方法。

singleTask 單一任務(wù) (整個(gè)任務(wù)棧只有一個(gè)對(duì)應(yīng)自身的實(shí)例)

如果開(kāi)啟的甲Activity已經(jīng)存在一個(gè)實(shí)例在任務(wù)棧S1,再去開(kāi)啟這個(gè)Activity,位于棧頂則直接復(fù)用,回調(diào)onNewIntent方法;位于里面,也是復(fù)用,回調(diào)onNewIntent方法,復(fù)用的同時(shí)的是直接把自己上方的全部Activity都干掉。

singleInstance 單一實(shí)例(單例),任務(wù)棧里面自已自己一個(gè)人

當(dāng)啟動(dòng)一個(gè)啟動(dòng)模式為singleInstance的Activity時(shí)(之前沒(méi)啟動(dòng)過(guò)),這時(shí)系統(tǒng)將開(kāi)辟出另外一個(gè)任務(wù)棧,用于存放這個(gè)Activity,而且這個(gè)新的任務(wù)棧只能存放自身這唯一一個(gè)Activity。singleInstance頁(yè)面作為前臺(tái)任務(wù)打開(kāi)自己打開(kāi)自己,則復(fù)用,任務(wù)棧順序無(wú)變化;singleInstance頁(yè)面作為后臺(tái)任務(wù)棧,則切換成為前臺(tái)任務(wù)棧,無(wú)新實(shí)例產(chǎn)生,復(fù)用。

Activity任務(wù)棧

任務(wù)棧中包含了activity組件的對(duì)象,且任務(wù)棧中可以包含有某一個(gè)activity組件類型的多個(gè)實(shí)例對(duì)象。在任務(wù)棧中的activity組件不能被重排序,只能被壓棧和彈棧。

任務(wù)棧不是某個(gè)類型,也不是某一個(gè)元素,它是一組activity組件的組織形式。所以沒(méi)有辦法在不影響任務(wù)棧中的activity組件的情況下,單獨(dú)設(shè)置任務(wù)棧的參數(shù)。根activity的參數(shù)既是整個(gè)任務(wù)棧的參數(shù),它會(huì)影響任務(wù)棧中的所有activity組件。

當(dāng)某個(gè)應(yīng)用程序在前后臺(tái)切換的時(shí)候,實(shí)際上就是代表這個(gè)應(yīng)用程序的一個(gè)任務(wù)棧在前后臺(tái)切換。剛剛描述的行為是activity和任務(wù)棧的默認(rèn)行為,但也有辦法在很多方面對(duì)它進(jìn)行修改:

方法1:在發(fā)送的請(qǐng)求(即Intent對(duì)象)中設(shè)置一些標(biāo)記。

方法2:在manifest文件中,對(duì)接收請(qǐng)求(即Intent對(duì)象)的activity組件設(shè)置一些屬性。

在Intent對(duì)象中主要的標(biāo)志有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

在標(biāo)簽中,主要的屬性有:

taskAffinity

launchMode

allowTaskReparenting

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

Intent與啟動(dòng)模式相關(guān)的Flag簡(jiǎn)介

這里僅僅對(duì)幾個(gè)常用的與啟動(dòng)模式相關(guān)的Flag進(jìn)行介紹。

1)FLAG_ACTIVITY_NEW_TASK

在google的官方文檔中介紹,它與launchMode="singleTask"具有相同的行為。實(shí)際上,并不是完全相同!很少單獨(dú)使用FLAG_ACTIVITY_NEW_TASK,通常與FLAG_ACTIVITY_CLEAR_TASK或FLAG_ACTIVITY_CLEAR_TOP聯(lián)合使用。因?yàn)閱为?dú)使用該屬性會(huì)導(dǎo)致奇怪的現(xiàn)象,通常達(dá)不到我們想要的效果!

2)FLAG_ACTIVITY_SINGLE_TOP

在google的官方文檔中介紹,它與launchMode="singleTop"具有相同的行為。實(shí)際上,的確如此!單獨(dú)的使用FLAG_ACTIVITY_SINGLE_TOP,就能達(dá)到和launchMode="singleTop"一樣的效果。

3)FLAG_ACTIVITY_CLEAR_TOP

顧名思義,FLAG_ACTIVITY_CLEAR_TOP的作用清除"包含Activity的task"中位于該Activity實(shí)例之上的其他Activity實(shí)例。FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK兩者同時(shí)使用,就能達(dá)到 launchMode="singleTask"一樣的效果!

4)FLAG_ACTIVITY_CLEAR_TASK

FLAG_ACTIVITY_CLEAR_TASK的作用包含Activity的task。使用FLAG_ACTIVITY_CLEAR_TASK時(shí),通常會(huì)包含F(xiàn)LAG_ACTIVITY_NEW_TASK。這樣做的目的是啟動(dòng)Activity時(shí),清除之前已經(jīng)存在的Activity實(shí)例所在的task;這自然也就清除了之前存在的Activity實(shí)例!

注意:當(dāng)同時(shí)使用launchMode和上面的FLAG_ACTIVITY_NEW_TASK等標(biāo)簽時(shí),以FLAG_ACTIVITY_NEW_TASK為標(biāo)準(zhǔn)。也就是說(shuō),代碼的優(yōu)先級(jí)比manifest中配置文件的優(yōu)先級(jí)更高!

android 中activity的任務(wù)棧中有幾個(gè)非常重要的概念:

taskAffinity

taskAffinity屬性用于給Activity單獨(dú)指定任務(wù)棧名稱。這個(gè)名稱不能和包名相同,否則就沒(méi)有意義。注意taskAffinity屬性值為String,而且中間必須包含有分隔符 . (英文狀態(tài)下的點(diǎn)),比如com.baidu.test.

另外,如果想要指定一個(gè)非包名的任務(wù)棧,該Activity一定要把啟動(dòng)模式設(shè)置為singleTask模式,否則不會(huì)生效。如果taskAffinity指定的名稱是其他程序的包名,那么可以不結(jié)合singleTask。注意:任務(wù)棧分為前臺(tái)任務(wù)棧和后臺(tái)任務(wù)棧,后臺(tái)任務(wù)棧里面的Activity全部處于onStop狀態(tài)。

在minifest里面,application可以設(shè)定taskAffinity,activity也可以設(shè)定taskAffinity。

taskAffinity設(shè)定的任務(wù)棧我們也稱其為一個(gè)宿主任務(wù)棧。

(1)application設(shè)定

applicatipn如果不設(shè)定,那么就系統(tǒng)默認(rèn)設(shè)定為包名。如果設(shè)定了,activity跟著application走,application指定的是什么activity的任務(wù)棧的名稱就是什么。(application自帶的不設(shè)定,一般我們也不手動(dòng)設(shè)定,要設(shè)定也是單獨(dú)在activity里面設(shè)定)

(2)activity設(shè)定

設(shè)定taskAffinity之后,當(dāng)啟動(dòng)這個(gè)Activity之后,如果之前沒(méi)有任務(wù)棧的存在,那么就啟動(dòng)系統(tǒng)會(huì)開(kāi)辟出來(lái)一個(gè)新的任務(wù)棧(或者叫宿主任務(wù)棧),用于存放這個(gè)activity,如果已經(jīng)存在了這個(gè)任務(wù)棧,那么這個(gè)activity就對(duì)應(yīng)進(jìn)入已經(jīng)的宿主任務(wù)棧。(設(shè)定taskAffinity,不管之前存不存在,反正就不跟默認(rèn)的混了,自己只認(rèn)指定的任務(wù)棧,當(dāng)然,如果你非要把taskAffinity指定自己的包名那也沒(méi)辦法,只是那沒(méi)撒意思嘛)。

2)allowTaskReparenting

在說(shuō)這個(gè)屬性之前,要先說(shuō)一下activity的親屬關(guān)系,默認(rèn)情況下,一個(gè)應(yīng)用程序中的activity組件彼此之間是親屬關(guān)系――也就是說(shuō)它們屬于同一個(gè)任務(wù)棧。但是我們可以通過(guò)設(shè)置某個(gè)標(biāo)簽的taskAffinity屬性來(lái)為這個(gè)activity組件設(shè)置親屬關(guān)系。在不同的應(yīng)用程序中定義的activity組件可以共用同一個(gè)親屬關(guān)系,或者在同一個(gè)的應(yīng)用程序中定義的activity組件可以使用不同的親屬關(guān)系。

若一個(gè)activity組件的allowTaskReparenting被置為“true”,則當(dāng)與這個(gè)activity有相同的親屬關(guān)系的任務(wù)棧被切換到前臺(tái)的時(shí)候,這個(gè)activity會(huì)從當(dāng)前存在的任務(wù)棧中移動(dòng)到與其有相同的親屬關(guān)系的任務(wù)棧中。

3)alwaysRetainTaskState屬性

如果將根activity的alwaysRetainTaskState屬性設(shè)置為“true”,則即便一個(gè)任務(wù)棧在很長(zhǎng)的一段時(shí)間都被用戶保持在后臺(tái)的,系統(tǒng)也不會(huì)對(duì)這個(gè)任務(wù)棧進(jìn)行清理。

4)clearTaskOnLaunch屬性

如果將根activity的clearTaskOnLaunch屬性設(shè)置為“true”,那么只有這個(gè)任務(wù)棧切換到了后臺(tái),那么系統(tǒng)就會(huì)將這個(gè)任務(wù)棧中除了根activity以外的其它所有activity全部清除掉。即和alwaysRetainTaskState的行為完全相反。

finishOnTaskLaunch屬性

這個(gè)屬性的行為類似于clearTaskOnLaunch,但是此屬性作用于單個(gè)的activity對(duì)象,而不是整個(gè)任務(wù)棧。當(dāng)這個(gè)任務(wù)棧切換到了后臺(tái),這個(gè)屬性可以使任務(wù)棧清理包括根activity在內(nèi)的任何activity對(duì)象。

總結(jié)

以上是生活随笔為你收集整理的android任务栈的作用,Android 启动模式以及任务栈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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