1. 生命周期(共7個(gè))
- 1.onCreate:表示activity的創(chuàng)建,我們可以做初始化數(shù)據(jù)工作。
- 2.onStart:表示activity的可見,但我們還看不到。
- 3.onResume:表示activity出現(xiàn)在前臺,我們可以看到。
- 4.onPause:表示activity正在停止工作,緊接著會執(zhí)行onStop。這里不可以執(zhí)行耗時(shí)操作。因?yàn)楫?dāng)前activity的onPause執(zhí)行完,下一個(gè)activity的onResume才會執(zhí)行。
- 5.onStop:表示activity的停止工作。可以執(zhí)行一些耗時(shí)操作。
- 6.onDestory:表示activity的銷毀,我們可以做一些資源回收和釋放工作。
- 7.onRestart:表示activity正在重新啟動。出現(xiàn)的時(shí)機(jī)是activity的onPause和onStop執(zhí)行了,接著用戶又回到這個(gè)activity時(shí)。
2. 針對一個(gè)特定的Activity
- 第一次啟動:onCreate->onStart->onResume
- 再次回到原Activity:onRestart->onStart->onResume
- 用戶按back鍵:onPaume->onStop->onDestroy
3. 特殊情況,當(dāng)下一個(gè)activity采用了透明主題
那么當(dāng)前Activity不會回調(diào)onStop。也就是依舊可見,但不在前臺。因?yàn)橄乱粋€(gè)透明,可能還會看到當(dāng)前的activity。
4. onStart和OnResume,onStop和onPause的不同?
onStart和onStop表示是否可見;onResume和onPause表示是否在前臺。而且這兩塊多是連續(xù)操作,實(shí)際使用沒有明顯區(qū)別。注意onPause不能耗時(shí),如果下一個(gè)Activity是透明主題,則當(dāng)前Activity的onStop不會執(zhí)行。
5. 當(dāng)前activity的onPause和下一個(gè)activity的onResume哪個(gè)會先執(zhí)行?
用腳趾頭想想,如果下一個(gè)Activity的onResume先執(zhí)行,則會出現(xiàn)兩個(gè)activity在前臺并獲得焦點(diǎn),這是不可能的。所以當(dāng)前Activity的onPause先執(zhí)行,所以onPause中不要進(jìn)行耗時(shí)操作。
6. activity的啟動過程簡述
啟動Activity的請求會由instrumentation來處理,然后它通過Binder向AMS(ActivityManagerService)發(fā)請求,AMS內(nèi)部維護(hù)著一個(gè)ActivityStack并負(fù)責(zé)棧內(nèi)Activity的狀態(tài)同步,AMS通過ActivityThread去同步Activity的狀態(tài)而完成Activity生命周期方法的調(diào)用。
7. 系統(tǒng)資源加載機(jī)制簡述
比如圖片資源,當(dāng)我們把圖片放到drawable中時(shí),我們可以通過Resources去獲取。同時(shí)為了兼容不同設(shè)備,我們可能還需要在其他目錄放置不同的圖片,比如drawable-hdpi,drawable-xhdpi等。這樣,當(dāng)應(yīng)用程序啟動時(shí),系統(tǒng)就會根據(jù)當(dāng)前設(shè)備的情況去加載合適的Resources資源,同理橫豎屏也可能會加載不同圖片(drawable-hdpi-port和drawable-hdpi-land)。此時(shí)如果旋轉(zhuǎn)屏幕,由于系統(tǒng)配置發(fā)生了改變,默認(rèn)情況下,Activity就會被銷毀和重建。
8. 默認(rèn)情況下Activity的銷毀和重建生命周期
- 銷毀:onSaveInstanceState->onStop->onDestory
- 重建:onCreate->onStart->onRestoreInstanceState
onSaveInstanceState方法和onRestoreInstanceState方法和onPause,onResume方法無時(shí)間先后,和onStop,onStart方法是有時(shí)間先后的。他們存在的意義是當(dāng)Activity異常終止時(shí),保存和恢復(fù)一些數(shù)據(jù)。
9. activity和view在異常終止時(shí)的默認(rèn)操作
當(dāng)Activity被異常終止時(shí),Activity會調(diào)用onSaveInstanceState去保存數(shù)據(jù),然后Activity會委托window去保存數(shù)據(jù),window再委托頂級容器去保存數(shù)據(jù)。頂層容器是一個(gè)ViewGroup,一般是DecorView(decor-裝飾器)。最后頂層容器再去一一通知它的子View來保存數(shù)據(jù)。View也有onSaveInstanceState和onRestoreInstanceState方法,會保存一些view本身的數(shù)據(jù)。如textView會保存當(dāng)前文本以及選中狀態(tài);listview會保存滾動位置等。
10. Activity中的onSaveInstanceState和onRestoreInstanceState的正確使用方式
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
if (savedInstanceState != null) {
String test = (String) savedInstanceState.get("test");
Log.e("aaa","onCreate:"+test);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String test = "------------";
Log.e("aaa","onSaveInstanceState:"+test);
outState.putString("test",test);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String test = (String) savedInstanceState.get("test");
Log.e("aaa","onRestoreInstanceState:"+test);
}
打印的Log如下:
06-14 10:45:56.469 21070-21070/qingfengmy.behaviordemo.free E/aaa: onPause
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onSaveInstanceState:------------
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onStop
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onDestroy
06-14 10:45:56.556 21070-21070/qingfengmy.behaviordemo.free E/aaa: onCreate:------------
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onStart
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onRestoreInstanceState:------------
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onResume
恢復(fù)數(shù)據(jù)時(shí),其位置可以在onCreate或onRestoreInstanceState中,二者的區(qū)別是:onRestoreInstanceState一旦被調(diào)用,其參數(shù)saveInstanceState一定是有值的,不用判空。onCreate需要判空。官方建議用onRestoreInstanceState,實(shí)際開發(fā)中因?yàn)閛nCreate中會做初始化數(shù)據(jù),此時(shí)再執(zhí)行onRestoreInstanceState有時(shí)會造成重復(fù)。在onCreate中做空和不空的處理挺好。
11. Activity的優(yōu)先級
- 1.前臺Activity---正在和用戶交互的Activity,優(yōu)先級最高。
- 2.可見但非前臺Activity---如Activity彈了一個(gè)dialog,dialog獲得焦點(diǎn),Activity可見但非前臺。執(zhí)行了onPause.
- 3.后臺Activity---執(zhí)行了onStop的Activity
優(yōu)先級從1到3,逐漸降低。系統(tǒng)內(nèi)存不足時(shí)會從3到1去殺進(jìn)程。
12. 旋轉(zhuǎn)屏幕Activity不重建的方法
<activity
android:name=".TestActivity"
android:configChanges="orientation|keyboardHidden">
</activity>
configChanges可以有許多值,比如orientation-屏幕方向發(fā)生改變;keyboardHidden-屏幕訪問性發(fā)生改變,如彈出鍵盤;screenSize-屏幕尺寸發(fā)生改變(API13添加的)等。
Activity配置configChanges后,上面配置的信息發(fā)生改變時(shí),Activity不會重建,會執(zhí)行onConfigurationChanged方法。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.e("aaa","onConfigurationChanged");
}