1.1 activity的生命周期全解析

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");
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

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