1.1典型情況下的生命周期
用戶有A Activity啟動B Activity過程中,先調(diào)用A的onPause(),然后才能啟動B Activity,所以在Activity的 onPause()方法中不應(yīng)當(dāng)做耗時操作幕屹。應(yīng)當(dāng)將耗時的清理工作放在onStop()中靶累,但是耗時也不宜太久。
1.1.1 configChanges
項目 | 含義 |
---|---|
mcc | SIM卡的唯一標(biāo)識中的國家碼 |
mnc | SIM卡的唯一標(biāo)識中的運營商碼 |
***locale**** | 本地位置,如切換語言 |
touchscreen | 觸屏變化,很難實現(xiàn) |
keyboard | 鍵盤變化,如接入外接鍵盤 |
keyboardHidden | 鍵盤調(diào)出或隱藏 |
navigation | 導(dǎo)航方式變化雷客,很難實現(xiàn) |
screenlayout | 屏幕布局變化,新增其他屏幕(感覺電視會有用) |
fontScale | 字體縮放比例變化 |
uiMode | 用戶界面模式變化桥狡,比如夜間模式等 |
orientation | 屏幕方向變化 |
screenSize | 屏幕尺寸發(fā)生變化搅裙,比如旋轉(zhuǎn)屏幕。 當(dāng)編譯選項中minSdkVersion和targetSdkVersion均小于13的時候才不會導(dǎo)致Activity的重啟裹芝。 |
smallestScreenSize | 屏幕物理尺寸變化部逮,與屏幕方向無關(guān)。 當(dāng)編譯選項中minSdkVersion和targetSdkVersion均小于13的時候才不會導(dǎo)致Activity的重啟嫂易。 |
layoutDirection | 布局方向變化兄朋,很少見,(API 17新增) |
- 比較常用的是locale (感覺并不)怜械、orientation颅和、keyboardHidden三個,但是由于screenSize的特殊性缕允,常用的其實是他們4個峡扩。
一般使用時需要與screenSize搭配,防止Activity重啟:
android:configChanges="orientation|screenSize"
再切換屏幕方向時會調(diào)用:
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//處理其他
...
}
1.2 Activity的啟動模式
注:使用非Activity類型的Context啟動Activity會報錯障本。這是因為Activity啟動需要進入對應(yīng)的任務(wù)棧教届,而非Activity類型的Context并沒有所謂的任務(wù)棧。所以一定要使用非Activity類型的Context啟動Activity時驾霜,要在Intent中添加
Intent. FLAG_ACTIVITY_NEW_TASK
標(biāo)記案训。
1.2.1 在AndroidManifest.xml中指定啟動模式
xml中模式 | Intentd的FLAG | 說明 |
---|---|---|
standard | 默認 | 標(biāo)準模式,也是默認模式粪糙。 |
singleTop | FLAG_ACTIVITY_SINGLE_TOP |
棧頂復(fù)用模式强霎。 需要啟動的Activity已經(jīng)位于任務(wù)棧的棧頂時(A)不會創(chuàng)建新的Activity(A1)。 而已有的Activity(A)的 onNewIntent() 方法會被回調(diào)蓉冈。 |
singleTask | FLAG_ACTIVITY_NEW_TASK |
棧內(nèi)復(fù)用模式城舞,是一種單例模式轩触。 如果Activity(A)在棧內(nèi)存在,啟動時就不會新建Activity(A1)椿争。 調(diào)用已存在的Activity(A)時,棧內(nèi)位于A之上的其他Activity會直接出棧并且A的 onNewIntent() 方法會被回調(diào)熟嫩。 |
singleInstance | 無 | 單例模式(Activity所在任務(wù)棧只能有這一個Activity秦踪,屬于加強型的singleTask) |
無 | FLAG_ACTIVITY_CLEAR_TOP |
Activity啟動時會清理任務(wù)棧中當(dāng)前Activity之上的Activity (singleTask模式具有此標(biāo)記位的效果) |
無 |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 等同于屬性android:execludeFromRecents="true"
|
具有此標(biāo)記的Activity不會存在于Activity回退列表中 |
設(shè)置啟動模式需要注意的是,當(dāng)xml中指定的啟動模式與Intent中指定的啟動模式存在沖突時掸茅,以Intent中指定的啟動模式為準椅邓。
例子:其中CD均為singleTask模式
|前臺任務(wù)棧|
|:-:|
|B|
|A|
|后臺任務(wù)棧|
|D|
|C|
回退列表是CDAB。
此時啟動Activity D昧狮,后臺任務(wù)棧轉(zhuǎn)為前臺
|前臺任務(wù)棧|
|:-:|
|D|
|C|
|后臺任務(wù)棧|
|B|
|A|
回退列表是ABCD
此時如果啟動Activity C景馁,后臺任務(wù)棧轉(zhuǎn)為前臺,D強制出棧逗鸣,C處于棧頂位置
|前臺任務(wù)棧|
|:-:|
|C|
|后臺任務(wù)棧|
|B|
|A|
回退列表是ABC
1.3 IntentFilter的匹配規(guī)則
Activity啟動分為兩種形式合住,顯式調(diào)用和隱式調(diào)用。顯式就是明確指定被啟動的對象如intent.setClass(context,A.class); startActivity(intent);
很簡單撒璧。隱式調(diào)用則不需要指定啟動對象透葛,而是通過intent匹配目標(biāo)對象的IntentFilter的過濾信息來啟動目標(biāo)。
一個Activity可以包含多個IntentFilter卿樱,一個IntentFilter包含<action>僚害、<category>、<data>三部分繁调。
匹配規(guī)則如下:
Intent中必須有action(不然會匹配一堆應(yīng)用或者失敗)萨蚕,任意一個action匹配到目標(biāo)的任意一個<action>即為匹配成功;
Intent中可以沒有category蹄胰,但只要有category岳遥,所有的category都匹配到目標(biāo)的<category>才能匹配成功,<category android:name="android.intent.category.DEFAULT"/>
必須有裕寨;
xml中有<data>寒随,Intent中必須有data,任意一個data匹配到目標(biāo)的任意一個<data>即為匹配成功帮坚;