一源内、Activity的介紹
Activity是Android的四大組件之一油够。是用戶操作的可視化界面;它為用戶提供了一個完成操作指令的窗口鱼响。當(dāng)我們創(chuàng)建完畢Activity之后,需要調(diào)用setContentView()方法來完成界面的顯示组底;以此來為用戶提供交互的入口丈积。在Android App 中只要能看見的幾乎都要依托于Activity,所以Activity是在開發(fā)中使用最頻繁的一種組件
二债鸡、Activity的生命周期
官方提供的生命周期切換圖
onCreate:表示activity正在被創(chuàng)建江滨,這是生命周期的第一個方法,在這個方法中我們可以做一些初始化工作厌均,比如調(diào)用setContentView去加載界面布局和初始化所需數(shù)據(jù)等唬滑。
onRestart:表示1activity正在被重新打開,一般情況下棺弊,當(dāng)1activity由不可見變成可見會調(diào)用onRestart方法晶密。比如用戶按home鍵,手機(jī)回到桌面或者重新打開一個新的2activity模她,接著用戶回到1activity事稻艰,會重新調(diào)用1activity的onRestart方法。
onStart:表示activity正在被啟動侈净,即將展示出來尊勿,這時activity是可見的,但是沒有展示在前臺畜侦,也無法和用戶進(jìn)行交互运怖。這個時候可以理解為activity已經(jīng)創(chuàng)建出來,但是我們看不到夏伊。
onResume:表示activity已經(jīng)可見了摇展,并且出現(xiàn)在前臺并開始活動。和onStart的區(qū)別是溺忧,activity都創(chuàng)建出來了咏连,但是在onStart時候,activity在后臺活動(不可見)鲁森,onResume時候祟滴,activity在前臺活動(可見)
onPause:表示activity正在停止,這個方法最好不要太耗時的操作歌溉,因?yàn)闀绊懶耡ctivity的顯示垄懂。比如在1activity中啟動2activity骑晶,會先調(diào)用1activity的onPause方法,然后才會調(diào)用2activity的onResume方法草慧。
onstop:表示activity即將停止桶蛔,可以做一些重量級的回收工作,同樣不同臺耗時漫谷。
onDestro:表示activity即將銷毀仔雷,這是activity的生命周期的最后一個回調(diào),我們可以做一些回收工作和資源的釋放舔示。
三碟婆、正常情況下生命周期調(diào)用分析
1、第一次啟動一個1activity惕稻,回調(diào)如下onCreate->onStart->onResume
2竖共、當(dāng)點(diǎn)擊home按鈕之后,回調(diào)如下onPause->onStop
3俺祠、當(dāng)重新啟動1activity肘迎,回調(diào)如下onRestart->onStart->onResume
4、在1activity中啟動新的2activity锻煌,回調(diào)如下1onPause->2onCreate->2onStart->2onResume->1onStop(注:如果啟動的2activity設(shè)置透明主題,1不會走onStop方法)
5姻蚓、點(diǎn)擊back按鈕宋梧,返回1activity,回調(diào)如下2onPause->1onRestart->1onStart->1onResume->2onStop->2onDestroy
6狰挡、息屏狀態(tài)及設(shè)備屏幕被點(diǎn)亮捂龄,回調(diào)如下onPause->onStop->onRestart->onStart->onResume
四、異常情況下的生命周期分析
保存數(shù)據(jù)和數(shù)據(jù)的回復(fù)
保存數(shù)據(jù)onSaveInstanceState
activity在異常情況下終止加叁,activity會在onStop之后倦沧,通過onSaveInstanceState方法的bundle對象保存數(shù)據(jù),并把數(shù)據(jù)傳遞給onRestoreInstanceState和onCreate方法它匕。(在1activity中啟動2activity展融,也會調(diào)用onSaveInstanceState方法)
恢復(fù)數(shù)據(jù)onRestoreInstanceState
activity被異常銷毀之后,重建activity會在onStart之后調(diào)用onRestoreInstanceState方法豫柬,并獲取bundle數(shù)據(jù)告希,獲取銷毀之前的activity數(shù)據(jù)。因此我們也可以通過onRestoreInstanceState和onCreate方法判斷activity是否被重建(1activity中啟動2activity烧给,點(diǎn)擊back按鈕燕偶,不會調(diào)用這個方法)
同時,我們要知道础嫡,在onSaveInstanceState和onRestoreInstanceState方法中指么,系統(tǒng)自動會幫我做一定的恢復(fù)工作。當(dāng)activity在異常狀態(tài)下需要重建時,系統(tǒng)會幫我們保存當(dāng)前activity的視圖結(jié)構(gòu)伯诬,并且在activity重啟為我們恢復(fù)這些數(shù)據(jù)晚唇,比如文本框用戶輸入的數(shù)據(jù),listView滾動的位置等姑廉,這些view相關(guān)的狀態(tài)系統(tǒng)都會默認(rèn)為我們恢復(fù)缺亮。恢復(fù)的原因是view和activity一樣桥言,有onSaveInstanceState和onRestoreInstanceState方法萌踱。
1、橫豎屏切換生命周期的回調(diào)及狀態(tài)的保存
回調(diào)如下:onPause->onStop->OnSaveInstanceState->onDestroy->onCreate->onStart->onRestoryInstanceState->onPause
2号阿、資源內(nèi)存不足優(yōu)先級低的activity被回收并鸵,生命周期的回調(diào)及狀態(tài)的保存
activity的優(yōu)先級
1、前臺activity---正在和用戶交互的activity
2扔涧、可見單非前臺activity---activity彈出對話框园担,導(dǎo)致activity可見但不可交互
3、后臺activity--已經(jīng)暫停的activity,比如執(zhí)行了onStop枯夜,優(yōu)先級最低
當(dāng)系統(tǒng)內(nèi)存不足時弯汰,會安裝優(yōu)先級殺掉目標(biāo)activity所在的進(jìn)程,并通過onSaveInstanceState和onRestoreInstanceState方法保存和恢復(fù)數(shù)據(jù)湖雹。
五咏闪、android:ConfigChanges,用于捕獲手機(jī)狀態(tài)的改變
android中的組件Activity在manifest.xml文件中可以指定參數(shù)android:ConfigChanges摔吏,用于捕獲手機(jī)狀態(tài)的改變鸽嫂。 在Activity中添加了android:configChanges屬性,在當(dāng)所指定屬性(Configuration Changes)發(fā)生改變時征讲,通知程序調(diào)用onConfigurationChanged()函數(shù)据某。
設(shè)置方法:將下列字段用“|”符號分隔開,例如:“l(fā)ocale|navigation|orientation”
橫豎屏切換的時候诗箍,不重新構(gòu)建activity方法
在manifest.xml文件中癣籽,給activity添加配置configChange
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
并且在activity中重寫onConfigurationChanged方法
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
Log.d("ysl","onConfigurationChanged")
when (newConfig.orientation) {
Configuration.ORIENTATION_LANDSCAPE -> {
//橫屏
}
Configuration.ORIENTATION_PORTRAIT -> {
//豎屏
}
else->{
}
}
}
當(dāng)activity配置android:configChanges="orientation|screenSize" ,橫豎屏切換不會調(diào)用onSaveInstanceState和onRestoreInstanceState方法滤祖,只會調(diào)用onConfigurationChanged方法才避。
六、禁止屏幕旋轉(zhuǎn)的方法
1氨距、在AndroidManifest.xml中設(shè)置activity 中的android:screenOrientation 屬性值
2桑逝、在Activity 中調(diào)用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)