Activity 比較詳細(xì)的詳解

本人第一次寫(xiě)東西,歡迎評(píng)論??!

Activity是四大組件之一

四大組件都是有個(gè)性的,所以他們都要在AndroidMainfest.xml文件中注冊(cè)。
Activity 幾乎算是所有開(kāi)始接觸Android的新手第一個(gè)接觸到的基本組件,只要是一個(gè)完成的APP,Activity就是不可或缺的,看看google官網(wǎng)的解釋:

Activities are one of the fundamental building blocks of apps on the Android platform. They serve as the entry point for a user's interaction with an app, and are also central to how a user navigates within an app (as with the Back button) or between apps (as with the Recents button).

看不懂?那就來(lái)看看翻譯吧:

活動(dòng)是Android平臺(tái)上應(yīng)用程序的基本構(gòu)件之一。它們作為用戶(hù)與應(yīng)用程序交互的切入點(diǎn),也是用戶(hù)在應(yīng)用程序中導(dǎo)航(如“后退”按鈕)或應(yīng)用程序之間的關(guān)鍵(與“更新”按鈕一樣)。

這樣就清楚多了吧。

Activity 的新建

新建一個(gè)Activity其實(shí)很簡(jiǎn)單,如果用的是Android studio ,那就更簡(jiǎn)單了,因?yàn)锳s(Android studio的簡(jiǎn)稱(chēng),以下用到的都會(huì)用簡(jiǎn)稱(chēng))提供了一個(gè)可以快速新建Activity的選項(xiàng):


圖1 . 新建Activity

新建好了之后本來(lái)還需要到AndroidManifest.xml文件中配置信息的

圖2 . APP第一個(gè)運(yùn)行的Activity

但是As在新建的時(shí)候會(huì)智能的幫我們?nèi)ヅ渲茫侵皇菃渭兊呐渲靡粋€(gè)Activity而已,一個(gè)最簡(jiǎn)單的Activity配置是這樣的

圖3 . 最簡(jiǎn)單的Activity配置

如果要使用隱式意圖Intent來(lái)開(kāi)啟這個(gè)Activity還需要配置里面的意圖過(guò)濾器,也就是這個(gè)<intent-filter>標(biāo)簽,關(guān)于意圖Intent這里就不說(shuō)了,看我的有關(guān)意圖的文章。
回到正題,如果用As開(kāi)發(fā),創(chuàng)建Activity也就選幾個(gè)選項(xiàng)的事情,是不是很簡(jiǎn)單啊。

Activity的生命周期

Activity的生命周期從開(kāi)始到銷(xiāo)毀在Activity中經(jīng)歷的回調(diào)方法是這些

圖4 . Activity的生命周期圖

按照這個(gè)圖,說(shuō)說(shuō)各個(gè)回調(diào)方法:

onCreate()

創(chuàng)建狀態(tài):在系統(tǒng)首次創(chuàng)建Activity時(shí)就會(huì)調(diào)用該方法,在這個(gè)方法中可以設(shè)置application的一些基本啟動(dòng)程序,包括獲取控件,填充數(shù)據(jù)等等,由于是創(chuàng)建方法,所以在整個(gè)生命周期中,該方法只會(huì)被調(diào)用一次。注意:不可在onCreate()方法中去獲取控件的尺寸,因?yàn)檫@是做不到的,來(lái)看一看各個(gè)回調(diào)方法調(diào)用的順序:

圖5 . 生命周期順序

onStart()

開(kāi)始狀態(tài):通過(guò)這個(gè)方法,Activity將會(huì)進(jìn)入前臺(tái),使活動(dòng)對(duì)用戶(hù)可見(jiàn),該方法在onCreate()后面調(diào)用,該方法還會(huì)在另外一個(gè)方法后面調(diào)用,就是onRestart()方法,該方法后面再說(shuō)。

onResume()

交互狀態(tài),也稱(chēng)恢復(fù)狀態(tài):調(diào)用這個(gè)方法時(shí),說(shuō)明Activity已經(jīng)被置于前臺(tái)了,進(jìn)入了與用戶(hù)交互的狀態(tài)。就是說(shuō),用戶(hù)可以操作該Activity了。

onPause()

暫停狀態(tài):Activity進(jìn)入暫停狀態(tài),但依然可見(jiàn),比如被半透明的彈框遮住,也就是該Activity中斷了,可以使用該
方法釋放系統(tǒng)資源,例如廣播接收器,傳感器(例如GPS)的手柄,或任何可能影響電池壽命的資源,因?yàn)榛顒?dòng)暫停,已經(jīng)不需要這些資源了。

onStop()

停止?fàn)顟B(tài):當(dāng)您的活動(dòng)對(duì)用戶(hù)不再可見(jiàn)時(shí),它已進(jìn)入 停止狀態(tài),系統(tǒng)調(diào)用onStop()回調(diào)。例如,當(dāng)新啟動(dòng)的活動(dòng)覆蓋整個(gè)屏幕時(shí),可能會(huì)發(fā)生這種情況。當(dāng)活動(dòng)完成運(yùn)行時(shí),系統(tǒng)也可以調(diào)用,并且即將被終止。在該方法中,應(yīng)用程序應(yīng)該釋放幾乎所有的用戶(hù)不需要的資源。例如,如果您注冊(cè)一個(gè)BroadcastReceiver在偵聽(tīng)可能會(huì)影響用戶(hù)界面的變化,你可以注銷(xiāo)在廣播接收器 ,因?yàn)橛脩?hù)不再能看到的UI。同樣重要的是,您可以使用 釋放可能泄漏內(nèi)存的資源,因?yàn)橄到y(tǒng)可能會(huì)在不調(diào)用活動(dòng)最終onDestroy回調(diào)的情況下終止托管活動(dòng)的進(jìn)程 。您還應(yīng)該使用相對(duì)CPU密集的關(guān)機(jī)操作。例如,如果您無(wú)法找到更適合將信息保存到數(shù)據(jù)庫(kù)的時(shí)間,則可能會(huì)在此期間執(zhí)行此操作。以下示例顯示了一個(gè)實(shí)現(xiàn) ,將注釋草稿的內(nèi)容保存到永久存儲(chǔ)。在這個(gè)方法之后呢,會(huì)有兩條路,一條是銷(xiāo)毀onDestroy(),一條是重生onRestart()。

onRestart()

切換到別的界面之后重新進(jìn)入Activity,而后調(diào)用的方法是onStart()方法,重新回到前臺(tái)。

onDestroy()

銷(xiāo)毀,該方法是整個(gè)生命周期的最后一個(gè)方法,也只調(diào)用一次,調(diào)用這個(gè)方法證明這個(gè)Activity已經(jīng)到盡頭了,所以就完了。

害怕自己文筆不是很好,所以附上google官網(wǎng)的圖,這樣就更清楚啦。

圖6 . Activity回調(diào)方法以及說(shuō)明

關(guān)于 ‘是否能事后終止’ 一欄:是,則表示隨時(shí)有可能被系統(tǒng)終止,就算是在onPause()方法,返回到onResume()方法期間也有可能被系統(tǒng)終止。

雜.記

切換橫豎屏還重啟Activity?

眾所周知,手機(jī)屏幕是可以切換橫豎屏的,在切換橫豎屏或者做某些操作的時(shí)候,會(huì)讓整個(gè)Activity銷(xiāo)毀后重新創(chuàng)建。其實(shí)這也沒(méi)什么,只是在你沒(méi)有保存你的Activity狀態(tài)時(shí),切換橫豎屏就會(huì)丟掉一些數(shù)據(jù),這是一件比較不爽的事。那有沒(méi)有辦法阻止Activity在切換橫豎屏的時(shí)候不銷(xiāo)毀呢,可以這樣子做:

圖7

在Activity中有個(gè)屬性android:configChanges,該屬性是確定友哪些操作引起的本來(lái)需要重啟的操作,現(xiàn)在不用了,參數(shù)就是這些操作,比如orientation就是屏幕方向也就是切換橫豎屏,而keyboardHidden則是表示鍵盤(pán)可用性及語(yǔ)言,如上圖所示,參數(shù)可以有多個(gè),只需要用通道|連接即可。當(dāng)然啦,你也可以老老實(shí)實(shí)的去保存Activity的狀態(tài),

注意:從 Android 3.2(API 級(jí)別 13)開(kāi)始,當(dāng)設(shè)備在縱向和橫向之間切換時(shí),“屏幕尺寸”也會(huì)發(fā)生變化。因此,在開(kāi)發(fā)針對(duì) API 級(jí)別 13 或更高版本(正如minSdkVersiontargetSdkVersion屬性中所聲明)的應(yīng)用時(shí),若要避免由于設(shè)備方向改變而導(dǎo)致運(yùn)行時(shí)重啟,則除了"orientation"值以外,您還必須添加"screenSize"值。 也就是說(shuō),您必須聲明android:configChanges="orientation|screenSize"。但是,如果您的應(yīng)用面向 API 級(jí)別 12 或更低版本,則 Activity 始終會(huì)自行處理此配置變更(即便是在 Android 3.2 或更高版本的設(shè)備上運(yùn)行,此配置變更也不會(huì)重啟 Activity)。

接下來(lái)說(shuō)說(shuō)Activity的啟動(dòng)模式

Activity的四種啟動(dòng)模式

再說(shuō)啟動(dòng)模式之前,先說(shuō)說(shuō)Activity被創(chuàng)建之后所在的地方,被稱(chēng)為返回棧,這個(gè)棧只有棧頂一個(gè)口,進(jìn)和出都在這里,創(chuàng)建一個(gè)Activity就放入這個(gè)棧中,如果在棧中已經(jīng)有Activity,那么新創(chuàng)建的Activity會(huì)置于棧頂,將其他的Activity壓于棧底,而手機(jī)顯示的就是處于棧頂?shù)腁ctivity。
引用一下官網(wǎng)的:

當(dāng)前 Activity 啟動(dòng)另一個(gè) Activity 時(shí),該新 Activity 會(huì)被推送到堆棧頂部,成為焦點(diǎn)所在。 前一個(gè) Activity 仍保留在堆棧中,但是處于停止?fàn)顟B(tài)。Activity 停止時(shí),系統(tǒng)會(huì)保持其用戶(hù)界面的當(dāng)前狀態(tài)。 用戶(hù)按“返回”按鈕時(shí),當(dāng)前 Activity 會(huì)從堆棧頂部彈出(Activity 被銷(xiāo)毀),而前一個(gè) Activity 恢復(fù)執(zhí)行(恢復(fù)其 UI 的前一狀態(tài))。 堆棧中的 Activity 永遠(yuǎn)不會(huì)重新排列,僅推入和彈出堆棧:由當(dāng)前 Activity 啟動(dòng)時(shí)推入堆棧;用戶(hù)使用“返回”按鈕退出時(shí)彈出堆棧。 因此,返回棧以“后進(jìn)先出”對(duì)象結(jié)構(gòu)運(yùn)行

還有更為直觀的圖:


圖8 . Activity進(jìn)/出棧過(guò)程

說(shuō)會(huì)啟動(dòng)模式。
四種啟動(dòng)模式分別是:standard、singleTopsingleTask、singleInstance。在說(shuō)其中模式的區(qū)別之前,先說(shuō)說(shuō)設(shè)置方法,其實(shí)也就是在AndroidMainfest.xml文件中Activity配置標(biāo)簽中的一個(gè)屬性:launchMode像這樣:

啟動(dòng)模式的配置

啟動(dòng)模式的區(qū)別

standard(標(biāo)準(zhǔn))是最普通的模式,也是默認(rèn)的模式。就是說(shuō),在沒(méi)有指定某一種啟動(dòng)模式時(shí),系統(tǒng)會(huì)默認(rèn)使用這一種模式,這模式特點(diǎn)就是可以有多個(gè)實(shí)例,如果Activity1是使用了該模式,可以不斷創(chuàng)建該Activity,就算在返回棧中已經(jīng)存在該Activity,所以,如果打開(kāi)了三次這個(gè)Activity(就是創(chuàng)建三次Activity,并將之置于返回棧),那么需要“返回”三次才能推出這個(gè)Activity。

singleTop(棧頂唯一),由名字可以知道,如果再次創(chuàng)建正處于棧頂?shù)腁ctivity,那么將不會(huì)創(chuàng)建,而是繼續(xù)復(fù)用這個(gè)Activity。

singleTask(棧唯一),由名字可以知道,在這種模式下,如果需要?jiǎng)?chuàng)建的Activity在棧中已經(jīng)存在,那么將不會(huì)創(chuàng)建,而是將這個(gè)Activity提升到棧頂,繼續(xù)復(fù)用這個(gè)Activity。

singleInstance(實(shí)例唯一),如果選擇了這種模式,那么無(wú)論在這個(gè)Activity的返回棧中是否存在這個(gè)Activity,系統(tǒng)都會(huì)為這個(gè)Activity重新創(chuàng)建一個(gè)單獨(dú)的返回棧,這樣,整個(gè)系統(tǒng)就只有這個(gè)Activity的這一個(gè)實(shí)例,所有的APP都可以訪問(wèn)這個(gè)Activity。就像打電話的Activity。

Activity的開(kāi)啟與銷(xiāo)毀

Activity有兩種開(kāi)啟方式:
一種是startActivity(),另一種是startActivityForResult()。區(qū)別也很簡(jiǎn)單,一種是沒(méi)有返回值的,一種是有返回值的,但是都可以將數(shù)據(jù)傳輸?shù)奖淮蜷_(kāi)的Activity,其中用到的就是意圖Intent,由于這篇文章是我專(zhuān)門(mén)寫(xiě)Activity所以就不說(shuō)Intent了。然而啟動(dòng)Activity,Intent是必不可少的,所以在我的有關(guān)Intent的文章中會(huì)再次說(shuō)到開(kāi)啟活動(dòng)。

那第二種啟動(dòng)方式返回的值該怎樣獲取呢?

在Activity中有這么一個(gè)函數(shù)onActivityResult(),所有由第二種方式開(kāi)啟的Activity返回的值都是返回到這里的。

那該怎樣區(qū)分哪個(gè)值是由哪個(gè)Activity返回而來(lái)的呢?

那當(dāng)然是要靠請(qǐng)求碼和返回碼啦。在調(diào)用第二種開(kāi)啟方式是需要參數(shù),完整的方法,包括參數(shù)是這樣的startActivityForResult(Intent intent,int requestCode),第二個(gè)參數(shù)requestCode是一個(gè)請(qǐng)求碼,然而在被開(kāi)啟的Activity也有一個(gè)返回方法setResult(int resultCode,Intent intent),第一個(gè)參數(shù)resultCode是一個(gè)返回碼,這兩個(gè)碼都可以用來(lái)解答上面的問(wèn)題。當(dāng)然啦,在調(diào)用setResult()方法之后就要銷(xiāo)毀被打開(kāi)的頁(yè)面了,畢竟調(diào)用了這個(gè)方法,就代表你已經(jīng)要返回?cái)?shù)據(jù)并退出這個(gè)Activity了。
那如何銷(xiāo)毀一個(gè)Activity呢?最簡(jiǎn)單直接的就是finish()方法。當(dāng)然除了這個(gè)方法之外,肯定還有其他的方法。就比如ActivityCollector.finishAll(),銷(xiāo)毀所有活動(dòng)等等。

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

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

  • Activity 一、四種形態(tài) 運(yùn)行狀態(tài): 當(dāng) Activity 處于棧的頂層,可見(jiàn),并可與用戶(hù)進(jìn)行交互 onRe...
    任教主來(lái)也閱讀 1,890評(píng)論 1 10
  • [文章內(nèi)容來(lái)自Developers]應(yīng)用通常包含多個(gè) Activity。每個(gè) Activity 均應(yīng)圍繞用戶(hù)可以執(zhí)...
    岳小川閱讀 759評(píng)論 0 4
  • 任務(wù)和返回棧 應(yīng)用通常包含多個(gè)Activity。每個(gè) Activity 均應(yīng)圍繞用戶(hù)可以執(zhí)行的特定操作設(shè)計(jì),并且能...
    xinlingzhiyi閱讀 773評(píng)論 0 6
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,234評(píng)論 25 708
  • /風(fēng)悅安 夜色的溫柔容納你的孤單,一點(diǎn)一丟的心事?lián)诫s著風(fēng)景片段。黑白色的格調(diào)在氤氳成雨,包裹著你的難過(guò),你說(shuō)你丟了...
    風(fēng)悅安閱讀 292評(píng)論 0 2

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