Activity生命周期、啟動模式和隱式啟動總結

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" />
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容