重新回顧關(guān)于Activity及其啟動方式

? ? ? ?首先簡單說一下什么是Activity?Activity是Android四大組件之一,我們主要通過Activity來顯示我們的UI,方便用戶操作。一個app中會有多個activity,當啟動新的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為什么模式均不起效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容