Activity 使用詳解


極力推薦文章:歡迎收藏
Android 干貨分享

閱讀五分鍾,每日十點,和您一起終身學習,這里是程序員Android

本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收獲以下內容:

  1. Activity 生命周期 簡介
  2. Activity 必須在AndroidMainfest.xml 中注冊
  3. 啟動Activity 的方法
  4. 啟動帶返回值的Activity
  5. Activity結束 方法
  6. Activity狀態保存,恢復的方法
  7. 面試中經常問到的例子

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之后執行
	@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 4 種 生命周期狀態

Activity 常見的四種生命周期狀態如下:

  1. Active 運行狀態
  2. Pause 暫停狀態
  3. Stop 停止狀態
  4. 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 掃描到,可以顯示在LauncherIcon列表上,如果去掉此Action,則無法在Launcher 種查看到此appIcon

<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,簡述一下其生命周期?

    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----
    1. 點擊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----
    1. 結束 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,領福利


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM