Android 任務和回退堆棧—預設啟動模式

來源:互聯網
上載者:User

啟動模式允許你定義一個新的Activity執行個體如何跟當前的任務進行關聯。以下兩種方法能夠定義不同的啟動模式:

1.  使用資訊清單檔

     當在資訊清單檔中聲明一個Activity時,你能夠指定這個Activity在啟動時應該如何跟任務進行關聯。

2.  使用Intent標識

    在調用startActivity()方法時,你能夠在Intent中包含一個標識,用來聲明這個新的Activity應該如何跟當前的任務進行關聯。

因此,如果Activity A啟動Activity B,Activity B能夠在它的資訊清單檔中定義它應該怎樣跟當前的任務進行關聯,並且Activity A也能夠請求Activity B應該怎樣跟當前的任務進行關聯。如果這兩個Activity都定義了Activity B應該怎樣跟當前任務關聯,那麼Activity A的請求(在Intent中定義的)的優先順序要高於Activity B的請求(在資訊清單檔中定義的)。

注意:某些在資訊清單檔中有效啟動模式對Intent標識是無效的,同樣某些針對Intent標識有效啟動模式也不能在資訊清單檔中定義。

使用資訊清單檔

在資訊清單檔中聲明一個Activity時,你能夠使用<activity>元素的launchMode屬性來指定這個Activity應該怎樣跟一個任務關聯。launchMode屬性會指定一個有關這個Activity應該如何被載入到一個任務中的指令。有四種不同的啟動模式能夠跟這個屬性進行匹配:

“standard”(預設模式)

預設情況下,系統會在任務中啟動和傳遞Intent的地方建立一個新的Activity執行個體。這個Activity可以被執行個體化多次,每個執行個體屬於不同的任務,並且一個任務也可以有多個執行個體。

“singTop”

如果這個Activity的執行個體在當前任務的頂部已經存在,那麼系統就會通過調用onNewIntent()方法把這個Intent傳遞給這個執行個體,而不是建立一個新的執行個體。這個Activity可以被執行個體化多次,每個執行個體屬於不同的任務,並且一個任務可以有多個執行個體(只有回退堆棧頂部的Activity不是這個既存的Activity的執行個體時才會有多個執行個體存在)。

例如,假設一個任務的回退堆棧由跟Activity A和Activity B、Activity C以及在頂部的Activity D組成。一個針對D類型Activity的Intent訪問,如果D有預設的“standard”啟動模式,那麼這個類就會有一個新的執行個體被啟動,並且堆棧變成A-B-C-D-D的組合。但是如果D的啟動模式是“singleTop”,那麼既存的D的執行個體因為它在堆棧的頂部,所以會接收通過onNewIntent()方法傳遞的Intent,堆棧仍然保持著A-B-C-D的組合。但是,如果針對訪問B類型Activity的Intent,那麼即使它的啟動模式是“singleTop”,也會有一個新的B的執行個體被添加到堆棧中。

注意:當一個新的Activity執行個體被建立時,使用者能夠按回退按鈕返回到前一個Activity。但是當一個既存的Activity執行個體處理了一個新的Intent,那麼使用者不能按回退按鈕返回到接受新的Intent訪問之前的Activity的狀態。

“singleTask”

系統建立一個新的任務並且在這個新任務的根執行個體化這個Activity。但是,如果在另一個任務中已經存在了這個Activity的執行個體,系統會通過onNewIntent()方法把Intent傳遞到這個既存的執行個體,而不是建立一個新的執行個體。這個Activity的執行個體智能存在一次。

注意:儘管這個Activity在一個新的任務中啟動,但是按下返回按鈕時依然返回到前一個Activity。

“singleInstance”

除了系統不在擁有這個執行個體的任務中啟動其他任何的Activity之外,與“singleTask”模式相同。這個Activity總是單獨的並且是它的任務的唯一成員,任何通過這個Activity啟動的Activity都在一個獨立的任務中開啟。

例如,Android瀏覽器應用程式通過在<activity>元素中指定singleTask啟動模式來聲明這個瀏覽器Activity應該總是在它自己的任務中開啟。這就意味著如果你的應用程式發布了一個開啟Android瀏覽器的Intent,那麼這個瀏覽器的Activity不會被放在與你的應用一樣的任務中,相反,會啟動一個新的瀏覽器任務,如果這個瀏覽器已經在後台運行,那麼這個任務會被帶到前台,以便處理新的Intent。

無論是在一個新的任務中啟動一個Activity,還是跟啟動它的Activity在同一個任務中,按下回退按鈕後總會把使用者帶到前一個Activity。但是如果你啟動了指定了singleTask啟動模式的Activity,然後如果那個Activity的執行個體存在於一個背景工作中,那麼整個任務就會被帶到前台。在這個時點,在這個堆棧的頂部,回退堆棧包含了從這個任務中提取的所有的Activity。圖4說明這種情境類型

圖4.顯示了一個帶有“singleTask”啟動模式的Activity是怎樣被添加到回退堆棧中,如果這個Activity是一個已經存在的擁有自己回退堆棧的背景工作的一部分,那麼整個回退堆棧也會被帶到前面來,放到當前任務堆棧的頂部。

關於在資訊清單檔中使用啟動模式的更多資訊,請查閱<activity>元素文檔中launchMode屬性和屬性值的討論。

注意:用launchMode屬性給Activity指定的屬效能夠被啟動Activity的Intent所包含的標識覆蓋。

 

使用Intent標識

啟動Activity時,你能夠通過在傳遞給startActivity()方法的Intent中包含標識來修改Activity的預設啟動模式,使用以下標識能夠修改Activity的預設行為:

FLAG_ACTIVITY_NEW_TASK:

在一個新的任務中啟動Activity,如果這個正在啟動的Activity是一個已經啟動並執行任務,那麼這個任務聯通最後被儲存的狀態一起被提取到前台,並且接受onNewIntent()方法中的新的Intent。

這個過程與launchMode屬性值等於singleTask時具有同樣的行為。

FLAG_ACTIVITY_SINGLE_TOP:

如果正在啟動的Activity是當前的Activity(在回退堆棧的頂部),那麼這個既存的執行個體會接受一個對onNewIntent()方法的調用,而不是建立一個新的Activity執行個體。

這個過程與launchMode屬性值等於singleTop時具有同樣的行為。

FLAG_ACTIVITY_CLEAR_TOP:

如果正在被啟動的Activity已經運行在當前的任務中,那麼就不會啟動這個Activity的一個新的執行個體,而是銷毀回退堆棧中這個Activit之上的所有其他Activity,並且通過onNewIntent()方法,把這個Intent傳遞給要恢複的Activity的執行個體(目前它在堆棧的頂部)。

對於launchMode屬性沒有響應值對應這個行為過程。

FLAG_ACTIVITY_CLEAR_TOP經常會結合FLAG_ACTIVITY_NEW_TASK標記使用,當它們一起使用時,這些標識是在另一個任務中定位一個既存的Activity的方法,並且會把這個Activity放到一個能夠響應Intent的位置。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.