導航:首頁 > 操作系統 > android棧模式

android棧模式

發布時間:2022-11-06 15:41:44

android開發時,怎麼使項目中所有的activity都是棧內單例模式

android:launchMode="singleInstance"

② Android 多返回棧技術詳解

用戶通過系統返回按鈕導航回去的一組頁面,在開發中被稱為返回棧 (back stack)。多返回棧即一堆 "返回棧",對多返回棧的支持是在 Navigation 2.4.0-alpha01 和 Fragment 1.4.0-alpha01 中開始的。本文將為您展開多返回棧的技術詳解。

無論您在使用 Android 全新的 手勢導航 還是傳統的導航欄,用戶的 "返回" 操作是 Android 用戶體驗中關鍵的一環,把握好返回功能的設計可以使應用更加貼近整個生態系統。

在最簡單的應用場景中,系統返回按鈕僅僅 finish 您的 Activity。在過去您可能需要覆寫 Activity 的 onBackPressed() 方法來自定義返回操作,而在 2021 年您無需再這樣操作。我們已經在 OnBackPressedDispatcher 中提供了 針對自定義返回導航的 API。實際上這與 FragmentManager 和 NavController 中 已經 添加的 API 相同。

這意味著當您使用 Fragments 或 Navigation 時,它們會通過 OnBackPressedDispatcher 來確保您調用了它們返回棧的 API,系統的返回按鈕會將您推入返回棧的頁面逐層返回。

多返回棧不會改變這個基本邏輯。系統的返回按鈕仍然是一個單向指令 —— "返回"。這對多返回棧 API 的實現機制有深遠影響。

在 surface 層級,對於 多返回棧的支持 貌似很直接,但其實需要額外解釋一下 "Fragment 返回棧" 到底是什麼。FragmentManager 的返回棧其實包含的不是 Fragment,而是由 Fragment 事務組成的。更准確地說,是由那些調用了 addToBackStack(String name) API 的事務組成的。

這就意味著當您調用 commit() 提交了一個調用過 addToBackStack() 方法的 Fragment 事務時, FragmentManager 會執行所有您在事務中所指定的操作 (比如 替換操作 ),從而將每個 Fragment 轉換為預期的狀態。然後 FragmentManager 會將該事務作為它返回棧的一部分。

當您調用 popBackStack() 方法時 (無論是直接調用,還是通過系統返回鍵以 FragmentManager 內部機制調用),Fragment 返回棧的最上層事務會從棧中彈出 -- 比如新添加的 Fragment 會被移除,隱藏的 Fragment 會顯示。這會使得 FragmentManager 恢復到最初提交 Fragment 事務之前的狀態。

也就是說 popBackStack() 變成了銷毀操作: 任何已添加的 Fragment 在事務被彈出的時候都會丟失它的狀態。換言之,您會失去視圖的狀態,任何所保存的實例狀態 (Saved Instance State),並且任何綁定到該 Fragment 的 ViewModel 實例都會被清除。這也是該 API 和新的 saveBackStack() 方法之間的主要區別。 saveBackStack() 可以實現彈出事務所實現的返回效果,此外它還可以確保視圖狀態、已保存的實例狀態,以及 ViewModel 實例能夠在銷毀時被保存。這使得 restoreBackStack() API 後續可以通過已保存的狀態重建這些事務和它們的 Fragment,並且高效 "重現" 已保存的全部細節。太神奇了!

而實現這個目的必須要解決大量技術上的問題。

雖然 Fragment 總是會保存 Fragment 的視圖狀態,但是 Fragment 的 onSaveInstanceState() 方法只有在 Activity 的 onSaveInstanceState() 被調用時才會被調用。為了能夠保證調用 saveBackStack() 時 SavedInstanceState 會被保存,我們 需要在 Fragment 生命周期切換 的正確時機注入對 onSaveInstanceState() 的調用。我們不能調用得太早 (您的 Fragment 不應該在 STARTED 狀態下保存狀態),也不能調用得太晚 (您需要在 Fragment 被銷毀之前保存狀態)。

這樣的前提條件就開啟了需要 解決 FragmentManager 轉換到對應狀態的問題,以此來保障有一個地方能夠將 Fragment 轉換為所需狀態,並且處理可重入行為和 Fragment 內部的狀態轉換。

在 Fragment 的重構工作進行了 6 個月,進行了 35 次修改時,發現 Postponed Fragment 功能已經嚴重損壞,這一問題使得被推遲的事務處於一個中間狀態 —— 既沒有被提交也並不是未被提交。之後的 65 個修改和 5 個月的時間里,我們幾乎重寫了 FragmentManager 管理狀態、延遲狀態切換和動畫的內部代碼,具體請參見我們之前的文章《全新的 Fragment: 使用新的狀態管理器》。

隨著技術問題的逐步解決,包括更加可靠和更易理解的 FragmentManager ,我們新增加了兩個 API: saveBackStack() 和 restoreBackStack() 。

如果您不使用這些新增 API,則一切照舊: 單個 FragmentManager 返回棧和之前的功能相同。現有的 addToBackStack() 保持不變 —— 您可以將 name 賦值為 null 或者任意 name 。然而,當您使用多返回棧時, name 的作用就非常重要了: 在您調用 saveBackStack() 和之後的 restoreBackStack() 方法時,它將作為 Fragment 事務的唯一的 key。

舉個例子,會更容易理解。比如您已經添加了一個初始的 Fragment 到 Activity,然後提交了兩個事務,每個事務中包含一個單獨的 replace 操作:

也就是說我們的 FragmentManager 會變成這樣:

比如說我們希望將 profile 頁換出返回棧,然後切換到通知 Fragment。這就需要調用 saveBackStack() 並且緊跟一個新的事務:

現在我們添加 ProfileFragment 的事務和添加 EditProfileFragment 的事務都保存在 "profile" 關鍵字下。這些 Fragment 已經完全將狀態保存,並且 FragmentManager 會隨同事務狀態一起保持它們的狀態。很重要的一點: 這些 Fragment 的實例並不在內存中或者在 FragmentManager 中 —— 存在的僅僅只有狀態 (以及任何以 ViewModel 實例形式存在的非配置狀態)。

替換回來非常簡單: 我們可以在 "notifications" 事務中同樣調用 saveBackStack() 操作,然後調用 restoreBackStack() :

這兩個堆棧項高效地交換了位置:

維持一個單獨且活躍的返回棧並且將事務在其中交換,這保證了當返回按鈕被點擊時, FragmentManager 和系統的其他部分可以保持一致的響應。實際上,整個邏輯並未改變,同之前一樣,仍然彈出 Fragment 返回棧的最後一個事務。

這些 API 都特意按照最小化設計,盡管它們會產生潛在的影響。這使得開發者可以基於這些介面設計自己的結構,而無需通過任何非常規的方式保存 Fragment 的視圖狀態、已保存的實例狀態、非配置的狀態。

當然了,如果您不希望在這些 API 之上構建您的框架,那麼可以使用我們所提供的框架進行開發。

Navigation Component 最初 是作為通用運行時組件進行開發的,其中不涉及 View、Fragment、Composable 或者其他屏幕顯示相關類型及您可能會在 Activity 中實現的 "目的地界面"。然而,NavHost 介面 的實現中需要考慮這些內容,通過它添加一個或者多個 Navigator 實例時,這些實例 確實 清楚如何與特定類型的目的地進行交互。

這也就意味著與 Fragment 的交互邏輯全部封裝在了 navigation-fragment 開發庫和它其中的 FragmentNavigator 與 DialogFragmentNavigator 中。類似的,與 Composable 的交互邏輯被封裝在完全獨立的 navigation-compose 開發庫和它的 ComposeNavigator 中。這里的抽象設計意味著如果您希望僅僅通過 Composable 構建您的應用,那麼當您使用 Navigation Compose 時無需任何涉及到 Fragment 的依賴。

該級別的分離意味著 Navigation 中有兩個層次來實現多返回棧:

仍需特別注意那些 尚未 更新的 Navigator ,它們無法支持保存自身狀態。底層的 Navigator API 已經整體重寫來支持狀態保存 (您需要覆寫新增的 navigate() 和 popBackStack() API 的重載方法,而不是覆寫之前的版本),即使 Navigator 並未更新, NavController 仍會保存 NavBackStackEntry 的狀態 (在 Jetpack 世界中向後兼容是非常重要的)。

如果您僅僅在應用中使用 Navigation,那麼 Navigator 這個層面更多的是實現細節,而不是您需要直接與之交互的內容。可以這么說,我們已經完成了將 FragmentNavigator 和 ComposeNavigator 遷移到新的 Navigator API 的工作,使其能夠正確地保存和恢復它們的狀態,在這個層面上您無需再做任何額外工作。

如果您正在使用 NavigationUI,它是用於連接您的 NavController 到 Material 視圖組件的一系列專用助手,您會發現對於菜單項、 BottomNavigationView (現在叫 NavigationRailView ) 和 NavigationView ,多返回棧是 默認啟用 的。這就意味著結合 navigation-fragment 和 navigation-ui 使用就可以。

NavigationUI API 是基於 Navigation 的其他公共 API 構建的,確保您可以准確地為自定義組件構建您自己的版本。保證您可以構建所需的自定義組件。啟用保存和恢復返回棧的 API 也不例外,在 Navigation XML 中通過 NavOptions 上的新 API,也就是 navOptions Kotlin DSL,以及 popBackStack() 的重載方法可以幫助您指定 pop 操作保存狀態或者指定 navigate 操作來恢復之前已保存的狀態。

比如,在 Compose 中,任何全局的導航模式 (無論是底部導航欄、導航邊欄、抽屜式導航欄或者任何您能想到的形式) 都可以使用我們在與 底部導航欄集成 所介紹的相同的技術,並且結合 saveState 和 restoreState 屬性一起調用 navigate() :

對用戶來說,最令人沮喪的事情之一便是丟失之前的狀態。這也是為什麼 Fragment 用一整頁來講解 保存與 Fragment 相關的狀態,而且也是我非常樂於更新每個層級來支持多返回棧的原因之一:

如果您希望了解 更多使用該 API 的示例,請參考 NavigationAdvancedSample (它是最新更新的,且不包含任何用於支持多返回棧的 NavigationExtensions 代碼)。

對於 Navigation Compose 的示例,請參考 Tivi。

如果您遇到任何問題,請使用官方的問題追蹤頁面提交關於 Fragment 或者 Navigation 的 bug,我們會盡快處理。

③ android新手 singleTask

在多Activity開發中,有可能是自己應用之間的Activity跳轉,或者夾帶其他應用的可復用Activity。可能會希望跳轉到原來某個Activity實例,而不是產生大量重復的Activity。

這需要為Activity配置特定的載入模式,而不是使用默認的載入模式。

載入模式分類及在哪裡配置

Activity有四種載入模式:

standard

singleTop

singleTask

singleInstance

設置的位置在AndroidManifest.xml文件中activity元素的android:launchMode屬性:

<activity
android:name="ActB"android:launchMode="singleTask"></activity>

也可以在Eclipse
ADT中圖形界面中編輯:

另外,可以看到兩個Activity的taskId是不同的。

④ android中的任務棧,是一個任務棧包含前台任務棧和後台任務棧,還是任務棧分為前台的任務棧

任務棧分為前台的任務棧,當前activity活動所在的棧稱為前台任務棧。

⑤ Android有多少棧空間和堆

我的理解是堆棧就是後進先出,那麼稍微想像一下,你打開的Activity是一層一層往上蓋的,當你退出當前這個Activity的時候,使用堆棧機制才會顯示你底下那一層的Activity,提高Activity復用率吧。如果你覺得這個Activity可以不用再保留那麼也給你提供了相應的打開另一個Activity之後就清理掉自己的方法。這樣做的用戶體驗會比較好吧;那麼反過來講如果沒有採用堆棧機制,在這么有限的顯示區域里應該怎麼去分配多個Activity呢?

⑥ 由從服務中啟動activity——談談安卓的任務與棧

在安卓的服務中這樣啟動活動:

你會得到這樣的錯誤:

你知道我對安卓的什麼地方最為痴迷?是它應用之間的協作。怎麼協作?依靠activity之間的協作。

這種協作是可以跨越應用的。我們從task談起。
task最直觀的是安卓第三個虛擬鍵所列出的那些就是任務。

以上這種功能的實現,要從task談起,developer上,這樣定義task:

翻譯過來,大體意識就是task是一個具有棧結構的容器,用以執行一定特定的工作,它可以放置多個Activity實例。

啟動一個應用,系統就會為之創建一個task,來放置根Activity。默認情況下,一個Activity啟動另一個Activity時,兩個Activity是放置在同一個task中的,後者被壓入前者所在的task棧,當用戶按下後退鍵,後者從task被彈出,前者又顯示在幕前,特別是啟動其他應用中的Activity時,兩個Activity對用戶來說就好像是屬於同一個應用。

task可以分為系統task和task。這兩者之間是互相獨立的。

當我們運行一個應用時,按下Home鍵回到主屏,啟動另一個應用,這個過程中,之前的task被轉移到後台,新的task被轉移到前台,其根Activity也會顯示到幕前,過了一會之後,在此按下Home鍵回到主屏,再選擇之前的應用,之前的task會被轉移到前台,系統仍然保留著task內的所有Activity實例,而那個新的task會被轉移到後台,如果這時用戶再做後退等動作,就是針對該task內部進行操作了。

一個Activity當然要表面自己身在哪個task,所以每個Activity都有taskAffinity屬性。這個屬性指出了它希望進入的Task。

如果一個Activity指明自己的taskaffinity,那麼它的這個屬性就等於Application指明的taskAffinity,如果Application也沒有指明,那麼該taskAffinity的值就等於包名。

而Task也有自己的affinity屬性,它的值等於它的根Activity的taskAffinity的值。

顯示的聲明activiy的屬性
這很簡單,在AndroidManifest.xml中聲明

有了上面的基礎,請記住這兩種文檔說明的情況:

1. 如果該Activity的allowTaskReparenting設置為true,它進入後台,當一個和它有相同affinity的Task進入前台時,它會重新宿主,進入到該前台的task中。
**2. 如果載入某個Activity的intent,Flag被設置成FLAG_ACTIVITY_NEW_TASK時,它會首先檢查是否存在與自己taskAffinity相同的Task,如果存在,那麼它會直接宿主到該Task中,如果不存在則重新創建Task。 **

activity有四種啟動模式,分別為 standard,singleTop,singleTask,singleInstance。

這四種模式我不細說,我們只從名字上分析分析。

第一種,標准模式,想想就知道是平常的模式,這里的標准意思是每生成一個activity的實例,就當一個實例的放在棧里。

第二種,singleTop,在於那個top。要是activity不在棧頂,它和standard模式沒什麼區別,要是在top,就不創建一個新的,用棧頂原來那個。

第三種,不那麼容易,尤其是 官網的說法好像有問題。

singleTask模式的Activity只允許在系統中有一個實例。 如果系統中已經有了一個實例,持有這個實例的任務將移動到頂部,同時intent將被通過onNewIntent()發送。如果沒有,則會創建一個新的Activity並置放在合適的任務中。
這話的意思,我們分兩種情況討論,一是在同一個應用,二是不同。
在同一個應用中,如果系統中還沒有singleTask的Activity,會新創建一個,並放在同一任務的棧頂。但是如果已經存在,singleTask Activity上面的所有Activity將以合適的方式自動銷毀,讓我們想要顯示的Activity處於棧頂。
在非同一個應用中,intent是從另外的應用發送過來。系統中沒有任何Activity的實例的化,會創建一個新的任務,並且新的Activity被作為根Activity創建;如果系統中擁有這個singleTask的應用存在,新建的Activity會置於這個任務的上面。

第四種,和第三種很像,關鍵在於singleInstance,就是只能有這一個單例存在在棧中。

回到開頭,我們還沒解決開始的錯誤。最簡單粗暴的方法是:

這可以解決問題,不過也還存在一個小問題,留待讀者發現:)
Flag的字面意思很好理解,如果你讀懂了上述的任務與活動啟動模式的化,再提供幾個intent Flags:

至於意思,還是字面理解就好了。

⑦ android啟動模式設置為single task任務棧為什麼

在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式決定了Activity的啟動運行方式。 Android總Activity的啟動模式分為四種: Activity啟動模式設置: <activity android:name=".MainActivity" android:launchMode="standard" /> Activity的四種啟動模式: 1. standard 模式啟動模式,每次激活Activity時都會創建Activity,並放入任務棧中。 2. singleTop 如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。 3. singleTask 如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。 4. singleInstance 在一個新棧中創建該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當於多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。 其中standard是系統默認的啟動模式。 下面通過實例來演示standard的運行機制: 1 private TextView text_show; 2 private Button btn_mode; 3 4 @Override 5 public void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 9 text_show = (TextView) this.findViewById(R.id.text_show); 10 11 text_show.setText(this.toString()); 12 13 btn_mode = (Button) this.findViewById(R.id.btn_mode); 14 15 } 16 //按鈕單擊事件 17 public void LaunchStandard(View v){ 18 startActivity(new Intent(this,MainActivity.class)); 19 20 text_show.setText(this.toString()); 21 }

⑧ Android中的activity的堆棧有什麼作用

我的理解是堆棧就是後進先出,那麼稍微想像一下,你打開的Activity是一層一層往上蓋的,當你退出當前這個Activity的時候,使用堆棧機制才會顯示你底下那一層的Activity,提高Activity復用率吧。如果你覺得這個Activity可以不用再保留那麼也給你提供了相應的打開另一個Activity之後就清理掉自己的方法。這樣做的用戶體驗會比較好吧;那麼反過來講如果沒有採用堆棧機制,在這么有限的顯示區域里應該怎麼去分配多個Activity呢?

⑨ android怎樣將activity放入全局棧

Activity是Android程序的表現層。程序的每一個顯示屏幕就是一個Activity。正在運行的Activity處在棧的最頂端,它是運行狀態的。

當有新的Activity進入屏幕最上端時,原來的Activity就會被壓入第二層。如果他的屏幕沒有被完 全遮蓋,那麼他處於Paused狀態,如果他被遮蓋那麼處於Stop狀態。
不管處於任何一層,都可能在系統覺得資源不足時被強行關閉,當然關閉時棧底的程序最先被關閉。
譬如:當你在程序中調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵一樣:他告訴 Activity Manager該Activity實例可以被「回收」。隨後 Activity Manager 激活處於棧第二層的 Activity 並重 新入棧,把原 Activity 壓入到棧的第二層,從 Running 狀態轉到 Paused 狀態。

在BlackBerry中,提供了一個管理Screen的棧,用來從任何地方來關閉位於最上一層的Screen,使用UiApplication.getUiApplication().getActiveScreen()來得到位於最上一層的Screen的實例,並且使用UiApplication.getUiApplication().popScreen()來關閉一個Screen或關閉當前最上一層的Screen,但是Android卻未提供相應的功能,只能在一個Activity的對象裡面調用finish來關閉自己,不能關閉其他的Activity。比如我們想實現一個功能從屏幕A—>屏幕B—>屏幕C—>屏幕D,然後在在轉到屏幕D之前將屏幕B和C關閉,在屏幕B和屏幕C界面點擊會退按鈕都可以回退到上一個屏幕,但是在屏幕D上點擊會退按鈕讓其回退到A,此外在一些循環跳轉的界面上如果不在合適的地方將一些不需要的屏幕關閉,那麼經過多次跳轉後回導致內存溢出。對此我們可以設計一個全局的Activity棧,使用這個棧來管理Activity。管理Activity的類的定義如下:

import java.util.Stack;

import android.app.Activity;

public class ScreenManager {
private static Stack activityStack;
private static ScreenManager instance;
private ScreenManager(){
}
public static ScreenManager getScreenManager(){
if(instance==null){

⑩ Android中的Activity詳解--啟動模式與任務棧

目錄

activity的簡單介紹就不寫了,作為最常用的四大組件之一,肯定都很熟悉其基本用法了。

首先,是都很熟悉的一張圖,即官方介紹的Activity生命周期圖.

情景:打開某個應用的的FirstActivity調用方法如下:
由於之前已經很熟悉了,這里就簡單貼一些圖。

按下返回鍵:

重新打開並按下home鍵:

再重新打開:

在其中打開一個DialogActivity(SecondActivity)

按下返回:

修改SecondAcitvity為普通Activity,依舊是上述操作:

這里強調一下 onSaveInstanceState(Bundle outState) 方法的調用時機:
當Activity有可能被系統殺掉時調用,注意,一定是被系統殺掉,自己調用finish是不行的。
測試如下:FirstActivity啟動SecondActivity:

一個App會包含很多個Activity,多個Activity之間通過intent進行跳轉,那麼原始的Activity就是使用棧這個數據結構來保存的。
Task
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack ), in the order in which each activity is opened.
即若干個Activity的集合的棧表示一個Task。
當App啟動時如果不存在當前App的任務棧就會自動創建一個,默認情況下一個App中的所有Activity都是放在一個Task中的,但是如果指定了特殊的啟動模式,那麼就會出現同一個App的Activity出現在不同的任務棧中的情況,即會有任務棧中包含來自於不同App的Activity。

標准模式,在不指定啟動模式的情況下都是以此種方式啟動的。每次啟動都會創建一個新的Activity實例,覆蓋在原有的Activity上,原有的Activity入棧。
測試如下:在FirstActivity中啟動FirstActivity:

當只有一個FirstActivity時堆棧情況:

此種模式下,Activity在啟動時會進行判斷,如果當前的App的棧頂的Activity即正在活動的Activity就是將要啟動的Activity,那麼就不會創建新的實例,直接使用棧頂的實例。
測試,設置FirstActivity為此啟動模式,多次點擊FirstActivity中的啟動FirstActivity的按鈕查看堆棧情況:
(其實點擊按鈕沒有啟動新Activity的動畫就可以看出並沒有啟動新Activity)

大意就是:
對於使用singleTop啟動或Intent.FLAG_ACTIVITY_SINGLE_TOP啟動的Activity,當該Activity被重復啟動(注意一定是re-launched,第一次啟動時不會調用)時就會調用此方法。
且調用此方法之前會先暫停Activity也就是先調用onPause方法。
而且,即使是在新的調用產生後此方法被調用,但是通過getIntent方法獲取到的依舊是以前的Intent,可以通過setIntent方法設置新的Intent。
方法參數就是新傳遞的Intent.

1.如果是同一個App中啟動某個設置了此模式的Activity的話,如果棧中已經存在該Activity的實例,那麼就會將該Activity上面的Activity清空,並將此實例放在棧頂。
測試:SecondActivity啟動模式設為singleTask,啟動三個Activity:

這個模式就很好記,以此模式啟動的Activity會存放在一個單獨的任務棧中,且只會有一個實例。
測試:SecondActivity啟動模式設為singleInstance

結果:

顯然,啟動了兩次ThirdActivity任務棧中就有兩個實例,而SecondActivity在另外一個任務棧中,且只有一個。

在使用Intent啟動一個Activity時可以設置啟動該Activity的啟動模式:
這個屬性有很多,大致列出幾個:

每個啟動的Activity都在一個新的任務棧中

singleTop

singleTask

用此種方式啟動的Activity,在它啟動了其他Activity後,會自動finish.

官方文檔介紹如下:

這樣看來的話,通俗易懂的講,就是給每一個任務棧起個名,給每個Activity也起個名,在Activity以singleTask模式啟動時,就檢查有沒有跟此Activity的名相同的任務棧,有的話就將其加入其中。沒有的話就按照這個Activity的名創建一個任務棧。
測試:在App1中設置SecondActivity的taskAffinity為「gsq.test」,App2中的ActivityX的taskAffinity也設為「gsq.test」

任務棧信息如下:

結果很顯然了。
測試:在上述基礎上,在ActivityX中進行跳轉到ActivityY,ActivityY不指定啟動模式和taskAffinity。結果如下:

這樣就沒問題了,ActivityY在一個新的任務棧中,名稱為包名。
這時從ActivityY跳轉到SecondActivity,那應該是gsq.test任務棧只有SecondActivity,ActivityX已經沒有了。因為其啟動模式是singleTask,在啟動它時發現已經有一個實例存在,就把它所在的任務棧上面的Activity都清空了並將其置於棧頂。

還有一點需要提一下,在上面,FirstActivity是App1的lunch Activity,但是由於SecondActivity並沒有指定MAIN和LAUNCHER過濾器,故在FirstActivity跳轉到SecondActivity時,按下home鍵,再點開App1,回到的是FirstActivity。

大致就先寫這么多吧,好像有點長,廢話有點多,估計也有錯別字,不要太在意~~~

閱讀全文

與android棧模式相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:383
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163