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