1.1 activity的生命周期全解析

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");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 啟動與銷毀Activity 不同于使用 main() 方法啟動應(yīng)用的其他編程范例,Android 系統(tǒng)會通過調(diào)用對...
    安卓Boy閱讀 1,877評論 3 5
  • 您的應(yīng)用中的Activity應(yīng)該做到如下需求: 1.用戶在使用應(yīng)用時(shí)接聽來電或切換到另一個(gè)應(yīng)用,它不會崩潰。 2....
    正陽Android閱讀 602評論 1 0
  • 移動應(yīng)用客戶端與服務(wù)器之間的通信協(xié)議,目前比較主流的有Facebook的Thrift,騰訊的JCE,以及Googl...
    stefanli閱讀 7,361評論 0 15
  • 時(shí)間用途: 1.學(xué)習(xí)工作技巧 2.見客戶,增員(主顧開拓算在里面) 3.讀書 其他的事情都視為浪費(fèi)時(shí)間
    二強(qiáng)筆談閱讀 266評論 0 1
  • 顧城的《避免》里有這樣一句話:你不愿意種花,你說,我不愿意看見它,一點(diǎn)點(diǎn)凋落,是的,為了避免結(jié)束,你避免了一切...
    YZY_1989閱讀 931評論 0 1

友情鏈接更多精彩內(nèi)容