Activity生命周期
- onCreate()
繼承Activity類時默認(rèn)生成胰默,在activity第一次被創(chuàng)建時候被調(diào)用场斑,完成activity初始化漓踢。
- onStart()
當(dāng)然在onCreate()之后被調(diào)用牵署,這個時候你還看不到activity,在activity即將被你看見的時候喧半,它被調(diào)用奴迅。
- onResume()
activity正在運行,即處于active/running的狀態(tài)挺据。
ps: onActivityResult ():You will receive this call immediately before onResume() when your activity is re-starting.
- onPause()
系統(tǒng)準(zhǔn)備去撩別的activity的時候取具,當(dāng)前activity馬上要走了的時候被調(diào)用。在這個時候扁耐,趕緊把一些消耗CPU的資源放掉暇检,養(yǎng)精蓄銳,等activity回來喲婉称。[害羞臉]
- onStop()
當(dāng)你已經(jīng)完全看不到activity的時被調(diào)用块仆。
請注意:是完全看不到了,如果看到一根頭發(fā)絲都不會被執(zhí)行王暗,比如:彈出了一個對話框的activity悔据。
- onDestory()
在銷毀前被調(diào)用。[憂傷.jpg]
- onRestart()
在onStop之后俗壹,從停止?fàn)顟B(tài)變成運行科汗,那么經(jīng)過onRestart又回到onStart。
<br />
Activity被回收了之后
PS:
如何在屏幕旋轉(zhuǎn)的時候不重新創(chuàng)建activity?
設(shè)置android:configChanges="orientation"
- onSaveInstanceState()
會將activity狀態(tài)通過這個方法保存至Bundle對象绷雏,當(dāng)然你也可以額外增加鍵值存入Bundle來保存這些狀態(tài)头滔。
但是,一切的前提:activity不是被用戶finish的涎显!
- onRestoreInstanceState()
這個方法可以理解為恢復(fù)上面大哥臨時保存的狀態(tài)坤检。
產(chǎn)生的Bundle對象傳遞到該方法以及onCreate()方法中。
發(fā)現(xiàn)了嗎棺禾?這就是onCreate()里面的參數(shù)缀蹄。
[圖片上傳失敗...(image-ce8dff-1590652745088)]
public class MainActivity extends AppCompatActivity {
String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
if (savedInstanceState != null) {
data = savedInstanceState.getString("data_key");
}
......
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String temp = "ahahaha";
outState.putString("data_key", temp);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
data = savedInstanceState.getString("data_key");
}
}
}
Activity的四種啟動模式
AndroidMainifest啟動
-
standard -- 標(biāo)準(zhǔn)啟動模式
默認(rèn)模式,可以理解為疊羅漢,每次都會創(chuàng)建新的實例缺前,覆蓋在原來的額上面蛀醉。
-
singleTop
判斷棧頂最上層是不是我們需要啟動的activity。如果是衅码,則不需要創(chuàng)建新的實例拯刁。
-
singleTask
檢查整個棧中是否有需要啟動的activity,如果存在則將該activity以上的所有acitivity都銷毀逝段。
-
singleInstance
這個聲明的activity會出現(xiàn)在一個新的棧中奶躯,這個棧只有這一個activity帚桩。兩個應(yīng)用之間可以共享這一個activity。
Intent Flag啟動
(該方法優(yōu)先級高于AndroidMainifest啟動)
FLAG_ACTIVITY_NEW_TASK
使用一個新的Task來啟動一個Activity嘹黔。
通常使用在從Service中啟動Activity場景账嚎,由于Service中不存在Activity棧,使用改Flag創(chuàng)建一個新的Activity棧儡蔓,并創(chuàng)建新的Activity實例郭蕉。FLAG_ACTIVITY_SINGLE_TOP
相當(dāng)于android:launchMode="singleTop"
<br />FLAG_ACTIVITY_CLEAR_TOP
相當(dāng)于android:launchMode="singleTask"
<br />-
** FLAG_ACTIVITY_NO_HISTORY**
使用這種模式啟動activity,當(dāng)當(dāng)前activity啟動其他activity之后喂江,該activity消失召锈,不保留在Activity棧中。
<br />
<br />
IntentFilter匹配規(guī)則
IntentFilter過濾信息有:action获询、category涨岁、data。
一個過濾列表中可以有多個筐付。
只有同時匹配這三項才能成功啟動目標(biāo)Activity卵惦。
一個Activity中可以有多個過濾列表,只要匹配任何一組即可成功啟動目標(biāo)Activity瓦戚。
action匹配規(guī)則
當(dāng)一個過濾規(guī)則中有多個action時沮尿,只要Intent中的action能和過濾規(guī)則中任意一個action相同,即匹配成功较解。category匹配規(guī)則
1.category是一個字符串畜疾,系統(tǒng)有預(yù)定義一些,我們也可以定義自己的category印衔。
2.當(dāng)存在多個的時候啡捶,必須使每一個Intent中的category和過濾規(guī)則中的category完全相同,才能匹配成功奸焙。
3.當(dāng)不存在時瞎暑,系統(tǒng)在調(diào)用startActivity或startActivityForResult的時候默認(rèn)為Intent加上“android.intent.category.DEFAULT”彤敛。
4 .為了使activity可以接收隱式調(diào)用,必須在intent-filter中指定“android.intent.category.DEFAULT”了赌。
- data匹配規(guī)則
與action類似墨榄,但結(jié)構(gòu)較為復(fù)雜。
<!-- data語法 -->
<intent-filter>
<data
android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
……
</intent-filter>
<!-- 也可以寫成 -->
<intent-filter>
<data android:host="string" />
<data android:mimeType="string" />
……
</intent-filter>
data由兩部分組成勿她,mime和URI袄秩,見下圖
eg:
intent.setDataAndType(Uri.parse("http://123"),"image/jpeg");