1. 程式人生 > 其它 >Activity 使用方法詳解

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 protected
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可以分為以下四種生命週期狀態

  • 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

    ... ...
   // 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