Android 四大组件之Activity
Android 四大組件之Activity
? Android有四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫。
活動(dòng)(Activity)
? 介紹:Activity是Android的四大組件之一,是用戶操作可視化界面;它為用戶提供了一個(gè)操作的頁面。在我創(chuàng)建一個(gè)新的Activity之后,需要調(diào)用setContenView()方法來顯示頁面,以此來為用戶提供交互。在Android APP中只要能看到的頁面都是依附于Activity顯示的,同樣Activity是在開發(fā)中使用最多最頻繁的一種組件。
1、 Activity生命周期
? 在一個(gè)Activity從頁面開始到顯示再到結(jié)束一共有7個(gè)生命周期方法
-
onCreate()
create表示創(chuàng)建,生命周期的第一個(gè)方法,也是在Android開發(fā)中接觸最多的生命周期方法,表示Activity正在創(chuàng)建。一般會(huì)在這個(gè)方法中做一些初始化工作比如:setContentView加載布局,對(duì)一些控件和變量進(jìn)行初始化等。此時(shí)Activity還在后臺(tái),不可見。
-
onStart()
start標(biāo)識(shí)Activity正在啟動(dòng),這時(shí)Activity還沒有顯示在前臺(tái)頁面上,無法與Activity交互。其實(shí)將Activity的初始化工作放在這也沒有什么問題,放在onCreate中是由于官方推薦的以及我們開發(fā)的習(xí)慣。
-
onResume()
resume表示繼續(xù)、重新開始,這名字和它的職責(zé)也相同。此時(shí)Activity經(jīng)過前兩個(gè)階段的初始化已經(jīng)蓄勢待發(fā)。Activity在這個(gè)階段已經(jīng)出現(xiàn)在前臺(tái)并且可見了。這個(gè)階段可以打開獨(dú)占設(shè)備
-
onPause()
pause標(biāo)識(shí)頁面暫停,當(dāng)Activity頁面跳轉(zhuǎn)到另一個(gè)Activity頁面時(shí)或者應(yīng)用正常退出時(shí)都會(huì)執(zhí)行這個(gè)方法。此時(shí)Activity還處于前臺(tái)可見狀態(tài),因此可以在此方法做一些輕量級(jí)的數(shù)據(jù)存儲(chǔ)工作但是不能太耗時(shí)。因?yàn)樵谔D(zhuǎn)Activity時(shí)只有當(dāng)前Activity執(zhí)行了onPause方法后另一個(gè)新的Activity方法才能啟動(dòng),而且在Android中指定了onPause在500ms內(nèi)沒用完全執(zhí)行完畢的話會(huì)強(qiáng)制關(guān)閉Activity。
-
onStop()
stop標(biāo)識(shí)停止,此時(shí)Activity已經(jīng)處于不可見的狀態(tài),但是Activity還在內(nèi)存中沒有被完全的關(guān)閉銷毀。這里主要做一些資源回收的工作。
-
onDestroy()
destroy表示銷毀,這個(gè)階段說明頁面已經(jīng)完全被銷毀了,不可見,我們可以將一些沒有沒有被釋放的資源進(jìn)行釋放,以及進(jìn)行一些回收工作
-
onRestart()
restart表示重新開始,Activity這里是可見的,當(dāng)Activity_A頁面轉(zhuǎn)到Activity_B頁面,又從Activity_B頁面返回到Activity_A頁面或者當(dāng)用戶直接按Home鍵返回到桌面上后又切換到Activity頁面就會(huì)觸發(fā)這個(gè)方法。這里一般不進(jìn)行操作
當(dāng)Activity_A頁面切換到Activity_B頁面的執(zhí)行順序是:
? [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-sq2euACh-1644817774816)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210095135989.png)]
其實(shí)Activity的生命周期除了onRestart方法其余六個(gè)是兩兩對(duì)應(yīng)的,那么相鄰的方法有什么區(qū)別呢?
1.1、onCreate和onStart之間有什么區(qū)別?
? 1、可見與不可見的區(qū)別,onCreate是正在創(chuàng)建為不可見,onStart處于正在啟動(dòng)狀態(tài)處于可見的狀態(tài)
? 2、執(zhí)行次數(shù)的區(qū)別,onCreate方法只有在Activity創(chuàng)建的時(shí)候執(zhí)行一次,而onStart方法在重新進(jìn)入或者切換到Activity頁面的過程中都會(huì)被多次調(diào)用,因?yàn)锽ndle數(shù)據(jù)恢復(fù)在onStart中進(jìn)行比在onCreate進(jìn)行要更加合適
? 3、onCreate能做的事其實(shí)onStart都能做,但是onStart能做的事onCreate未必都能做到;比如setContentView和資源初始化在兩者都能做。但是初始化動(dòng)畫onCreate就不能做,因?yàn)閛nCreate是處于不可見狀態(tài)所以不會(huì)顯示效果,所以在onStart做初始化動(dòng)畫比較合適。
1.2、onStart和onResume之間有什么區(qū)別?
? 1、兩者因?yàn)槎继幱诳梢姞顟B(tài),但是不是都處于前臺(tái)可操作的狀態(tài),比如:onStart是處于可見狀態(tài)但是不在前臺(tái),不能進(jìn)行交互,而onResume處于前臺(tái)可見狀態(tài),因此可以行數(shù)據(jù)交互。
? 2、職責(zé)不同,onStart方法還是主要進(jìn)行一些初始化的工作,而onResume方法,根據(jù)官方的建議可以做一些開啟動(dòng)畫和可與用戶交互的工作
1.3、onPause和onStop之間有什么區(qū)別?
? 1、可見與不可見的區(qū)別;onPause是暫停狀態(tài)但是還是可見的狀態(tài),而onStop處于已經(jīng)停止了也不可見的狀態(tài)但是Activity還在內(nèi)存中。
? 2、在系統(tǒng)存在內(nèi)存不足時(shí)可能不會(huì)執(zhí)行onStop方法,因?yàn)樵谧鰯?shù)據(jù)存儲(chǔ)、狀態(tài)保存以及程序狀態(tài)保存時(shí)最好在onPause中進(jìn)行,但是不要太耗時(shí)。
1.4、onStop和onDestroy之間有什么區(qū)別
? 1、onStop處于停止?fàn)顟B(tài)但是Activity還處于內(nèi)存中,可以通過切換頁面來喚醒Activity頁面;但是onDestroy已經(jīng)表示Activity已經(jīng)被銷毀了。
1.5、為什么切換Activity時(shí)各方法的執(zhí)行次序是
(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop
? 而不是
(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume
? 1、因?yàn)锳ctivity或多或少都會(huì)占用一些內(nèi)存在官方的建議,onPause方法將會(huì)釋放掉很多系統(tǒng)資源,為切換Activity提供流暢性的保障,而不需要再等多兩個(gè)階段,這樣做切換更快。
2、 Activity啟動(dòng)方式
? Activity有四種啟動(dòng)方式分別為:默認(rèn)啟動(dòng)模式standard、棧頂復(fù)用模式singleTop、棧內(nèi)復(fù)用模式singleTask、全局唯一模式singleInstance四種模式,這四種也有不同的特征和區(qū)別,下面就一一介紹。
一個(gè)android應(yīng)用程序功能通常會(huì)被拆分為多個(gè)Activity,而各個(gè)Activity之間通過Intent進(jìn)行連接,android系統(tǒng)通過棧結(jié)構(gòu)來保存整個(gè)程序的Activity,棧底的元素是整個(gè)棧任務(wù)的發(fā)起者。
正常情況下,當(dāng)一個(gè)Activity啟動(dòng)了另一個(gè)Activity的時(shí)候,新啟動(dòng)的Activity就會(huì)置于任務(wù)棧的頂端,而啟動(dòng)它的Activity雖然功成身退,但依然保留在任務(wù)棧中,處于停止?fàn)顟B(tài)(如果沒有finish),當(dāng)用戶按下返回鍵或者調(diào)用finish()方法時(shí),系統(tǒng)會(huì)移除頂部的Activity,讓后面的Activity恢復(fù)活動(dòng)狀態(tài)。但是,可以給Activity設(shè)置一些“特權(quán)”,來打破這種“和諧”的模式。這種特權(quán),就是通過在AndroidManifest.xml文件中的屬性android:launchMode來設(shè)置或者通過Intent的flag來設(shè)置的。
1.1、默認(rèn)啟動(dòng)模式standard
? 如果開發(fā)時(shí)不在manifest設(shè)定,那么Activity的默認(rèn)模式就是standard。在該模式下,啟動(dòng)的Activity會(huì)依照啟動(dòng)順序被依次壓入Task中:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-1uLW4Et0-1644817774817)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210102239166.png)]
返回頁面時(shí)也是依次銷毀頁面的,這是最簡單的一個(gè)模式。
1.2、棧頂復(fù)用模式singleTop
? 在該模式下,如果棧頂Activity為我們要新建的Activity(目標(biāo)Activity),那么就不會(huì)重復(fù)創(chuàng)建新的Activity而是直接切換到該Acitvity;如果棧頂Activity不是我們要新建的Activity才會(huì)去新建一個(gè)Activity。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-an0K2YUI-1644817774817)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210103854059.png)]
<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".Activity2"android:launchMode="singleTop"><intent-filter><action android:name="ONETEXT_TWOACTIVITY" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity><activity android:name=".Activity3"><intent-filter><action android:name="ONETEXT_THREEACTIVITY" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity> </application>可以手動(dòng)設(shè)置通過:android:launchMode="singleTop"對(duì)當(dāng)前Activity進(jìn)行設(shè)置啟動(dòng)模式
通過這種設(shè)置可以避免已經(jīng)創(chuàng)建過的Activity被重復(fù)創(chuàng)建
1.3、棧內(nèi)復(fù)用模式singleTask
與singleTop模式相似,只不過singleTop模式是只是針對(duì)棧頂?shù)脑?#xff0c;而singleTask模式下,如果task棧內(nèi)存在目標(biāo)Activity實(shí)例會(huì)將:將task內(nèi)的對(duì)應(yīng)Activity實(shí)例之上的所有Activity彈出棧。將對(duì)應(yīng)Activity置于棧頂,獲得焦點(diǎn)。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-uQUHyNUn-1644817774818)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210105422872.png)]
1.4、全局唯一模式singleInstance
這是第四種模式,也是相對(duì)于比較復(fù)雜的一種模式:在該模式下,我們會(huì)為目標(biāo)Activity分配一個(gè)新的affinity,并創(chuàng)建一個(gè)新的Task棧,將目標(biāo)Activity放入新的Task,并讓目標(biāo)Activity獲得焦點(diǎn)。新的Task且只有這一個(gè)Activity實(shí)例。 如果已經(jīng)創(chuàng)建過目標(biāo)Activity實(shí)例,則不會(huì)創(chuàng)建新的Task,而是將以前創(chuàng)建過的Activity喚醒(對(duì)應(yīng)Task設(shè)為Foreground狀態(tài))
這種啟動(dòng)模式和singleTask幾乎一樣,它也只允許系統(tǒng)中存在一個(gè)目標(biāo)Activity,包括上面我們所說的SingleTask的一些特性singleInstance都有。singleInstance翻譯過來是單例的意思:TA有兩層含義:1.告訴系統(tǒng),我是獨(dú)一無二的,2.告訴任務(wù)棧我是獨(dú)一無二的,也就是說,任務(wù)棧中除了我不能再有其他Activity。
所以,如果要啟動(dòng)singleInstance模式的Activity,那只能新創(chuàng)建一個(gè)任務(wù)棧用來放它,因?yàn)槿思艺f了,“我是獨(dú)一無二的!”。同樣的,如果從這種啟動(dòng)模式的Activity中啟動(dòng)別的Activity,那不好意思,我不管你是不是和我處在同一個(gè)應(yīng)用,我所在的任務(wù)棧只能擁有我一個(gè)人,您吶,另外讓系統(tǒng)給你創(chuàng)建一個(gè)任務(wù)棧待著去吧。
總結(jié)
以上是生活随笔為你收集整理的Android 四大组件之Activity的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CS224n笔记3 高级词向量表示
- 下一篇: Android学习——四大核心组件(核心