本人第一次寫東西伏恐,歡迎評論9Α璧针!
Activity是四大組件之一
四大組件都是有個性的,所以他們都要在AndroidMainfest.xml文件中注冊十厢。
Activity 幾乎算是所有開始接觸Android的新手第一個接觸到的基本組件等太,只要是一個完成的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).
看不懂缩抡?那就來看看翻譯吧:
活動是Android平臺上應(yīng)用程序的基本構(gòu)件之一。它們作為用戶與應(yīng)用程序交互的切入點包颁,也是用戶在應(yīng)用程序中導(dǎo)航(如“后退”按鈕)或應(yīng)用程序之間的關(guān)鍵(與“更新”按鈕一樣)瞻想。
這樣就清楚多了吧。
Activity 的新建
新建一個Activity其實很簡單娩嚼,如果用的是Android studio 蘑险,那就更簡單了,因為As(Android studio的簡稱待锈,以下用到的都會用簡稱)提供了一個可以快速新建Activity的選項:
新建好了之后本來還需要到AndroidManifest.xml文件中配置信息的
但是As在新建的時候會智能的幫我們?nèi)ヅ渲媚洌侵皇菃渭兊呐渲靡粋€Activity而已,一個最簡單的Activity配置是這樣的
如果要使用隱式意圖
Intent
來開啟這個Activity還需要配置里面的意圖過濾器竿音,也就是這個<intent-filter>
標(biāo)簽和屎,關(guān)于意圖Intent
這里就不說了,看我的有關(guān)意圖的文章春瞬。回到正題柴信,如果用As開發(fā),創(chuàng)建Activity也就選幾個選項的事情宽气,是不是很簡單啊随常。
Activity的生命周期
Activity的生命周期從開始到銷毀在Activity中經(jīng)歷的回調(diào)方法是這些
按照這個圖潜沦,說說各個回調(diào)方法:
onCreate()
創(chuàng)建狀態(tài):在系統(tǒng)首次創(chuàng)建Activity時就會調(diào)用該方法,在這個方法中可以設(shè)置application的一些基本啟動程序绪氛,包括獲取控件唆鸡,填充數(shù)據(jù)等等,由于是創(chuàng)建方法枣察,所以在整個生命周期中争占,該方法只會被調(diào)用一次。注意:不可在onCreate()
方法中去獲取控件的尺寸序目,因為這是做不到的臂痕,來看一看各個回調(diào)方法調(diào)用的順序:
onStart()
開始狀態(tài):通過這個方法,Activity將會進(jìn)入前臺猿涨,使活動對用戶可見握童,該方法在onCreate()
后面調(diào)用,該方法還會在另外一個方法后面調(diào)用叛赚,就是onRestart()
方法澡绩,該方法后面再說。
onResume()
交互狀態(tài)红伦,也稱恢復(fù)狀態(tài):調(diào)用這個方法時英古,說明Activity已經(jīng)被置于前臺了,進(jìn)入了與用戶交互的狀態(tài)昙读。就是說召调,用戶可以操作該Activity了。
onPause()
暫停狀態(tài):Activity進(jìn)入暫停狀態(tài)蛮浑,但依然可見唠叛,比如被半透明的彈框遮住,也就是該Activity中斷了沮稚,可以使用該
方法釋放系統(tǒng)資源艺沼,例如廣播接收器,傳感器(例如GPS)的手柄蕴掏,或任何可能影響電池壽命的資源障般,因為活動暫停,已經(jīng)不需要這些資源了盛杰。
onStop()
停止?fàn)顟B(tài):當(dāng)您的活動對用戶不再可見時挽荡,它已進(jìn)入 停止狀態(tài),系統(tǒng)調(diào)用onStop()
回調(diào)即供。例如定拟,當(dāng)新啟動的活動覆蓋整個屏幕時,可能會發(fā)生這種情況逗嫡。當(dāng)活動完成運行時青自,系統(tǒng)也可以調(diào)用株依,并且即將被終止。在該方法中延窜,應(yīng)用程序應(yīng)該釋放幾乎所有的用戶不需要的資源恋腕。例如,如果您注冊一個BroadcastReceiver
在偵聽可能會影響用戶界面的變化逆瑞,你可以注銷在廣播接收器 吗坚,因為用戶不再能看到的UI。同樣重要的是呆万,您可以使用 釋放可能泄漏內(nèi)存的資源,因為系統(tǒng)可能會在不調(diào)用活動最終onDestroy
回調(diào)的情況下終止托管活動的進(jìn)程 车份。您還應(yīng)該使用相對CPU密集的關(guān)機(jī)操作谋减。例如,如果您無法找到更適合將信息保存到數(shù)據(jù)庫的時間扫沼,則可能會在此期間執(zhí)行此操作出爹。以下示例顯示了一個實現(xiàn) ,將注釋草稿的內(nèi)容保存到永久存儲缎除。在這個方法之后呢严就,會有兩條路,一條是銷毀onDestroy()
器罐,一條是重生onRestart()
梢为。
onRestart()
切換到別的界面之后重新進(jìn)入Activity,而后調(diào)用的方法是onStart()
方法轰坊,重新回到前臺铸董。
onDestroy()
銷毀,該方法是整個生命周期的最后一個方法肴沫,也只調(diào)用一次粟害,調(diào)用這個方法證明這個Activity已經(jīng)到盡頭了,所以就完了颤芬。
害怕自己文筆不是很好悲幅,所以附上google官網(wǎng)的圖,這樣就更清楚啦站蝠。
關(guān)于 ‘是否能事后終止’ 一欄:是汰具,則表示隨時有可能被系統(tǒng)終止,就算是在
onPause()
方法沉衣,返回到onResume()
方法期間也有可能被系統(tǒng)終止郁副。
雜.記
切換橫豎屏還重啟Activity?
眾所周知豌习,手機(jī)屏幕是可以切換橫豎屏的存谎,在切換橫豎屏或者做某些操作的時候拔疚,會讓整個Activity銷毀后重新創(chuàng)建。其實這也沒什么既荚,只是在你沒有保存你的Activity狀態(tài)時稚失,切換橫豎屏就會丟掉一些數(shù)據(jù),這是一件比較不爽的事恰聘。那有沒有辦法阻止Activity在切換橫豎屏的時候不銷毀呢句各,可以這樣子做:
在Activity中有個屬性android:configChanges
,該屬性是確定友哪些操作引起的本來需要重啟的操作晴叨,現(xiàn)在不用了凿宾,參數(shù)就是這些操作,比如orientation
就是屏幕方向也就是切換橫豎屏兼蕊,而keyboardHidden
則是表示鍵盤可用性及語言初厚,如上圖所示,參數(shù)可以有多個孙技,只需要用通道|
連接即可产禾。當(dāng)然啦,你也可以老老實實的去保存Activity的狀態(tài)牵啦,
注意:從 Android 3.2(API 級別 13)開始亚情,當(dāng)設(shè)備在縱向和橫向之間切換時,“屏幕尺寸”也會發(fā)生變化哈雏。因此楞件,在開發(fā)針對 API 級別 13 或更高版本(正如
minSdkVersion
和targetSdkVersion
屬性中所聲明)的應(yīng)用時,若要避免由于設(shè)備方向改變而導(dǎo)致運行時重啟僧著,則除了"orientation
"值以外履因,您還必須添加"screenSize
"值。 也就是說盹愚,您必須聲明android:configChanges="orientation|screenSize"
栅迄。但是,如果您的應(yīng)用面向 API 級別 12 或更低版本皆怕,則 Activity 始終會自行處理此配置變更(即便是在 Android 3.2 或更高版本的設(shè)備上運行毅舆,此配置變更也不會重啟 Activity)。
接下來說說Activity的啟動模式
Activity的四種啟動模式
再說啟動模式之前愈腾,先說說Activity被創(chuàng)建之后所在的地方憋活,被稱為返回棧,這個棧只有棧頂一個口虱黄,進(jìn)和出都在這里悦即,創(chuàng)建一個Activity就放入這個棧中,如果在棧中已經(jīng)有Activity,那么新創(chuàng)建的Activity會置于棧頂辜梳,將其他的Activity壓于棧底粱甫,而手機(jī)顯示的就是處于棧頂?shù)腁ctivity。
引用一下官網(wǎng)的:
當(dāng)前 Activity 啟動另一個 Activity 時作瞄,該新 Activity 會被推送到堆棧頂部茶宵,成為焦點所在。 前一個 Activity 仍保留在堆棧中宗挥,但是處于停止?fàn)顟B(tài)乌庶。Activity 停止時,系統(tǒng)會保持其用戶界面的當(dāng)前狀態(tài)契耿。 用戶按“返回”按鈕時瞒大,當(dāng)前 Activity 會從堆棧頂部彈出(Activity 被銷毀),而前一個 Activity 恢復(fù)執(zhí)行(恢復(fù)其 UI 的前一狀態(tài))搪桂。 堆棧中的 Activity 永遠(yuǎn)不會重新排列糠赦,僅推入和彈出堆棧:由當(dāng)前 Activity 啟動時推入堆棧;用戶使用“返回”按鈕退出時彈出堆棧锅棕。 因此,返回棧以“后進(jìn)先出”對象結(jié)構(gòu)運行
還有更為直觀的圖:
說會啟動模式淌山。
四種啟動模式分別是:standard
裸燎、singleTop
、singleTask
泼疑、singleInstance
德绿。在說其中模式的區(qū)別之前,先說說設(shè)置方法退渗,其實也就是在AndroidMainfest.xml文件中Activity配置標(biāo)簽中的一個屬性:launchMode
像這樣:
啟動模式的區(qū)別
standard
(標(biāo)準(zhǔn))是最普通的模式移稳,也是默認(rèn)的模式。就是說会油,在沒有指定某一種啟動模式時个粱,系統(tǒng)會默認(rèn)使用這一種模式,這模式特點就是可以有多個實例翻翩,如果Activity1是使用了該模式,可以不斷創(chuàng)建該Activity都许,就算在返回棧中已經(jīng)存在該Activity,所以嫂冻,如果打開了三次這個Activity(就是創(chuàng)建三次Activity胶征,并將之置于返回棧),那么需要“返回”三次才能推出這個Activity桨仿。
singleTop
(棧頂唯一)睛低,由名字可以知道,如果再次創(chuàng)建正處于棧頂?shù)腁ctivity,那么將不會創(chuàng)建钱雷,而是繼續(xù)復(fù)用這個Activity骂铁。
singleTask
(棧唯一),由名字可以知道急波,在這種模式下从铲,如果需要創(chuàng)建的Activity在棧中已經(jīng)存在,那么將不會創(chuàng)建澄暮,而是將這個Activity提升到棧頂名段,繼續(xù)復(fù)用這個Activity。
singleInstance
(實例唯一)泣懊,如果選擇了這種模式伸辟,那么無論在這個Activity的返回棧中是否存在這個Activity,系統(tǒng)都會為這個Activity重新創(chuàng)建一個單獨的返回棧馍刮,這樣信夫,整個系統(tǒng)就只有這個Activity的這一個實例,所有的APP都可以訪問這個Activity卡啰。就像打電話的Activity静稻。
Activity的開啟與銷毀
Activity有兩種開啟方式:
一種是startActivity()
,另一種是startActivityForResult()
匈辱。區(qū)別也很簡單振湾,一種是沒有返回值的,一種是有返回值的亡脸,但是都可以將數(shù)據(jù)傳輸?shù)奖淮蜷_的Activity押搪,其中用到的就是意圖Intent
,由于這篇文章是我專門寫Activity所以就不說Intent
了浅碾。然而啟動Activity大州,Intent是必不可少的,所以在我的有關(guān)Intent的文章中會再次說到開啟活動垂谢。
那第二種啟動方式返回的值該怎樣獲取呢厦画?
在Activity中有這么一個函數(shù)onActivityResult()
,所有由第二種方式開啟的Activity返回的值都是返回到這里的滥朱。
那該怎樣區(qū)分哪個值是由哪個Activity返回而來的呢苛白?
那當(dāng)然是要靠請求碼和返回碼啦。在調(diào)用第二種開啟方式是需要參數(shù)焚虱,完整的方法购裙,包括參數(shù)是這樣的startActivityForResult(Intent intent,int requestCode)
,第二個參數(shù)requestCode
是一個請求碼鹃栽,然而在被開啟的Activity也有一個返回方法setResult(int resultCode,Intent intent)
,第一個參數(shù)resultCode
是一個返回碼躏率,這兩個碼都可以用來解答上面的問題躯畴。當(dāng)然啦,在調(diào)用setResult()
方法之后就要銷毀被打開的頁面了薇芝,畢竟調(diào)用了這個方法蓬抄,就代表你已經(jīng)要返回數(shù)據(jù)并退出這個Activity了。
那如何銷毀一個Activity呢夯到?最簡單直接的就是finish()
方法嚷缭。當(dāng)然除了這個方法之外,肯定還有其他的方法耍贾。就比如ActivityCollector.finishAll()
阅爽,銷毀所有活動等等。