Activity的使用及生命週期探索:
生命週期探索請直接移步 標題 10.
1.概述:
提供能夠 ②與用戶交互的 ①界面
2.組件的特點:
- 繼承父類或實現接口
- 需要註冊
- 對象,是系統創建的
- 生命週期方法的自動調用
3.如何聲明一個Activity.
- 繼承;
- 重寫 onCreate() 等;
- 註冊;
- 佈局;
4.如何啓動一個Activity.
-
startActivity(intent)
-
startActivityForResult
Activity1:startActivityForResult(int requestCode,Intent intent) Activity2:setResult(int resultCode,Intent intent); finish(); Activity1: onActivityResult(int requestCode,int resultCode,Intent intent)
5.Intent的使用:
Intent不是組件!意圖,提供不同組件通信的信使。
-
要去哪?
顯式意圖Intent(obj,Class clazz),隱式意圖Intent(String action) -
能帶數據嗎?
可以!不過這裏的 finish() 不要忘;忘了的話也沒關係……那你就按 back 鍵,不還是 finish() 嘛……
putExtra(String key,Xxx xxx)---getXxxExtra(String key)
setData(Uri uri) ---getData();
Uri uri = Uri.parse("tel:" + number); -->url (http:)
("content:" + )
6.任務棧的結構:先進後出
- 不可以操作系統的棧結構;
- 如果確實需要操作,可以參考我的 P2P金融項目 筆記 02 提供的 AppManager 類;統一應用程序中所有的Activity的棧管理
7.LaunchMode:
-
standard ;標準模式;
-
singleTop 適用於 目標 activity 啓動費時的情況,給目標 activity 設置 singleTop ,防止用戶多次點擊,創建多個活動 (那不更卡了……) ;
-
singleTask 設置爲此時,任務棧裏只新建一個該活動;當棧頂的活動調用該活動時,自動清空棧中,目標活動上的所有活動;
-
singleInstance 新建一個棧單獨存儲;少見……
8. Activity的生命週期。
-
4 種狀態:運行狀態,暫停狀態,停止狀態,死亡狀態。
不同狀態之間,切換時,哪些生命週期方法調用; -
7 個生命週期方法。
onCreate()— onDestroy():對象是否存在。(在對象整個生命週期過程中,只調用一次)
onStart()— onStop():當前activity是否可見
onResume() — onPause():當前的activity是否可操作 -
面試考查:
①Activity1–>Activity2.
②demo總結;
9.不同的生命週期方法中,常做哪些操作。
-
onCreate();setContentView(),視圖的初始化,綁定監聽
-
onDestroy();正常情況下,銷燬一個activity對象之前調用。
-
onPause();當activity結束運行狀態時,臨時數據的保存。(不適合執行數據量較大的保存操作:數據庫)
-
onSaveInstanceState() / onStop():用於保存數據(執行時間較長);onSaveInstanceState() 操作在onPause()和 onStop()之間;
10. Activity 生命週期探索
A. 普通啓動第二個頁面;
-
P1首先不可操作,
onPause()
-
而後P2創建;可視;可操作;
-
最後P1纔不可見;
onStop()
MainActivity onPause() SecondActivity onCreate() SecondActivity onStart() SecondActivity onResume() MainActivity onStop()
-
在P2通過返回鍵;返回到P1;此時P1調用 onRestart() 或 onCreate()取決於是否 finish(),不過通過 返回鍵的最後,P2會 onDestroy;
SecondActivity onPause() MainActivity onRestart() MainActivity onStart() MainActivity onResume() SecondActivity onStop() SecondActivity onDestroy()
B. 帶回調啓動第二個頁面;
-
從P1攜帶信息去P2時;這裏的 onSaveInstanceState() 在 onStop() 之前執行;這也就決定了,在什麼時候寫數據保存操作;
MainActivity onPause() SecondActivity onCreate() SecondActivity onStart() SecondActivity onResume() MainActivity onSaveInstanceState() MainActivity onStop()
-
從P2攜帶信息回到 P1時;這裏的重中之重是;P1的onActivityResult() 先 onResume() 執行; 以確保重新顯示的時候,之前的數據已經恢復;
SecondActivity onPause() MainActivity onActivityResult() MainActivity onRestart() MainActivity onStart() MainActivity onResume() SecondActivity onStop() SecondActivity onDestroy()
C. 啓動 DialogActivity
-
dialog 出現在最上層,P1 可見,不可操作;依次執行的是;
MainActivity onPause() MainActivity onSaveInstanceState()
-
返回到 P1
MainActivity onResume()
D. 啓動 AlertDialog
-
效果如下:
-
但是 P1毫無波瀾;
-
這是因爲,AlertDialog 是 P1 的一部分;所以P1的生命週期沒有改變;
代碼如下,當啓動 DialogActivity 時,啓動的是另外一個 Activity;當啓動 AlertDialog 時;傳入的 參數是 “this”;並且此處也只能是 this;所以 P1 生命週期不改變;
public void startDialogActivity(View v) { startActivity(new Intent(this, DialogActivity.class)); } public void startDialog(View v) { new AlertDialog.Builder(this) .setTitle("測試") .setPositiveButton("確定", null) .setNegativeButton("取消", null) .show(); }
11. 熄屏下的生命週期
-
熄滅屏幕;先是不可操作,隨後是不可見;二者之間時保存數據;
MainActivity onPause() MainActivity onSaveInstanceState() MainActivity onStop()
-
點亮屏幕;此時沒有
onActivityResult()
;這個方法需要三個參數:onActivityResult(int requestCode, int resultCode, Intent data)
;MainActivity onRestart() MainActivity onStart() MainActivity onResume()
12. 橫豎屏
-
解決橫豎屏造成的 activity 生命週期方法重新調用:
<activity android:name=".MainActivity" android:configChanges="keyboardHidden|screenSize|orientation" />
聲明:本博客根據尚硅谷項目實戰: 硅谷金融.學習整理;