### 1.1 Activity生命周期全面分析
* 典型情況下生命周期:是指在有用戶參與的情況下,Activity所經過的生命周期的改變
* 異常情況下的生命周期:指Activity被系統回收或者由于當前設備的配置發生改變從而導致Activity被銷毀重建。
#### 1.1.1 典型情況下生命周期分析
生命周期的7個方法
* (1)**onCreate**:表示**Activity正在被創建**,這是生命周期的第一個方法。在這個方法中,我們可以**做一些初始化工作**,比如調用setContentView 去加載界面布局資源、初始化Activity
所需數據等。
* (2) **onRestart**:表示Activity 正在重新啟動。**一般情況下,當當前Activity 從不可見重新變為可見狀態時,onRestart就會被調用**。這種情形一般是用戶行為所導致的,比如用戶按Home鍵切換到桌面或者用戶打開了一個新的Activity,這時當前的Activity 就會暫停,也就是onPause 和on Stop 被執行了,接著用戶又問到了這個Activity,就會出現這種情況。
* (3)**onStart**:表示Activity 正在被啟動,即將開始,這時**Activity 已經可見了,但是還沒出現在前臺,還無法和用戶交互**。這個時候其實可以理解為**Activity已經顯示出來了,但是我們還看不到。
可見,不可交互,并沒有出現在前臺。**
* (4)**onResume**:表示Activity 已經**可見了,并且出現在前臺并開始活動**。要注意這個和onStart 的對比, onStart 和onResume 都表示Activity已經可見,但是onStart 的時候Activity還在后臺, onResume 的時候Activity 才顯示到前臺。
* (5) **onPause** :表示Activity 正在停止, 正常情況下,緊接著onStop 就會被調用。在特殊情況下,如果這個時候快速地再回到當前Activity , 那么onResume 會被調用。筆者的理解是,這種情況屬于極端情況,用戶操作很難重現這一場景。此時可以做一些存儲數據、停止動畫等工作,但是**注意不能太耗時,因為這會影響到新Activity 的顯示, onPause 必須先執行完,新Activity的onResume才會執行。可見,但不可交互。**
* (6)**onStop** :表示Activity即將停止,**可以做一些稍微重量級的回收工作,同樣不能太耗時**。
* (7)**onDestroy**:表示Activity即將被銷毀,這是Activity生命周期中的最后一個回調,在這里,我們可以**做一些回收工作和最終的資源釋放。**
Activity生命周期的切換過程

* (1)Activity第一次啟動:onCreate->onStart->onResume。
* (2)一般情況下,當當前Activity從不可見重新變為可見狀態時,onRestart方法就會被調用。
* (3)當用戶打開新的Activity或者切換到桌面的時候,回調如下:onPause -> onStop,但是如果新Activity采用了透明主題,那么onStop方法不會被回調。當用戶再次回到原來的Activity時,回調如下:onRestart -> onStart -> onResume。
* (4) 用戶退出Activity,onPause->onStop->onDestroy。
* (5)當Activity 被系統回收后再次打開,生命周期方法向調過程和(1) 一樣,注意只是生命周期方法一樣,不代表所有過程都一樣
* (6)
* 從整個生命周期來說, onCreate 和onDestroy 是配對的,分別標識著Activity的創建和銷毀,井且只可能有一次調用。
* 從Activity是否可見來況, onStart 和onStop 是配對的,隨著用戶的操作或者設備屏幕的點亮和熄滅,這兩個方法可能被調用多次
* 從Activity 是否在前臺來說, onResume 和onPause 是配對的,隨著用戶操作或者設備屏幕的點亮和熄滅,這兩個方法可能被調用多次。
* (7)onStart和onStop對應,它們是從Activity是否可見這個角度來回調的;onPause和onResume方法對應,它們是從Activity是否位于前臺這個角度來回調的。
* (8)從Activity A進入到Activity B,回調順序是onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A),所以不能在onPause方法中做重量級的操作,因為必須onPause執行完成之后新Activity才能Resume
* (9)onStart開始到onStop之前,Activity可見。onResume到onPause之前,Activity可以接受用戶交互。
* (10)在新Activity啟動之前,棧頂的Activity需要先onPause后,新Activity才能啟動。所以不能在onPause執行耗時操作。onStop中也不可以太耗時,資源回收和釋放可以放在onDestroy中。
* (11)Activity 的啟動過程的源碼相當復雜,涉及Instrumentation、ActivityThread和ActivityManagerService(下面簡稱AMS )。簡單理解,啟動Activity的請求會由Instrumentation 來處理,然后它通過Binder向AMS發請求,AMS內部維護著一個ActivityStack并負責棧內的Activity的狀態同步,AMS通過ActivityThread去同步
Activity的狀態從而完成生命周期方法的調用
#### 1.1.2 異常情況下生命周期分析
**1、資源相關的系統配置發生改變導致Activity被殺死并重新創建**
例如Activity處于豎屏狀態,如果突然旋轉屏幕,由于系統配置發生了改變,Activity就會被銷
毀并重新創建。

1. onSaveInstanceState方法只會出現在Activity被異常終止的情況下被調用,它的調用時機是在onStop之前,它和onPause方法沒有既定的時序關系,可能在它之前,也可能在它之后。
2. 當Activity被重新創建的時候,onRestoreInstanceState會被回調,它的調用時機是onStart之后。
當Activity被重新創建的后系統會調用onRestoreInstanceState和onCreate方法來判斷Activity是否被重建了;如果被重建了,可以取出之前保存的數據并恢復。
3. 系統只會在Activity即將被銷毀并且有機會重新顯示的情況下才會去調用onSaveInstanceState方法。
4. onSaveInstanceState方法和onRestoreInstanceState方法中,系統自動為我們做一定的恢復工作。當Activity在異常情況下需要重新創建時,系統會默認為我們保存當前Activity的視圖結構,并且在Activity重啟后為我們恢復這些數據,比如文本框中用戶輸入的數據、listview滾動的位置等,這些view相關的狀態系統都會默認為我們恢復。具體針對某一個view系統能為我們恢復哪些數據可以查看view的源碼中的onSaveInstanceState和onRestoreInstanceState方法。
5. 關于保存和恢復View層次結構,系統的工作流程是:Activity被意外終止,調用onSaveIntanceState保存數據-> Activity委托Window,Window委托它上面的頂級容器一個ViewGroup( 可能是DecorView) 。然后頂層容器在通知所有子元素來保存數據。
**2、資源內存不足導致低優先級的Activity被殺死**
**Activity按優先級的分類**
(從高到低)
前臺Activity:正在和用戶交互的Activity,優先級最高
可見但非前臺Activity:比如Activity中彈出一個對話框,導致Activity可見但是位于后臺無法和用戶直接交互
后臺Activity:已經被暫停的Activity,比如執行了onStop,優先級最低
當系統內存不足時,系統就會按照上述優先級去殺死目標Activity所在的進程,并在后續通過onSavelnstanceState 和onRestorelnstanceState 來存儲和恢復數數據。**如果一個進程中沒有四大組件在執行,那么這個進程將很快被系統殺死**,因此,一些后臺工作不適合脫離四大組件而獨自運行在后臺中,這樣進程很容易被殺死。比較好的方法是將后臺工作放入Service中從而保證進程有一定的優先級,這樣就不會輕易地被系統殺死。
(3)`android:configChanges="xxx"`屬性,常用的主要有下面三個選項:
**local**:設備的本地位置發生了變化,一般指切換了系統語言;
**keyboardHidden**:鍵盤的可訪問性發生了變化,比如用戶調出了鍵盤;
**orientation**:屏幕方向發生了變化,比如旋轉了手機屏幕。
配置了android:configChanges="xxx"屬性之后,Activity就不會在對應變化發生時重新創建,而是調用Activity的onConfigurationChanged方法。
下表是configChanges的項目和含義

>[info] 注意:screenSize和smallestScreenSize,這兩個比較特殊,它們的行為和編譯選項有關,但和運行環境無關
- 前言
- 第一章Activity的生命周期和啟動模式
- 1.1 Activity生命周期全面分析
- 1.2 Activity的啟動模式
- 1.3 IntentFilter的匹配規則
- 第二章IPC
- 轉 chapter IPC
- 轉IPC1
- 轉IPC2
- Binder講解
- binder
- Messenger
- 一、Android IPC簡介
- 二、Android中的多進程模式
- 三、IPC基礎概念介紹
- 四、Android中的IPC方式
- 五、Binder連接池
- 第三章
- 第九章四大組件的工作過程
- 第十章
- 第13章 綜合技術
- 使用CrashHandler 來獲取應用的crash 信息
- 使用Multidex來解決方法數越界
- Android的動態加載技術