Activity詳解(一)

Activity是Android組件中最基本也是最為常見用的四大組件(Activity,Service,Content Provider,BroadcastReceiver)之一;
本篇主要從以下幾點來詳解Activity
*Activity的生命周期
*Activity的啟動模式

一、Activity的生命周期

0_1314838777He6C.png

可以看到Activity有7個最基本的生命周期方法
1.onCreate:Activity即將被創(chuàng)建;

2.onStart:表示Activity正在被啟動,已經(jīng)可見了,但是還沒有顯示到前臺;

3.onRestart:Activity正在重新啟動,當Activity從不可見到可見時會調(diào)用此方法;

4.onResume:Activity可見,并且已經(jīng)顯示到前臺可以和用戶交互了;(onStart的時候Activity還在后臺,在onResume后Activity才顯示到前臺)

5.onPause:Activity正在停止(可見但不在前臺);

6.onStop:Activity即將停止(不可見亦不在前臺);

7.onDestroy:Activity即將銷毀;

接下來我們從幾個實例中來具體了解一下Activity的生命周期;

首先:我們正常啟動一個Activity


Paste_Image.png

然后我們回到桌面:


Paste_Image.png

我們再次打開這個Activity
Paste_Image.png

在這個Activity上再啟動一個Dialog形式的Activity,第一個Activity任然可見,但是已經(jīng)轉(zhuǎn)入后臺


Paste_Image.png

然后我們退出Dialog返回第一個Activity
Paste_Image.png

從第一個Activity跳轉(zhuǎn)到另一個Activity(非Dialog形式)
Paste_Image.png

再推出第二個Activity返回第一個
Paste_Image.png

最后我們退出第一個Activity
Paste_Image.png

這里有幾點需要注意:
1、onCreate和onDestroy、onStart和onStop、onResume和onPause是配對的,其中
onPause和onResume與onStart和onStop的區(qū)別在于前者是以是否在前臺顯示來判斷的后者是以是否可以見來區(qū)分的;

2、從一個Activity啟動另一個Activity,第一個Activity會首先onPause,緊接著第二個Activity開始onCreate、onStart、onResume后,第一個Activity執(zhí)行onStop;一定要注意跳轉(zhuǎn)時候Activity的生命周期方法執(zhí)行順序;

特別說明:如果在一個Activity上啟動了一個Dialog(非Activity形式),這時候Activity雖然可見,但是不在前臺,Activity是不會執(zhí)行onPause方法的;

下面我們來研究一下異常情況下Activity的生命周期,所謂異常情況就是資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重建或者資源內(nèi)存不足導(dǎo)致優(yōu)先級低的Activity被系統(tǒng)回收等等;最常見的就是橫豎屏切換,Activity狀態(tài)會發(fā)生那些改變呢;

首先我們正常啟動一個Activity:


Paste_Image.png

正常的走了生命周期的方法;

然后我們從豎屏切換到橫屏:


Paste_Image.png

這里我們可以看到,Activity銷毀了并重新創(chuàng)建,Activity在銷毀之前調(diào)用了onSaveInstanceState,并且在Activity重新創(chuàng)建成功后調(diào)用了onRestoreInstanceState方法;
onSaveInstanceState:Activity異常銷毀保存Activity數(shù)據(jù)和狀態(tài);
onRestoreInstanceState:Activity異常銷毀重新創(chuàng)建后恢復(fù)數(shù)據(jù);
注意:以上方法只會在Activity異常銷毀的時候調(diào)用,正常情況下是不會調(diào)用的;

另外還有一種特殊情況,我們在某些狀態(tài)改變導(dǎo)致Activity銷毀重建如果不希望Activity重新創(chuàng)建,例如橫豎屏切換不希望Activity重新創(chuàng)建需要在清單文件中Activity中配置 android:configChanges="orientation" (需要minSdkVersion和targetSdkVersion的值都小于13否則需要配置android:configChanges="orientation|screenSize")
我們來看一下效果,添加以上配置后,我們將Activity從豎屏切換到橫屏


Paste_Image.png

可以看到Activity并沒有重建,而是調(diào)用了onConfigurationChanged方法;

通過上面的分析,我們已經(jīng)了解了Activity的生命周期,以及Activity在特殊情況下的生命周期;掌握了Activity的生命周期,就可以在不同的方法中做相應(yīng)的處理,對以后的開發(fā)很有幫助;

二、Activity的啟動模式

①standard:標準模式,系統(tǒng)默認模式,最常用;

②singleTop:棧頂復(fù)用模式,如果Activity位于任務(wù)棧內(nèi)棧頂位置Activity不會重新創(chuàng)建;

③singleTask:棧內(nèi)復(fù)用模式,只要Activity在棧內(nèi)存在,多次啟動Activity就不會重新創(chuàng)建;

④singleInstance:單實例模式;這種模式下,Activity只能單純的存在一個任務(wù)棧中;

注意:任務(wù)棧是一種“后進先出”棧結(jié)構(gòu),每一個Activity都必須依賴一個任務(wù)棧,這也是為什么我們用ApplicationContext去啟動Activity的時候會報錯的原因;standard模式下的Activity默認會進入啟動它的Activity的任務(wù)棧中;非Activity類型的Context(ApplicationContext)并沒有所謂的任務(wù)棧,所以就出問題了,解決這個問題就需要為待啟動的Activity指定 FLAG_ACTIVITY_NEW_TASK 標記位,這樣就會在啟動的時候為其創(chuàng)建一個新的標記位;

啟動模式解讀:
1、standard標準模式:每啟動一次Activity,都會為這個Activity創(chuàng)建實例;

2、singleTop模式:假如在一個任務(wù)棧中有ABC三個Activity(都是singleTop啟動模式),如果再次啟動C,由于C在棧頂,那么C就不會被重新創(chuàng)建同時它的onNewIntent方法會被回調(diào);如果啟動A,由于A不在棧頂,A就會被重新創(chuàng)建;

3、singleTask模式:假如一個任務(wù)棧中有ABC三個Activity,(A為singleTask模式),A并不在棧頂,我們重新啟動A,A也并不會創(chuàng)建新的,而是直接移到棧頂并調(diào)用A的onNewIntent方法;此時棧內(nèi)的Activity為 A ,因為singleTask模式自帶clearTop的效果,會導(dǎo)致所有在A上面的Activity自動出棧;

4、singleInstance模式:這個是加強版的singleTask模式,它具有singleTask的所有特性;并且還加強了一點,這種模式下的Activity只能單獨的位于一個任務(wù)棧中,加入A為這種啟動模式,啟動A后,A單獨位于一個任務(wù)棧中,這個任務(wù)棧中只能有一個Activity A;

注意:由于Activity啟動必須依賴任務(wù)棧,任務(wù)棧是可以指定的,可以在清單文件中配置android:taskAffinity=“”熟悉,任務(wù)棧的名字為String,如果不指定,進入默認的任務(wù)棧,即以包名為名的任務(wù)棧;

如何給Activity指定啟動模式

第一種方式:直接在AndroidMenifest中指定 android:launchMode

第二種方式:通過Intent中設(shè)置標志位來為Activity指定
Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

兩種方式的區(qū)別:第二種優(yōu)先級大于第一種,如果兩種方式都用了,以第二種方式執(zhí)行;第二種方式無法為Activity指定為singleInstance模式;

Activity中的標志位:
1、FLAG_ACTIVITY_NEW_TASE:為Activity指定singleTask啟動模式

2、FLAG_ACTIVITY_SINGLE_TOP:singleTop模式

3、FLAG_ACTIVITY_CLEAR_TOP:當這個Activity啟動時所用位于它之上的Activity全部出棧;

4、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有這個標記的Activity,不會出現(xiàn)在歷史Activity列表中;某種情況下,我們不希望用戶通過歷史列表回到我們的Activity時這個標記比較有用;等同于在XML中指定Activity的屬性
android:excludeFromRecents="true"

小結(jié):本次的Activity詳解一共就這些內(nèi)容主要點為

1、Activity的生命周期,Activity從啟動到銷毀,從前臺到后臺,不同情況下Activity的哪些生命周期方法會被調(diào)用;以及Activity在異常銷毀后重新創(chuàng)建要調(diào)用的方法;

2、Activity的啟動模式;不同的場景應(yīng)用不同的啟動模式,各個啟動模式間的區(qū)別;了解這些對以后的開發(fā)很有幫助;

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

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

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