一.先理解棧的概念(放置Activity實例的容器)
1.Task(線性表)
任務棧Task,用來放置Activity實例的容器,先進後出,主要有2個基本操作:壓棧和出棧,其所存放的Activity是不支持重新排序的,只能根據壓棧和出棧操作更改Activity的順序。
2.app啟動時,系統會為它默認創建一個對應的Task,用來放置根Activity
ps: Activity之間可以相互啟動,當前應用的Activity可以去啟動其他應用的Activity(相機),那麼就是說棧的功能可以把其它app的activity加入到自己app的棧里.
所以Task可以理解為負責管理所有用到的Activity實例的棧,但是.android5.0之後 跨進程調用activity,這個activity會被放入到一個新的棧中。
二.啟動模式(只能根據壓棧和出棧操作更改Activity的順序,所以是啟動模式是以哪種姿勢入棧)
通過在AndroidManifest文件中的屬性andorid:launchMode來設置或者通過Intent的flag來設置
1.standard(常規姿勢入棧)
默認模式。在這個模式下,都會默認創建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加。應用場景:絕大多數Activity。
2.singleTop(棧頂復用姿勢入棧)==FLAG_ACTIVITY_SINGLE_TOP
棧頂復用模式,如果要開啟的activity在任務棧的頂部已經存在,就不會創建新的實例,而是調用 onNewIntent() 方法。避免棧頂的activity被重複的創建。應用場景:在通知欄點擊收到的通知,然後需要啟動一個Activity,這個Activity就可以用singleTop,否則每次點擊都會新建一個Activity。某個場景下連續快速點擊,啟動了兩個Activity。如果這個時候待啟動的Activity使用 singleTop模式也是可以避免這個Bug的。
3.singleTask(棧內復用姿勢入棧)==FLAG_ACTIVITY_CLEAR_TOP
棧內復用模式, activity只會在任務棧裏面存在一個實例。如果要激活的activity,在任務棧裏面已經存在,就不會創建新的activity,而是復用這個已經存在的activity,調用 onNewIntent() 方法,並且清空這個activity任務棧上面所有的activity(CLEAR_TOP回到棧頂)。應用場景:大多數App的主頁。對於大部分應用,當我們在主界面點擊回退按鈕的時候都是退出應用,那麼當我們第一次進入主界面之後,主界面位於棧底,以後不管我們打開了多少個Activity,只要我們再次回到主界面,都應該使用將主界面Activity上所有的Activity移除的方式來讓主界面Activity處於棧頂,而不是往棧頂新加一個主界面Activity的實例,通過這種方式能夠保證退出應用時所有的Activity都能報銷毀。
4.singleInstance(不入棧)
單一實例模式,整個手機操作系統裏面只有一個實例存在。不同的應用去打開這個activity 共享公用的同一個activity。他會運行在自己單獨,獨立的任務棧裏面,並且任務棧裏面只有他一個實例存在。應用場景:呼叫來電界面。這種模式的使用情況比較罕見,在Launcher中可能使用。或者你確定你需要使Activity只有一個實例。建議謹慎使用。
5.FLAG_ACTIVITY_NO_HISTORY
Activity使用這種模式啟動Activity,當該Activity啟動其他Activity後,該Activity就消失了,不會保留在Activity棧中。
三.FLAG_ACTIVITY_NEW_TASK
這個屬性原則是:設置此狀態,首先會查找是否存在和被啟動的Activity具有相同的親和性的任務棧(即taskAffinity,同一個應用程序中的activity的親和性一樣),如果有,則直接把這個棧整體移動到前台,並保持棧中的狀態不變,即棧中的activity順序不變,如果沒有,則新建一個棧來存放被啟動的activity。
1.getTaskId();獲取當前activity所處的棧
2.同一個應用程序中的activity的親和性一樣(taskAffinity),也就是說 Actviitya intent時setFalg(
Intent.FLAG_ACTIVITY_NEW_TASK)到Activityb 但是Actviitya和Activityb 還是一個棧
在不同的應用中跳轉才會創建新的Task。
3.在Activity上下文之外啟動Activity需要給Intent設置FLAG_ACTIVITY_NEW_TASK標誌,不然會報異常。
四 FLAG_ACTIVITY_CLEAR_TASK(必須和FLAG_ACTIVITY_NEW_TASK一起使用)
清空棧內activity,只留下這個activity
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/203709.html
微信掃一掃
支付寶掃一掃