和你一起終身學習,這裡是程式設計師Android
經典好文推薦,通過閱讀本文,您將收穫以下知識點:
一、Activity 概覽
二、Activity 生命周期
三、Activity 的註冊方法
四、App的MainActivity
五、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是四大組件之一,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會有多個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 的啟動方法大致分顯示啟動、隱式啟動、帶返回參數啟動三種。
1. 顯示啟動顯示啟動常用於app 內部Activity 的啟動,使用方法如下:
Intent intent = new Intent(ActivityMethods.this, OtherActivity.class)
startActivity(intent);
隱式啟動即可以調用App內部Activity ,也可以調用其他過濾到包含啟動Action 的Activity。使用方法如下:
Intent intent = new Intent("string_action");
//或者分開設置Action也可以
// intent.setAction("string_action");
startActivity(intent);
開發過程中我們經常需要啟動一個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();
}
}
int resultCode = 101;
Intent intent = new Intent();
intent.putExtra("str_set_result", "帶返回結果的Activity");
setResult(resultCode, intent);
如果想結束掉當前Activity ,可以調用一下方法
//1.直接調用finish方法 ,結束當前Activity
finish();
//2.根據請求碼結束Activity
finishActivity(int requestCode);
當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----");
}
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----
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----
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生命周期大致圖
至此,本篇已結束。轉載網絡的文章,小編覺得很優秀,歡迎點擊閱讀原文,支持原創作者,如有侵權,懇請聯繫小編刪除。同時感謝您的閱讀,期待您的關注。