極力推薦文章:歡迎收藏
Android 干貨分享
閱讀五分鍾,每日十點,和您一起終身學習,這里是程序員Android
本篇文章主要介紹 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 創建方法
@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
常見的四種生命周期狀態如下:
- 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?
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 恢復數據的方法,經常在 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
, 簡述一下其生命周期? 大致流程如下圖:
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!