Activity的生命周期和啟動模式


1.1典型情況下的生命周期

Paste_Image.png

用戶有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>即為匹配成功帮坚;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妻往,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子试和,更是在濱河造成了極大的恐慌讯泣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阅悍,死亡現(xiàn)場離奇詭異好渠,居然都是意外死亡昨稼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門拳锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來假栓,“玉大人,你說我怎么就攤上這事霍掺∝揖#” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵杆烁,是天一觀的道長牙丽。 經(jīng)常有香客問我,道長兔魂,這世上最難降的妖魔是什么烤芦? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮析校,結(jié)果婚禮上构罗,老公的妹妹穿的比我還像新娘。我一直安慰自己智玻,他們只是感情好绰播,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尚困,像睡著了一般蠢箩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上事甜,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天谬泌,我揣著相機與錄音,去河邊找鬼逻谦。 笑死掌实,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邦马。 我是一名探鬼主播贱鼻,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滋将!你這毒婦竟也來了邻悬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤随闽,失蹤者是張志新(化名)和其女友劉穎父丰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掘宪,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蛾扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年攘烛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镀首。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坟漱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出更哄,到底是詐尸還是另有隱情芋齿,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布竖瘾,位于F島的核電站沟突,受9級特大地震影響花颗,放射性物質(zhì)發(fā)生泄漏捕传。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一扩劝、第九天 我趴在偏房一處隱蔽的房頂上張望庸论。 院中可真熱鬧,春花似錦棒呛、人聲如沸聂示。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鱼喉。三九已至,卻和暖如春趋观,著一層夾襖步出監(jiān)牢的瞬間扛禽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工皱坛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留编曼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓剩辟,卻偏偏與公主長得像掐场,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贩猎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容