AMS系列:
1奠宜、本文Activity生命周期包颁、啟動(dòng)模式和隱式啟動(dòng)總結(jié)
2、ActivityManagerService啟動(dòng)分析
3压真、ActivityMnagerService分析之啟動(dòng)一個(gè)Acitvity流程分析
前言:本文為activity相關(guān)知識做一個(gè)總結(jié)娩嚼。
一、生命周期
過程:
啟動(dòng):onCreate -> onStart -> onResume
退出:onPause -> onStop -> onDestroy
后臺:onPause -> onStop
返回:onRestart -> onStart -> onResume
異常情況:
onSaveInstanceState -> onStop -> onDestroy 和onPause無時(shí)序關(guān)系
onCreate -> onStart -> onRestoreInstanceState 和onResume無時(shí)序關(guān)系
onStart & onStop 與 onResume & onDestroy區(qū)別:
onStart & onStop:表示activity是否可見
onResume & onPause:表示activity是否位于前臺
耗時(shí)操作
A啟動(dòng)B,A必須先onPause滴肿,B才可onResume岳悟。所以onPause不要執(zhí)行重量級操作(耗時(shí)操作),應(yīng)把重量級操作放到onStop中泼差。
configChanges
即:AndroidMainifest.xml中activity的android:configChanges屬性贵少,Activity中onConfigurationChanged監(jiān)聽和屎。
常用項(xiàng):
locale:本地設(shè)置改變,一般指語言
orientation:屏幕方向
keyboardHidden:鍵盤的彈出隱藏
特殊屬性:screenSize & smallestScreenSize和編譯選項(xiàng)相關(guān)和運(yùn)行環(huán)境無關(guān)
屏蔽屏幕旋轉(zhuǎn):
配置android:configChanges="orientation|screenSize"(當(dāng)API>13需screenSize)
二春瞬、LaunchMode(啟動(dòng)模式)
種類
1柴信、standard,標(biāo)準(zhǔn)模式:
系統(tǒng)默認(rèn)模式,創(chuàng)建一個(gè)新的實(shí)例宽气。A通過standard啟動(dòng)B随常,B位于A的棧中。
applicationContext沒有任務(wù)棧萄涯,applicationContext不可以standard啟動(dòng)activity绪氛。
2、singleTop,棧頂復(fù)用模式
棧中無實(shí)例涝影,則創(chuàng)建一個(gè)實(shí)例枣察。
棧頂有實(shí)例,則復(fù)用燃逻。
e.g:
棧中有ABC序目,singleTop啟動(dòng)D,結(jié)果ABCD
棧中ABCD伯襟,singleTop啟動(dòng)D猿涨,結(jié)果ABCD
棧中ADBC,standard啟動(dòng)D,結(jié)果ADBCD
3姆怪、singleTask,棧中復(fù)用模式
棧中無實(shí)例叛赚,則創(chuàng)建一個(gè)實(shí)例。
棧中有實(shí)例稽揭,則復(fù)用俺附,默認(rèn)屬性clearTop
e.g:
棧中有ABC,singleTask啟動(dòng)D溪掀,結(jié)果ABCD
棧中ADBC,standard啟動(dòng)D事镣,結(jié)果AD,默認(rèn)clearTop
4、singleInstance,單實(shí)例模式
singleTask加強(qiáng)版膨桥,以singleInstance啟動(dòng)A蛮浑,創(chuàng)建一個(gè)新的任務(wù)棧,A位于此棧中只嚣。若再次以singleInstance啟動(dòng)A沮稚,不會(huì)再去創(chuàng)建,直接復(fù)用册舞。除非棧被系統(tǒng)銷毀蕴掏。
指定啟動(dòng)模式
AndroidMainifest,activity中android:launchMode="singleTask" 或者
Intent mIntent = new Intent();
mIntent.setClass(MainActivity.class,SecondAcitvity.class);
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(mIntent);
第二種優(yōu)先級高,同時(shí)存在遵循第二種。
模式:standard,singleTop,singleTask,singleInstance
Flags:FLAG_ACTIVITY_NEW_TASK盛杰,F(xiàn)LAG_ACTIVITY_SINGLE_TOP挽荡,F(xiàn)LAG_ACTIVITY_CLEAR_TOP
flag意如其名,flag還有其它很多即供,就不一一闡述定拟,這里說下FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,指定后不會(huì)出現(xiàn)在歷史activity列表中逗嫡。
三青自、隱式啟動(dòng)Activity,intentFilter匹配規(guī)則
啟動(dòng)activity分為兩種驱证,顯式啟動(dòng)和隱式啟動(dòng)延窜。顯式:明確指出被調(diào)用activity的包名類名,隱式調(diào)用不需要明確信息抹锄。顯式和隱式原則上是不共存的逆瑞,如果共存以顯示為主。隱式啟動(dòng)匹配信息在AndroidManifest的activity中的<intent-filter>伙单,三種過濾信息:action获高,category,data车份。三個(gè)信息可同時(shí)存在多個(gè)谋减。intent-filter也可同時(shí)存在多個(gè),匹配其中一組intent-filter的三種信息各一種即可扫沼。
匹配規(guī)則
action
區(qū)分大小寫,action系統(tǒng)有自定義一些庄吼,action匹配字符串必須一樣缎除。若intentFilter定義了action屬性,隱式啟動(dòng)至少匹配其中一個(gè)总寻。
category
Intent未指定category時(shí)器罐,系統(tǒng)會(huì)默認(rèn)給Intent增加category屬性:<category android:name="android.intent.category.DEFAULT" ,所以如果你隱式啟動(dòng)activity且不想指定category在AndroidManifest總定義隱式啟動(dòng)時(shí)渐行,需加上<category android:name="android.intent.category.DEFAULT"轰坊。
Intent指定category,指定一個(gè)必須正確匹配一個(gè)祟印,多個(gè)必須正確匹配多個(gè)肴沫。
data
intentFilter配置data,Intent隱式啟動(dòng)必須匹配至少一個(gè)蕴忆,和action類似
先介紹一種結(jié)構(gòu) URI:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
例如
content://com.example.test:100/folder/subfolder/test
http://www.baidu.com:80/search/info
data的所有匹配屬性如下:
<data
android:mimeType="string"
android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPrefix="string"
android:pathPattern="string"/>
主要分為兩種颤芬,一種是mimeType,一種是URI中的其中任何之一屬性。
屬性簡介:
mimeType:媒體類型,image/jpeg,image/png,image/* 站蝠、video/等等
Scheme:URI模式汰具,http、file菱魔、content等留荔,URI無此參數(shù)URI無效
Host:URI主機(jī)名,www.baidu.com等澜倦,URI無此參數(shù)URI無效
Port:URI中端口號
Path/PathPrefix/PathPattern:路徑信息聚蝶,path和pathPattern表示完整的路徑信息,pahPatten可包含通配符"",PathPrefix路徑的前綴信息肥隆。
設(shè)置方法三種:
mIntent.setType(mType)
mIntent.setData(mUri)
mIntent.setDataAndType(mUri,mType)
若先setType再setData既荚,mimeType會(huì)被清空
若先setData再setType,data會(huì)被清空
原因看源碼,setType和seData類似
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
如下兩種屬性同時(shí)使用栋艳,標(biāo)明這是一個(gè)入口activity恰聘,并且會(huì)出現(xiàn)在系統(tǒng)應(yīng)用列表中
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />