標籤:模式 建立 使用者 操作 可見 top 執行 載入 null
Android使用任務(Task)管理活動,是一組存放在返回棧(Back Stack)裡的活動的合集;
系統總是顯示棧頂活動給使用者;
啟動新活動->新活動入棧
按下Back鍵或調用finish()->棧頂活動出棧
活動生命週期的四種狀態:
1. 運行狀態:處於棧頂
2. 暫停狀態:不處於棧頂,但仍然可見
3. 停止狀態:不處於棧頂,完全不可見,系統仍然儲存其狀態和成員變數,但不可靠
4. 銷毀狀態:從棧中移除,活動被系統回收
Activity的七個回調方法:
1. onCreate():活動第一次被建立時調用,通常完成初始化操作
2. onStart():活動由不可見變為可見時調用,通常載入資源
3. onResume():活動準備與使用者互動時調用,此時處於棧頂,運行狀態
4. onPause():系統啟動或恢複另一個活動時調用
5. onStop():活動完全不可見時調用,通常完成釋放記憶體和資源操作
6. onDestroy():銷毀前調用,之後變為銷毀狀態
7. onRestart():重新啟動時調用,由停止狀態變為運行狀態
onPause()和onStop()的主要區別:啟動新活動為對話方塊式活動時,執行onPause(),不執行onStop();
活動的三種生存期:
1. 完整生存期:onCreate()和onStop()之間的時期
2. 可見生存期:onStart()和onStop()之間的時期
3. 前台生存期:onResume()和onPause()之間的時期
例:
MainActivity第一次被建立時執行onCreate(), onStart(), onResume();
點擊button1啟動NormalActiviy,MainActivity執行onPause(), onStop()
點擊button2啟動DialogActivity,MainActivity只執行onPause()
因為DialogActivity沒有完全遮擋MainActivity,MainActivity只是進入暫停狀態而不是停止狀態
點擊Back鍵返回MainActivity,只執行onResume()
在MainActivity點擊Back鍵退出程式,執行onPause(),onStop(),onDestroy()
通過Bundle在活動回收時儲存臨時資料
活動進入停止狀態後,當記憶體不足時可能被系統回收。因為方法onSaveInstanceState()在活動被回收前一定會被調用,可通過重寫該方法不保證臨時資料的儲存:
@Overrideprotected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); String tempData = "Something you just typed"; outState.putString("data_key", tempData);}
修改onCreate方法,在setConetentView()語句後添加:
if (savedInstanceState != null) { String tempData = savedInstanceState.getString("data_key"); Log.d(TAG, tempData);}
如果活動被系統回收前有通過onSaveInstanceState()儲存資料,onCreate()接受的Bundle參數就會帶有所儲存的資料,可通過相應取值方法取出資料
運行程式,旋轉螢幕使系統自動銷毀活動,onSaveInstance()被調用,螢幕切換後系統自動建立活動調用onCreate()
活動的啟動模式有四種:standard、singleTop、singleTask和singleInstance;
啟動模式可在AndroidManifest.xml的<activity>中的android:launchMode屬性指定;
standard:預設啟動模式,系統不考慮返回棧中是否已有該活動,每次啟動都會建立一個新的活動執行個體;
singleTop:如果棧頂已經是該活動,則直接使用,不會建立新的活動執行個體。如果未處於棧頂,建立新的活動執行個體;
singleTask:如果棧中已存在該活動執行個體則直接使用,並把該活動之上的所有活動出棧。如果沒有則建立新的活動執行個體;
singleInstance:會啟動一個單獨的新返回棧管理該活動,訪問該活動的應用程式共用一個(原)返回棧,從而共用活動執行個體;
技巧:快速判斷當前在哪個活動
建立類BaseActivity,重寫其onCreate()方法:
protected void onCreate(Bundle saveInstanceState) { super.onCreate(saveInstanceState); Log.d("ThirdActivity", "Task id is "+getTaskId()); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.third_layout);}
使所有活動繼承自父類BaseActivity,則每次調用onCreate()建立活動時能夠列印執行個體類名,判斷當前處於哪個活動。
技巧:快速退出程式
建立類ActivityCollector作為Active Manager:
public class ActivityCollector { public static List<Activity> activities = new ArrayList<Activity>(); public static void addActivity(Activity activity) { activities.add(activity); } public static void removeActivity(Activity activity) { activities.remove(activity); } public static void finishAll() { for (Activity activity : activities) { if(!activity.isFinishing()) { activity.finish(); } } }}
修改BaseActivity中代碼,在onCreate()中添加:
ActivityCollector.addActivity(this);
在onDestroy()中添加:
ActivityCollector.removeActivity(this);
在需要一鍵退出程式的按鈕監聽事件中添加:
ActivityCollector.finishAll();
技巧:傳遞資料啟動活動的寫法
在需要接收Intent傳遞的資料的活動SecondActivity中添加方法actionStart():
public static void actionStart(Context context, String data1, String data2) { Intent intent = new Intent(context, SecondActivity.class); intent.putExtra("param1", data1); intent.putExtra("param2", data2); context.startActivity(intent);}
在其中完成intent的構件,這樣所有SecondActivity所需的資料都在方法參數中體現;
在需要啟動SecondActivity的按鈕監聽事件中直接調用:
SecondActivity.actionStart(FirstActivity.this,"data1","data2");
參考資料:《第一行代碼》
Android筆記-活動生命週期&Bundle回收臨時資料&活動啟動模式&常用技巧