Activity 使用詳解
本篇文章主要介紹 Android
開發中的部分知識點,通過閱讀本篇文章,您將收穫以下內容:
- Activity 生命週期 簡介
- Activity 必須在AndroidMainfest.xml 中註冊
- 啟動Activity 的方法
- 啟動帶返回值的Activity
- Activity結束 方法
- Activity狀態儲存,恢復的方法
- 面試中經常問到的例子
Activity
是 Android
最基本的四大元件之一( Activity
活動, Service
服務, ContentProvider
內容提供者, BroadcastReceiver
廣播), Activity
主要負責與使用者進行互動,是每位 Android
開發必須掌握的知識點。
1. Activity 生命週期 簡介
首先我們需要了解一下 Activity
的繼承關係。
Activity 繼承關係
Activity
繼承關係如下:
java.lang.Object ↳android.content.Context ↳android.content.ContextWrapper ↳android.view.ContextThemeWrapper ↳android.app.Activity
理解完 Activity
的繼承關係後,我們開始瞭解 Activity
的宣告週期, Activity
的生命週期直接影響到與使用者的互動,此宣告週期很重要。
Activity 生命週期
Activity
生命週期圖如下:

Activity 生命週期圖
在程式碼中 Activity
生命週期回撥方法
Activity
生命週期回撥方法如下:
// Activity 建立方法 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "----onCreate----"); setContentView(R.layout.activity_methods); } // Activity 在最新任務列表中開啟時候會走此方法 @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "----onRestart----"); } // Activity 在onCreate 或者 onRestart之後執行 @Overrideprotected void onStart() { super.onStart(); Log.i(TAG, "----onStart----"); } // 正在與使用者互動的介面 @Override protected void onResume() { super.onResume(); Log.i(TAG, "----onResume----"); } // 被其他與使用者互動的Activity 部分覆蓋 @Override protected void onPause() { super.onPause(); Log.i(TAG, "----onPause----"); } // 被其它與使用者互動的Activity 全部覆蓋 @Override protected void onStop() { super.onStop(); Log.i(TAG, "----onStop----"); } // Activity 銷燬時候呼叫此方法 @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "----onDestroy----"); }
Activity 4 種 生命週期狀態
Activity
常見的四種生命週期狀態如下:
- Active 執行狀態
- Pause 暫停狀態
- Stop 停止狀態
- Killed 消亡狀態
2. Activity 必須在 AndroidMainfest.xml 中註冊
Activity
是四大元件之一, Android
規定四大元件必須在 AndroidMainfest.xml
中註冊, Activity
如果不註冊,則會引起 App Crash
報錯。
ActivityNotFoundException
如 Activity
不在 AndroidMainfest.xml
中註冊,則app將會報錯,報錯主要異常資訊如下 :
ActivityNotFoundException
例如以下報錯資訊:
//提示未在 AndroidMainfest.xml 中找到Activity類的宣告 android.content.ActivityNotFoundException:Unable to find explicit activity class //具體類名,包名如下: {com.wj.utils/com.wj.utils.basewidget.BaseButtonMethods}; //需要在AndroidManifest 中宣告 have you declared this activity in your AndroidManifest.xml?

ActivityNotFoundException 異常Log 分析
Activity 註冊方法如下:
<manifest ... > <application ... > <activity android:name=".BaseButtonMethods" /> ... </application ... > ... </manifest >
常用Action 標籤
android.action.MAIN
:
表示是當前 App
的入口 main
方法類。
android.intent.category.LAUNCHER
:
表示 此 Action
會被 Launcher
掃描到,可以顯示在 Launcher
的 Icon
列表上,如果去掉此 Action
,則無法在 Launcher
種檢視到此 app
的 Icon
。
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
3. 啟動Activity 的方法
顯示啟動
Intent intent = new Intent(ActivityMethods.this, OtherActivity.class) startActivity(intent);
隱式啟動
Intent intent = new Intent("string_action"); // intent.setAction("string_action"); startActivity(intent);
4. 啟動帶返回值的Activity
啟動帶返回值的Activity方法
Intent intent = new Intent(); intent.setClass(ActivityMethods.this, OtherActivity.class); startActivityForResult(intent, mRequestCode);
處理返回值的回撥方法
//獲取 Activity 返回結果的方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == mRequestCode && resultCode == mResultCode) { String result = data.getStringExtra("str_set_result"); Toast.makeText(this, "result :" + result, Toast.LENGTH_SHORT).show(); } }
被啟動Activity設定返回值的方法
int resultCode = 101; Intent intent = new Intent(); intent.putExtra("str_set_result", "帶返回結果的Activity"); setResult(resultCode, intent);
5. Activity結束 方法
如果想結束掉當前 Activity
,可以呼叫一下方法
//1.直接呼叫finish方法 ,結束當前Activity finish(); //2.根據請求碼結束Activity finishActivity(int requestCode);
6. Activity狀態儲存,恢復的方法
當 Activity
異常退出時候, Activity
會自動儲存一些資料,但是,如果是 app
重要資料,還請在程式碼中手動儲存 Bundle
型別的資料,防止 Activity
儲存的資料不理想。
Activity 狀態儲存與恢復
Activity 狀態儲存與恢復的週期圖如下:

Activity 狀態儲存生命週期圖
Activity 狀態儲存與恢復的回撥方法
Activity
狀態儲存與恢復的回撥方法如下:
// Activity 恢復資料的方法,經常在 oncreate 方法中恢復資料 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i(TAG, "----onRestoreInstanceState----"); } // Activity 儲存資料的方法,經常在 onPause 方法中儲存資料 @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); Log.i(TAG, "----onSaveInstanceState----"); }
7. 面試中經常問到的例子
Activity A 啟動 Activity B, 然後再返回A,簡述一下其生命週期?
- 首先
A
啟動的宣告週期如下:
01-02 21:25:22.357 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onCreate---- 01-02 21:25:22.396 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStart---- 01-02 21:25:22.402 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onResume----
- 點選
A
中的Button
,跳轉到B
,此時宣告週期關係如下:
01-02 21:28:30.617 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onPause---- 01-02 21:28:30.723 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onCreate---- 01-02 21:28:30.729 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onStart---- 01-02 21:28:30.738 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onResume---- 01-02 21:28:31.320 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStop----
- 結束
B
,返回A
,生命週期如下:
01-02 21:29:38.646 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onPause---- 01-02 21:29:38.668 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onRestart---- 01-02 21:29:38.672 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStart---- 01-02 21:29:38.674 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onResume---- 01-02 21:29:39.058 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onStop---- 01-02 21:29:39.059 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onDestroy----
總結:
Activity A
啟動 Activity B
, 簡述一下其生命週期? 大致流程如下圖:

Activity A 啟動 Activity B, 然後再返回A生命週期大致圖
最後
資料領取: 點贊+加群免費獲取Android IOC架構設計
加群Android IOC架構設計領取獲取往期Android高階架構資料、原始碼、筆記、視訊。高階UI、效能優化、架構師課程、NDK、混合式開發(ReactNative+Weex)微信小程式、Flutter全方面的Android進階實踐技術,群內還有技術大牛一起討論交流解決問題。

