<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### 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生命周期的切換過程 ![](https://box.kancloud.cn/f24f8b47d23148d4026bc274da950c11_710x856.png) * (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就會被銷 毀并重新創建。 ![](https://box.kancloud.cn/d4a54ccd8d625b41bf2d9ca2e6bd6b7c_524x330.png) 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的項目和含義 ![](https://box.kancloud.cn/de3457b66bed06c2255a25b38832d062_921x699.png) >[info] 注意:screenSize和smallestScreenSize,這兩個比較特殊,它們的行為和編譯選項有關,但和運行環境無關
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看