Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 中Activity的啟動方式和Activity在堆棧情況分析

Android 中Activity的啟動方式和Activity在堆棧情況分析

編輯:關於Android編程

啟動方式   下的launchMode屬性可以設置四種啟動方式:   "standard" (the default mode)   "singleTop"   "singleTask"   "singleInstance"   這些不同的方式可以從下面的四點來說:   (1)對一個Intent作出回應時哪個task應該去持有這個Activity。    對standard和singleTop方式來說,新的Activity和通過startActivity調用他的Activity處在同一個task 中,如果調用時Intent對象裡含有FLAG_ACTIVITY_NEW_TASK標志,那麼就像前面講的那樣的尋找一個新的task。   相反的,singTask和singleInstance方式,總是標志Activity為task的root Activity,他們不會進入到其他的task中。   (2)一個Activity是否可以有多個實例。   一個standard或者singleTop屬性的Activity可以實例化多次,他們可以屬於多個不同的task。   相反的,singleTask或者singleInstance屬性的Activity只能有一個實例(單例)。   (3)實例是否能允許在task裡有其他的Activity。    一個singleInstance屬性的Activity單獨的在他自己的task裡,並且這個task裡只能有他自己一個Activity,如果他啟 動了另一個Activity,那個Activity會根據啟動模式來啟動並裝進一個不同的task裡。其他的方面,singleInstance和 singleTask一樣的。   其他三個方式允許有多個Activity在一個task裡,一個singleTask屬性的Activity總是一個task裡的root Activity,但是他可以啟動另外的Activity並且將這個新的Activity裝進同一個task裡,standard和singleTop屬性的Activity可以出現在task的任何地方。   (4)一個類(Activity)的對象是否可以被啟動來處理一個新的Intent。    對默認的standard方式,會實例化一個對象來處理每一個新的Intent,每個實例處理一個新的Intent,對singleTop方式,如果一 個已經存在的實例是在task的棧頂,那麼就重用這個實例來處理這個新的Intent,如果這個實例不在棧頂,那就不復用他,而是重新創建一個實例來處理 這個新的Intent並且將這個實例壓入堆棧。   例如現在有一個task堆棧ABCD,A是root Activity,D是棧頂Activity,現在有一個啟動D的Intent來了,如果D是默認的standard方法,那麼就會創建一個新的實例來處 理這個Intent,所以這個堆棧就變為ABCDD,然而如果D是singleTop方式,這個已經存在的棧頂的D就會來處理這個Intent,所以堆棧 還是ABCD。D此時調用onNewIntent(),此時D可以調用getIntent()來獲得最初的Intent,或者調用setIntent() 來更新這個Intent。   如果現在有一個Intent來啟動B,不管B是standard還是singleTop(因為現在B不在棧頂),都會創建一個新的實例,所以堆棧變為ABCDB    在一個task裡,對singleTask和singleInstance屬性的Activity只能有一個實例。所以這僅有的一個會來處理所以的 Intent,一個singleInstance屬性Activity總在棧頂(因為task裡就只有他一個Activity),所以他會處理所以的 Intent,但是一個singleTask屬性的Activity必須是task的root Activity(也就是必須在棧底),不能確定他的上面是否還有其他的Activity,如果沒有,就可以處理,如果還有其他的Activity,那麼 如果現在有一個Intent來啟動這個singleTask屬性的Activity,這個Intent將會被丟掉(即使是這個Intent被丟掉,他的到 來還是會導致這個task回到前台)。   當創建一個類(Activity)的實例來處理一個新的Intent時,用戶可以按下BACK鍵回到上 一個Activity,但是如果是用已經存在的棧頂的Activity來處理Intent的話,按下BACK鍵是不能回到以前的狀態的(沒處理這個 Intent之前)。    清理堆棧   當用戶離開一個task一段時間後,系統就會清理掉task裡出了rootActivity以外的Activity,如果用戶又回來了,顯示的是rootActivity,就像是用戶離開又回來,是放棄以前的東西,開始新的東西。   上面說的是默認的情況,有一些Activity的屬性可以用來控制和修改這些行為。   alwaysRetainTaskState   如果一個task裡的root Activity的alwaysRetainTaskState屬性設置為true,那麼前面描述的默認情況就不會出現了,task即使過了一段時間也會一直保留所有的Activity。   clearTaskOnLaunch   如果一個task裡的root Activity的clearTaskOnLaunch屬性設置為true,和alwaysRetainTaskState相反,即使是一瞬間的離開,系統馬上就會清理掉task裡出rootActivity以外的所有Activity。   finishOnTaskLaunch   這個屬性和clearTaskOnLaunch一樣,但是他是對一個Activity起作用,不是整個task,他能引起所有的Activity離開,包括root Activity,當這個屬性設置為true,只是當用戶使用這個應用時Activity才在task裡,一旦用戶離開後重新回來,顯示的不是當前的界面。    還有其他的方法來從task裡強制移動Activity,如果一個Intent對象裡包含FLAG_ACTIVITY_CLEAR_TOP標志,並且目 標task裡已經一個在自己task裡可以處理Intent的Activity(就是處理這個Intent無需實例化另外一個Activity),那麼在 這個Activity之上的所有Activity將被清除,能處理這個Intent的Activity就移到棧頂來處理這個Intent,例如ABCD堆 棧,含有FLAG_ACTIVITY_CLEAR_TOP標志的Intent來啟動B,那麼清除CD,B到達棧頂來響應Intent,此時是AB,如果B 設置了standard屬性,那麼還是清楚CD,然後再創建一個實例來響應Intent,此時是ABB,因為standard屬性的Activity總是 創建一個新的實例來響應新的Intent。 Activity在xml中注冊:   <activity             android:name="io.vov.vitamio.activity.InitActivity"             android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"             android:launchMode="singleTop"             android:theme="@android:style/Theme.NoTitleBar"             android:windowSoftInputMode="stateAlwaysHidden" />         <activity
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved