? ? ? ?首先簡單說一下什么是Activity?Activity是Android四大組件之一,我們主要通過Activity來顯示我們的UI,方便用戶操作。一個app中會有多個activity,當啟動新的activity時,當前activity會停止,新的activity會進入棧中,獲取用戶焦點。當用戶按“返回”按鈕時,當前activity銷毀,前一個activity重新恢復。

Activity 的生命周期:
activity的四種狀態(tài):
(1)運行狀態(tài):當一個活動位于返回棧的棧頂時,用戶可以獲取焦點做出操作,系統(tǒng)一般不會回收這個狀態(tài)。
(2)暫停狀態(tài):彈出一個活動或者一個非全屏的activity時,就會讓前一個activity處于pause狀態(tài)。這時activity就不會處于棧頂,但是仍然可見,只不過用戶無法操作。系統(tǒng)也一般不會回收這樣的活動,除非內(nèi)存占用過大。
(3)停止狀態(tài):當一個活動不處于棧頂位置,且完全不可見的時候,就進入停止狀態(tài),當內(nèi)存較低時系統(tǒng)會回收這樣的活動
(4)銷毀狀態(tài):當一個活動從棧中移除后就編程銷毀狀態(tài),系統(tǒng)會回收這樣的活動,狀態(tài)信息和成員變量都已經(jīng)不存在了
大致流程可以分為:
.Activity啟動 -->? onCreate() --> onStart() --> onResume()
2.點擊Home鍵回到系統(tǒng)主界面的時候 --> onPause() --> onStop()
3.當我們再次回到原來的那個Activity的時候 --> onRestart() --> onStart() --> onResume()
4.退出當前的Activity的時候 --> onPause() --> onStop() --> onDestory()
5.A Activity 調(diào)用彈出B Activity的時候(完全覆蓋) --> A onPause() --> B onCreate() --> B onStart() --> B onResume --> A onStop()
6.Activity異常退出的時候 --> onPause() --> onSaveInstanceState() --> onStop() --> onDestory(),
需要注意的是onSaveInstanceState() 方法與onPause并沒有嚴格的先后關(guān)系,有可能在onPause之前,也有可能在其后面調(diào)用,但會在onStop()方法之前調(diào)用
7.異常退出后又重新啟動該Activity --> onCreate() --> onStart() --> onRestoreInstanceState() --> onResume()
2)啟動模式
為什么要有啟動模式?
我們在開發(fā)項目的過程中,一般都需要在本應用中多個Activity組件之間的跳轉(zhuǎn),也可能需要在本應用中打開其它應用的可復用的Activity。如我們可能需要跳轉(zhuǎn)到原來某個Activity實例,此時我們更希望這個Activity可以被重用而不是創(chuàng)建一個新的 Activity,但根據(jù)Android系統(tǒng)的默認行為,確實每次都會為我們創(chuàng)建一個新的Activity并添加到Task中,這樣android系統(tǒng)是不是很傻?還有一點就是在我們每開啟一次頁面加入到任務棧Task中后,一個Activity的數(shù)據(jù)和信息狀態(tài)都將會被保留,這樣會造成數(shù)據(jù)冗余, 重復數(shù)據(jù)太多, 最終還可能導致內(nèi)存溢出的問題(OOM)。為了解決這些問題,android系統(tǒng)提供了一套Activity的啟動模式來修改系統(tǒng)Activity的默認啟動行為。
a)standard,標準模式,也是系統(tǒng)的默認模式(可以不指定),在這樣模式下,每啟動一個Activity都會重新創(chuàng)建一個Activity的新實例,并且將其加入任務棧中,而且完全不會去考慮這個實例是否已存在
b)singleTop,棧頂復用模式,顧名思義,在這種模式下,如果有新的Activity已經(jīng)存在任務棧的棧頂,那么此Activity就不會被重新創(chuàng)建新實例,而是復用已存在任務棧棧頂?shù)腁ctivity。這里重點是位于棧頂,才會被復用,如果新的Activity的實例已存在但沒有位于棧頂,那么新的Activity仍然會被重建。需要注意的是,Activity的onNewIntent方法會被調(diào)用
c)singleTask,棧內(nèi)復用模式。這是一種單例模式,與singTop點類似,只不過singTop是檢測棧頂元素是否有需要啟動的Activity,而singTask則是檢測整個棧中是否存在當前需要啟動的Activity,如果存在就直接將該Activity置于棧頂,并將該Activity以上的Activity都從任務棧中移出銷毀,同時也會回調(diào)onNewIntent方法
d)singleInstance模式下,該Activity在整個android系統(tǒng)內(nèi)存中有且只有一個實例,而且該實例單獨尊享一個Task。換句話說,A應用需要啟動的MainActivity 是singleInstance模式,當A啟動后,系統(tǒng)會為它創(chuàng)建一個新的任務棧,然后A單獨在這個新的任務棧中,如果此時B應用也要激活MainActivity,由于棧內(nèi)復用的特性,則不會重新創(chuàng)建,而是兩個應用共享一個Activity的實例
3)startActivityForResult和啟動模式
startActivityForResult方法能夠起效:standard和singleTop
startActivityForResult方法不能夠起效:singleTask和singleInstance
1)只要將被啟動的Activity屬性設(shè)置為singleTask則一定不起效
2)只要將被啟動的Activity屬性設(shè)置為singleInstance則一定不起效
3)只要將啟動的Activity模式設(shè)置為singleInstance則不論被啟動的Activity為什么模式均不起效