Activity 使用方法詳解
一、Activity 概覽
Activity是Android最基本的四大元件之一(Activity 活動,Service 服務,ContentProvider內容提供者,BroadcastReceiver 廣播),Activity主要負責與使用者進行互動,是每位Android開發必須掌握的知識點。四大元件必須在AndroidMainfest.xml 檔案中宣告。
Activity 繼承關係如下:
java.lang.Object ↳ android.content.Context ↳ android.content.ContextWrapper ↳ android.view.ContextThemeWrapper ↳ android.app.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之後執行 @Override protectedvoid 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
可以分為以下四種生命週期狀態
-
1.Active 執行狀態
-
2.Pause 暫停狀態
-
3.Stop 停止狀態
-
4.Killed 消亡狀態三、 Activity的註冊方法
三、 Activity的註冊方法
Activity是四大元件之一,Android規定四大元件必須在AndroidMainfest.xml 中註冊,Activity如果不註冊,則會引起 App Crash。比如以下常見的ActivityNotFoundException。
例如以下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的時候必須在AndroidMainfest.xml
中註冊,註冊方法如下:
<manifest ... > <application ... > <activity android:name=".BaseButtonMethods" /> ... </application ... > ... </manifest >
四、App的MainActivity
一個App會有多個Activity,那麼我們如何知道哪個Activity是 Main Activity呢?
其實Android 是通過android.action.MAIN 標籤來區別當前App的入口 Main Activity類。
另外 一半跟隨著android.action.MAIN標籤的地方,同時還有
android.intent.category.LAUNCHER這個標籤,它表示 此Action 會被Launcher掃描到,並可以顯示在Launcher的app list列表中。如果去掉此Action標籤,則無法在Launcher中檢視到此app的圖示。
常見舉例如下:
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
五、Activity 的啟動方法
Activity 的啟動方法大致分顯示啟動、隱式啟動、帶返回引數啟動三種。
1. 顯示啟動
顯示啟動常用於app 內部Activity 的啟動,使用方法如下:
Intent intent = new Intent(ActivityMethods.this, OtherActivity.class) startActivity(intent);
2. 隱式啟動
隱式啟動即可以呼叫App內部Activity ,也可以呼叫其他過濾到包含啟動Action 的Activity。使用方法如下:
Intent intent = new Intent("string_action"); //或者分開設定Action也可以 // intent.setAction("string_action"); startActivity(intent);
3. 啟動帶返回值的Activity
開發過程中我們經常需要啟動一個Activity ,然後返回一些資料給啟動的Activity,這時候,使用以下啟動帶返回值的Activity 是最合適的方法。使用方法舉例如下:
... ... // 1.啟動要返回資料的Activity Intent intent = new Intent(); intent.setClass(ActivityMethods.this, OtherActivity.class); startActivityForResult(intent, mRequestCode); ... ... // 2.獲取並處理 啟動返回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(); } }
2. 設定並返回 Bundle 資料型別的資料給啟動的Activity
int resultCode = 101; Intent intent = new Intent(); intent.putExtra("str_set_result", "帶返回結果的Activity"); setResult(resultCode, intent);
六、Activity結束 方法
如果想結束掉當前Activity
,可以呼叫一下方法
//1.直接呼叫finish方法 ,結束當前Activity finish(); //2.根據請求碼結束Activity finishActivity(int requestCode);
七、 Activity狀態儲存,恢復的方法
當Activity異常退出時候,Activity會自動儲存一些資料。為了安全起見,如果是App重要的資料,還請在程式碼中手動儲存Bundle型別的資料,防止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----"); }
八、 面試中常問的題型
1. Activity A 啟動 Activity B, 然後再返回A,簡述一下 A與B生命週期的呼叫方法。
-
1.首先
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----
2.點選
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----
3.結束
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生命週期大致圖
原文連結:https://blog.csdn.net/wjky2014/article/details/108722522