天天看點

Manifest.xml 入門基礎 (五)<Activity>标簽

a、android:alwaysretaintaskstate

是否保留狀态不變, 比如切換回home, 再從新打開,activity處于最後的狀态。比如一個浏覽器擁有很多狀态(當打開了多個tab的時候),使用者并不希望丢失這些狀态時,此時可将此屬性設定為true

b、android:cleartaskonlaunch

比如 p 是 activity, q 是被p 觸發的 activity, 然後傳回home, 重新啟動 p,是否顯示 q

c、android:configchanges

當配置list發生修改時, 是否調用 onconfigurationchanged() 方法 比如 “locale|navigation|orientation”. 這個我用過,主要用來看手機方向改變的. android手機在旋轉後,layout會重新布局, 如何做到呢?正常情況下. 如果手機旋轉了.目前activity後殺掉,然後根據方向重新加載這個activity. 就會從oncreate開始重新加載.如果你設定了 這個選項, 當手機旋轉後,目前activity之後調用onconfigurationchanged() 方法. 而不跑oncreate方法等.

d、android:excludefromrecents

是否可被顯示在最近打開的activity清單裡,預設是false

e、android:finishontasklaunch

當使用者重新啟動這個任務的時候,是否關閉已打開的activity,預設是false如果這個屬性和allowtaskreparenting都是true,這個屬性就是王牌。activity的親和力将被忽略。該activity已經被摧毀并非re-parented

f、android:launchmode(activity加載模式)

在多activity開發中,有可能是自己應用之間的activity跳轉,或者夾帶其他應用的可複用activity。可能會希望跳轉到原來某個activity執行個體,而不是産生大量重複的activity。這需要為activity配置特定的加載模式,而不是使用預設的加載模式

activity有四種加載模式:

standard、singletop、singletask、singleinstance(其中前兩個是一組、後兩個是一組),預設為standard

standard:就是intent将發送給新的執行個體,是以每次跳轉都會生成新的activity。

singletop:也是發送新的執行個體,但不同standard的一點是,在請求的activity正好位于棧頂時(配置成singletop的activity),不會構造新的執行個體

singletask:和後面的singleinstance都隻建立一個執行個體,當intent到來,需要建立設定為singletask的activity的時候,系統會檢查棧裡面是否已經有該activity的執行個體。如果有直接将intent發送給它。

singleinstance:首先說明一下task這個概念,task可以認為是一個棧,可放入多個activity。比如啟動一個應用,那麼android就建立了一個task,然後啟動這個應用的入口activity,那在它的界面上調用其他的activity也隻是在這個task裡面。那如果在多個task中共享一個activity的話怎麼辦呢。舉個例來說,如果開啟一個導遊服務類的應用程式,裡面有個activity是開啟google地圖的,當按下home鍵退回到主菜單又啟動google地圖的應用時,顯示的就是剛才的地圖,實際上是同一個activity,實際上這就引入了singleinstance。singleinstance模式就是将該activity單獨放入一個棧中,這樣這個棧中隻有這一個activity,不同應用的intent都由這個activity接收和展示,這樣就做到了共享。當然前提是這些應用都沒有被銷毀,是以剛才是按下的home鍵,如果按下了傳回鍵,則無效。

g、android:multiprocess

是否允許多程序,預設是false

在實際開發中,cp有以下兩種用法:

1)和應用在一個apk包裡

這種情況下和應用在同一程序中。process name和uid都一樣。

2)單獨在一個apk包裡。

這種情況下,如果在androidmanifest.xml檔案裡聲明了和某個程序同屬一個程序,如:

這個裡面通過android:shareduserid=”android.uid.phone”和android:process=”com.android.phone”聲明了該cp是和phone程序同屬一個程序,擁有同樣的process name和uid.

如果沒有上述聲明,那麼該cp是在獨立的程序中,擁有屬于自己的process name和uid.

以上兩種用法可以總結為:

1)cp和某個程序同屬一個程序

這種情況下,當該程序啟動時,會搜尋屬于該程序的所有cp,并加載。

2)cp屬于獨立的一個程序。

這種情況下,隻有需要用到該cp時,才會去加載。

那麼,當一個程序想要操作一個cp時,先需要擷取該cp的對象,系統是如何處理呢:

1)如果該cp屬于目前主叫程序,因為在程序啟動時就已經加載過了,是以系統會直接傳回該cp的對象。

2)如果該cp不屬于目前主叫程序,那麼系統會進行相關處理(由activitymanagerservice進行,以下簡稱為ams):

所有已加載的cp資訊都已儲存在ams中。當需要擷取某個cp的對象時,ams會先判斷該cp是否已被加載

—-如果已被加載,該cp和目前主叫程序不屬一個程序,但是該cp設定了multiprocess的屬性(如上例中的android:multiprocess=”true”),并且該cp屬于系統級cp,那麼就在目前主叫程序内部新生成該cp的對象。否則就需要通過ipc機制進行調用。

—-如果還未被加載,該cp和目前主叫程序不屬一個程序,但是該cp設定了multiprocess的屬性(如上例中的android:multiprocess=”true”),并且該cp屬于系統級cp,那麼就在目前主叫程序内部新生成該cp的對象。否則就需要先建立該cp所在的程序,然後再通過ipc機制進行調用。

h、android:nohistory

當使用者從activity上離開并且它在螢幕上不再可見時,activity是否從activity stack中清除并結束。預設是false。activity不會留下曆史痕迹

i、android:screenorientation

activity顯示的模式

預設為unspecified:由系統自動判斷顯示方向

landscape橫屏模式,寬度比高度大

portrait豎屏模式, 高度比寬度大

user模式,使用者目前首選的方向

behind模式:和該activity下面的那個activity的方向一緻(在activity堆棧中的)

sensor模式:有實體的感應器來決定。如果使用者旋轉裝置這螢幕會橫豎屏切換

nosensor模式:忽略實體感應器,這樣就不會随着使用者旋轉裝置而更改了

j、android:statenotneeded

activity被銷毀或者成功重新開機時是否儲存狀态

k、android:windowsoftinputmode

activity主視窗與軟鍵盤的互動模式,可以用來避免輸入法面闆遮擋問題,android1.5後的一個新特性。

這個屬性能影響兩件事情:

【a】當有焦點産生時,軟鍵盤是隐藏還是顯示

【b】是否減少活動主視窗大小以便騰出空間放軟鍵盤

各值的含義:

【a】stateunspecified:軟鍵盤的狀态并沒有指定,系統将選擇一個合适的狀态或依賴于主題的設定

【b】stateunchanged:當這個activity出現時,軟鍵盤将一直保持在上一個activity裡的狀态,無論是隐藏還是顯示

【c】statehidden:使用者選擇activity時,軟鍵盤總是被隐藏

【d】statealwayshidden:當該activity主視窗擷取焦點時,軟鍵盤也總是被隐藏的

【e】statevisible:軟鍵盤通常是可見的

【f】statealwaysvisible:使用者選擇activity時,軟鍵盤總是顯示的狀态

【g】adjustunspecified:預設設定,通常由系統自行決定是隐藏還是顯示

【h】adjustresize:該activity總是調整螢幕的大小以便留出軟鍵盤的空間

【i】adjustpan:目前視窗的内容将自動移動以便目前焦點從不被鍵盤覆寫和使用者能總是看到輸入内容的部分。

一般情況下,在建立一個activity後,為了使intent可以調用此活動,我們要在androidmanifest.xml檔案中添加一個<activity>标簽,<activity>标簽的一般格式如下:

其中,”android:name”是活動對應的類名稱,”android:label”是活動标題欄顯示的内容,<intent-filter>是意圖篩選器,<action>是動作名稱,是指intent要執行的動作,<category>是類别名稱,一般情況下,每個<intent-filter> 中都要顯示指定一個預設的類别名稱,即<category android:name=”android.intent.category.default” />,但是上面的代碼中沒有指定預設類别名稱,這是一個例外情況,因為其<intent-filter> 中的<action>是”android.intent.action.main”,意思是這項活動是應用程式的入口點,這種情況下可以不加預設類别名稱。

當然,除<action>和<category>以外,<intent-filter>中還有很多其他元素,在這裡不詳述。

上面的代碼是androidmanifest.xml中定義程式入口活動的例子,下面我們寫一個自定義的例子:

在這個<activity>标簽中,我們指定活動的類為mybrowseractivity.class,活動的标題顯示為”my activity”,<action android:name=”my.test.mybrowser”/>意味着其他活動可以通過my.test.mybrowser動作來調用這個活動,”my.test.mybrowser”隻是我們定義的一個動作的名稱,寫成包的形式是因為這樣使我們更容易了解它的含義,如果我們把”my.test.mybrowser”改成任意的内容如:”somethingelse”,同樣,我們可以通過這個新的動作名稱,來調用這個活動。<data> 元素指定了活動期望的資料類型,在這裡,它期望的資料要以http://字首開頭。

繼續閱讀