Activity生命周期的学习和验证
1.引子
Activity就像是英文詞匯本的Abandon,開篇就能碰到,關于Activity生命周期的博客教程非常多,側面說明Activity非常重要,其中的Activity的生命周期又是重中之重,面試官非常喜歡拿這個作為考點,因為掌握Activity生命周期對提高應用的健壯性具有很大的幫助。因為只看教程不自己總結實踐的話,對其理解總會差點意思,自己動手總結了印象才深刻。
2.Activity生命周期
一個Activity具有四個狀態:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q97Zcg70-1586575759198)(./assets/可見.png)]
Activity生命周期其實是一個有限狀態機,描述Activity對象如何在以上4種狀態之間轉換的,生命周期如圖所示,圖中矩形表示當Activity狀態跳轉時執行的回調方法。彩色橢圓矩形是Activity可以進入的主要狀態,當然細心的同學會疑惑,彩色橢圓矩形里寫的主要狀態和4種狀態對不上了,例如沒見可見狀態啊,個人認為彩色橢圓矩形指的是Activity動作狀態,例如啟動,運行,銷毀,而上述4種狀態是所處的靜態狀態,在周期圖里用文字描述里,例如Activity進入可見狀態,用The Activity is no longer visible來描述了。
這個圖我們也許見過多次,跟詞匯本老朋友Abandon一樣,這個圖非常重要,掌握了這個圖,才能叫掌握Activity。
Activity生命周期有三種類型,其一是Activity的整個生命周期(entire lifetime),從onCreate()開始,到onDestroy()結束,也就是從出生到死亡,貫穿了Activity平庸的一生,Activity在onCreate()中完成所有全局狀態設置,在onDestroy()中釋放所有Activity資源;
其二是可見生命周期(visible lifetime),發生在onStart()到onStop()之間,如圖所示,為什么叫可見生命周期,這是因為周期開始onStart()和結束onStop()Activity處于可見狀態,不過處于可見狀態Activity還不能和用戶進行交互,只能遠觀。我們發現其實可見生命周期大多數步驟還是和整個生命周期步驟是重合的,為何還單獨提出來呢?因為周期的側重點不同,在可見生命周期內可重點管理給用戶顯示所需的資源,例如UI的更改,而整個生命周期則可重點管理維護貫穿整個生命周期的資源。
最后是前臺生命周期(foreground lifetime),發生在onResume()到onPause之間在此期間,Activity處于運行狀態,能夠與用戶進行交互。Activity頻繁在onResume和onPause之間進行切換-例如設備鎖屏和解鎖,Activity被其他Activity覆蓋和恢復等,因為頻繁切換,所以應避免在這個生命周期內執行過多的代碼,避免界面卡頓。
我們注意到,這三個生命周期發生的頻度是逐漸增加的,就像時鐘的三根針,整個生命周期是時針,步驟最長最多,發生的頻度較低,可見生命周期是分針,步驟少一點,前臺生命周期是秒針,步驟最少,發生的頻度最高,開發者應根據這三類生命周期的特點,合理安排Activity所需資源的加載。
3.生命周期回調方法
3.1 生命周期回調方法介紹
我們來看一下生命周期里每一個環節的回調方法
onCreate()
Activity第一次創建時調用該方法,可在該方法中完成Activity初始化操作,例如創建視圖,綁定按鈕事件或其他全局性的資源加載。這是Activity整個生命周期的開始。
onStart()
當活動對用戶可見時調用,是Activity可見生命周期的開始。
onResume()
當Activity開始與用戶互動時調用。 此時Activity位于堆棧的頂部并處于運行狀態。是Activity前臺生命周期的開始。
onPause()
當Activity失去焦點或者即將隱藏/停止或銷毀時調用,執行該方法期間Activity對用戶仍可見,直到另一個Activity覆蓋,一個比較相似的例子是游戲加載,在加載完新場景之前原場景一直對玩家顯示,不過為了不能讓玩家覺得是死機了,加載場景會切換成過場片段或者過場畫面例如展示一下游戲技巧等給玩家知道游戲沒有死機,同樣道理,onPause()一樣是執行過場的動作,官方推薦調用這個方法時讓UI保持活動,同時方法內要執行的操作盡可能輕量化,別做太多的耗時操作。
onStop()
當Activity對用戶完全不可見時調用,例如另一個Activity在棧頂,完全覆蓋了當前的Activity,或者該Activity正在被銷毀。該回調方法和onPause()方法的主要區別在于,如果啟動的新Activity是一個對話框式的activity,那么,onPause()方法會得到執行,而onStop()方法并不會執行。
onDestory()
這個回調方法在Activity被銷毀之前調用。
onRestart()
在Activity停止之后,再次啟動之前調用,始終跟隨onStart()。
3.2 生命周期回調方法示例
我們在每個回調方法里添加log監控每個回調方法的運行情況,代碼如下,然后再來執行各種操作看Activity生命周期。
package com.test.activitydemo;import androidx.appcompat.app.AppCompatActivity;import android.app.AlertDialog; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView;public class MainActivity extends AppCompatActivity {Button bclick;TextView tv;String TAG="Activity Life";//@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bclick=findViewById(R.id.button);tv=findViewById(R.id.textView);tv.setText("活動狀態");Log.e(TAG, "start onCreate");bclick.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {tv.setText("可見狀態");AlertDialog alertDialog1 = new AlertDialog.Builder(MainActivity.this).setTitle("彈框")//標題.setMessage("彈框變成前景,驗證onPaus是否執行")//內容.setIcon(R.mipmap.ic_launcher)//圖標.create();alertDialog1.show();}});}// 當活動對用戶可見時調用,Activity可見生命周期的開始。@Overrideprotected void onStart(){super.onStart();Log.e(TAG, "start onStart");}// 在Activity停止之后,再次啟動之前調用,其后是onStart(),也就是可見生命周期開始.@Overrideprotected void onRestart(){super.onRestart();Log.e(TAG, "start onRestart");}// 前臺生命周期開始@Overrideprotected void onResume(){super.onResume();Log.e(TAG, "start onResume");}// 前臺生命周期結束前調用@Overrideprotected void onPause(){super.onPause();Log.e(TAG, "start onPause");}// 可見生命周期結束即將結束前調用@Overrideprotected void onStop(){super.onStop();Log.e(TAG, "start onStop");}// 銷毀前調用.@Overrideprotected void onDestroy(){super.onDestroy();Log.e(TAG, "start onDestroy");} }將普通Activity變成彈框式,只需要修改主題(Theme)成彈框主題即可,彈框主題在style.xml里設置,代碼如下
然后在AndroidManifest.xml里修改Activity主題
<activityandroid:name=".AlertDialogActiviy"android:theme="@style/dialogstyle" />最后在代碼中實現跳轉
Intent intent = new Intent(MainActivity.this, AlertDialogActiviy.class);startActivity(intent);這樣我們打開Activity彈框時,原Activity仍可見,我們看logcat,可看到已經調用onPause(),表示結束了前臺生命周期。我們點導航欄的返回鍵,回到原Activity界面,則回調onResume方法,重新進入前臺生命周期。
3. 現在來看下可見生命周期的示例。這個比較簡單,只要調用另外一個Activity或者回調桌面(桌面其實也是一個Activity)即可,只要讓我們的Activity不可見就行。為了方便(偷懶),我用回到桌面來驗證,驗證的logcat截圖如下,可以看到,首先回調onPause(),隨著Activity消失,桌面完全顯示,最后回調onStop(),正式結束可見生命周期。
然后我們再從桌面回到Activity,logcat截圖如下,首先回調onRestart(),宣布復活,然后是onStart(),進入可見生命周期,最后調用onResume(),進入前臺生命周期。
4. 最后看銷毀Activity的回調方法,操作方法很簡單,殺掉Activity即可調用,不再贅述。
總結
以上是生活随笔為你收集整理的Activity生命周期的学习和验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android消息机制基本原理和使用
- 下一篇: 无迹卡尔曼学习