AMS系列:
1、本文Activity生命周期、啟動模式和隱式啟動總結
2、ActivityManagerService啟動分析
3、ActivityMnagerService分析之啟動一個Acitvity流程分析
前言:本文為activity相關知識做一個總結。
一、生命周期
過程:
啟動:onCreate -> onStart -> onResume
退出:onPause -> onStop -> onDestroy
后臺:onPause -> onStop
返回:onRestart -> onStart -> onResume
異常情況:
onSaveInstanceState -> onStop -> onDestroy 和onPause無時序關系
onCreate -> onStart -> onRestoreInstanceState 和onResume無時序關系
onStart & onStop 與 onResume & onDestroy區別:
onStart & onStop:表示activity是否可見
onResume & onPause:表示activity是否位于前臺
耗時操作
A啟動B,A必須先onPause,B才可onResume。所以onPause不要執行重量級操作(耗時操作),應把重量級操作放到onStop中。
configChanges
即:AndroidMainifest.xml中activity的android:configChanges屬性,Activity中onConfigurationChanged監聽。
常用項:
locale:本地設置改變,一般指語言
orientation:屏幕方向
keyboardHidden:鍵盤的彈出隱藏
特殊屬性:screenSize & smallestScreenSize和編譯選項相關和運行環境無關
屏蔽屏幕旋轉:
配置android:configChanges="orientation|screenSize"(當API>13需screenSize)
二、LaunchMode(啟動模式)
種類
1、standard,標準模式:
系統默認模式,創建一個新的實例。A通過standard啟動B,B位于A的棧中。
applicationContext沒有任務棧,applicationContext不可以standard啟動activity。
2、singleTop,棧頂復用模式
棧中無實例,則創建一個實例。
棧頂有實例,則復用。
e.g:
棧中有ABC,singleTop啟動D,結果ABCD
棧中ABCD,singleTop啟動D,結果ABCD
棧中ADBC,standard啟動D,結果ADBCD
3、singleTask,棧中復用模式
棧中無實例,則創建一個實例。
棧中有實例,則復用,默認屬性clearTop
e.g:
棧中有ABC,singleTask啟動D,結果ABCD
棧中ADBC,standard啟動D,結果AD,默認clearTop
4、singleInstance,單實例模式
singleTask加強版,以singleInstance啟動A,創建一個新的任務棧,A位于此棧中。若再次以singleInstance啟動A,不會再去創建,直接復用。除非棧被系統銷毀。
指定啟動模式
AndroidMainifest,activity中android:launchMode="singleTask" 或者
Intent mIntent = new Intent();
mIntent.setClass(MainActivity.class,SecondAcitvity.class);
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(mIntent);
第二種優先級高,同時存在遵循第二種。
模式:standard,singleTop,singleTask,singleInstance
Flags:FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_SINGLE_TOP,FLAG_ACTIVITY_CLEAR_TOP
flag意如其名,flag還有其它很多,就不一一闡述,這里說下FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,指定后不會出現在歷史activity列表中。
三、隱式啟動Activity,intentFilter匹配規則
啟動activity分為兩種,顯式啟動和隱式啟動。顯式:明確指出被調用activity的包名類名,隱式調用不需要明確信息。顯式和隱式原則上是不共存的,如果共存以顯示為主。隱式啟動匹配信息在AndroidManifest的activity中的<intent-filter>,三種過濾信息:action,category,data。三個信息可同時存在多個。intent-filter也可同時存在多個,匹配其中一組intent-filter的三種信息各一種即可。
匹配規則
action
區分大小寫,action系統有自定義一些,action匹配字符串必須一樣。若intentFilter定義了action屬性,隱式啟動至少匹配其中一個。
category
Intent未指定category時,系統會默認給Intent增加category屬性:<category android:name="android.intent.category.DEFAULT" ,所以如果你隱式啟動activity且不想指定category在AndroidManifest總定義隱式啟動時,需加上<category android:name="android.intent.category.DEFAULT"。
Intent指定category,指定一個必須正確匹配一個,多個必須正確匹配多個。
data
intentFilter配置data,Intent隱式啟動必須匹配至少一個,和action類似
先介紹一種結構 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無此參數URI無效
Host:URI主機名,www.baidu.com等,URI無此參數URI無效
Port:URI中端口號
Path/PathPrefix/PathPattern:路徑信息,path和pathPattern表示完整的路徑信息,pahPatten可包含通配符"",PathPrefix路徑的前綴信息。
設置方法三種:
mIntent.setType(mType)
mIntent.setData(mUri)
mIntent.setDataAndType(mUri,mType)
若先setType再setData,mimeType會被清空
若先setData再setType,data會被清空
原因看源碼,setType和seData類似
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
如下兩種屬性同時使用,標明這是一個入口activity,并且會出現在系統應用列表中
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />