Activity的生命週期
什麼是Activity?
當用戶瀏覽、退出和返回應用時,應用中的
Activity
實例會在其生命週期的不同狀態間轉換。
Activity
類會提供許多回調,這些回調會讓 Activity 知曉某個狀態已經更改:系統正在創建、停止或恢復某個 Activity,或者正在銷燬該Activity 所在的進程。
在生命週期回調方法中,我們可以聲明用戶離開和再次進入 Activity 時 Activity 的行爲方式。
例如,如果您正在構建流式視頻播放器,則當用戶切換至另一應用時,您可能要暫停視頻並終止網絡連接。當用戶返回時,您可以重新連接到網絡,並允許用戶從同一位置繼續播放視頻。
Activity的作用?
良好的生命週期回調實現有助於確保應用避免:
- 當用戶在使用應用時接聽來電,或切換至另一應用時崩潰。
- 當用戶未積極使用它時,消耗寶貴的系統資源。
- 當用戶離開應用並在稍後返回時,丟失用戶的進度。
- 當屏幕在橫向和縱向之間旋轉時,崩潰或丟失用戶的進度。
Activity 生命週期概念
爲了在 Activity 生命週期的各個階段之間導航轉換,Activity 類提供六個核心回調:onCreate()
、onStart()
、onResume()
、onPause()
、onStop()
和 onDestroy()
。當 Activity 進入新狀態時,系統會調用每個回調。
下圖是Activity的總生命週期:
Activity 生命週期每個方法的含義和作用
在這裏,我儘量將每個方法的功能進行簡化,方便大家理解。
1. onCreate
:創建方法
- 生命週期的第一個方法
- 進行Activity初始化工作
- 此時Activity還在後臺,不可見,故動畫不應在此初始化
2. onStart
:啓動方法
- 生命週期的第二個方法
- Activity可見,但未出現在前臺
- 由於未出現在前臺,無法交互
3. onResume
:繼續/重新開始方法
- Activity出現前臺且可見
- 可交互
4.onPause
:暫停方法
- Activity要跳到另一個Activity或應用正常退出時都會執行此方法
- Activity在前臺並可見
5. onStop
:停止方法
- Activity不可見
- Activity對象仍在內存中,沒有被銷燬
- 主要參與資源回收工作
6. onDestroy
:毀滅方法
- Activity被銷燬,不可見
- 可以將剩餘資源釋放,以及回收工作
7. onRestart
:重新開始方法
- Activity可見
- 當用戶按Home鍵切換到桌面後又切回來或者從後一個Activity切回前一個Activity就會觸發這個方法
- 一般不進行操作
下面這張圖片很好地總結了幾種方法的特點:
實際測試
Activity其實是繼承了ApplicationContext這個類,如下代碼:
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
爲了更好理解,我們可以重寫以上方法,用Log進行輸出,源碼如下:
package com.example.activitycreate;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example);
Log.i("MainActivity","調用onCreate()方法");
}
//當頁面可見時
@Override
protected void onStart() {
super.onStart();
Log.i("MainActivity","調用onStart()方法");
}
//當Activity獲取焦點開始與用戶交互時
@Override
protected void onResume() {
super.onResume();
Log.i("MainActivity","調用onResume()方法");
}
//Activity被覆蓋鎖屏執行
@Override
protected void onPause() {
super.onPause();
Log.i("MainActivity","調用onPause()方法");
}
//頁面不可見
@Override
protected void onStop() {
super.onStop();
Log.i("MainActivity","調用onStop()方法");
}
//頁面銷燬
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("MainActivity","調用onDestroy()方法");
}
//頁面重新啓用
@Override
protected void onRestart() {
super.onRestart();
Log.i("MainActivity","調用onRestart()方法");
}
}
運行工程後,打開Logcat視窗,加一個過濾器,如下圖:
下面開始測試:
打開應用:onCreate()->onStart()->onResume
Back鍵:onPause()->onStop()->onDestory()
Home鍵:onPause()->onStop()
Home鍵後再次啓動:onRestart()->onStart()->onResume()
大功告成!