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

本人第一次寫東西伏恐,歡迎評論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的選項:


圖1 . 新建Activity

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

圖2 . APP第一個運行的Activity

但是As在新建的時候會智能的幫我們?nèi)ヅ渲媚洌侵皇菃渭兊呐渲靡粋€Activity而已,一個最簡單的Activity配置是這樣的

圖3 . 最簡單的Activity配置

如果要使用隱式意圖Intent來開啟這個Activity還需要配置里面的意圖過濾器竿音,也就是這個<intent-filter>標(biāo)簽和屎,關(guān)于意圖Intent這里就不說了,看我的有關(guān)意圖的文章春瞬。
回到正題柴信,如果用As開發(fā),創(chuàng)建Activity也就選幾個選項的事情宽气,是不是很簡單啊随常。

Activity的生命周期

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

圖4 . Activity的生命周期圖

按照這個圖潜沦,說說各個回調(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)用的順序:

圖5 . 生命周期順序

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)的圖,這樣就更清楚啦站蝠。

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

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

雜.記

切換橫豎屏還重啟Activity?

眾所周知豌习,手機(jī)屏幕是可以切換橫豎屏的存谎,在切換橫豎屏或者做某些操作的時候拔疚,會讓整個Activity銷毀后重新創(chuàng)建。其實這也沒什么既荚,只是在你沒有保存你的Activity狀態(tài)時稚失,切換橫豎屏就會丟掉一些數(shù)據(jù),這是一件比較不爽的事恰聘。那有沒有辦法阻止Activity在切換橫豎屏的時候不銷毀呢句各,可以這樣子做:

圖7

在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 或更高版本(正如minSdkVersiontargetSdkVersion屬性中所聲明)的應(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)運行

還有更為直觀的圖:


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

說會啟動模式淌山。
四種啟動模式分別是:standard裸燎、singleTopsingleTask泼疑、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()阅爽,銷毀所有活動等等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荐开,一起剝皮案震驚了整個濱河市付翁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晃听,老刑警劉巖百侧,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異能扒,居然都是意外死亡佣渴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門初斑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來观话,“玉大人,你說我怎么就攤上這事越平。” “怎么了灵迫?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵秦叛,是天一觀的道長。 經(jīng)常有香客問我瀑粥,道長挣跋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任狞换,我火速辦了婚禮避咆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘修噪。我一直安慰自己查库,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布黄琼。 她就那樣靜靜地躺著樊销,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上围苫,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天裤园,我揣著相機(jī)與錄音,去河邊找鬼剂府。 笑死拧揽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腺占。 我是一名探鬼主播淤袜,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼湾笛!你這毒婦竟也來了饮怯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤嚎研,失蹤者是張志新(化名)和其女友劉穎蓖墅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體临扮,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡论矾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杆勇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贪壳。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚜退,靈堂內(nèi)的尸體忽然破棺而出闰靴,到底是詐尸還是另有隱情,我是刑警寧澤钻注,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布蚂且,位于F島的核電站,受9級特大地震影響幅恋,放射性物質(zhì)發(fā)生泄漏杏死。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一捆交、第九天 我趴在偏房一處隱蔽的房頂上張望淑翼。 院中可真熱鬧,春花似錦品追、人聲如沸玄括。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惠豺。三九已至银还,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洁墙,已是汗流浹背蛹疯。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留热监,地道東北人捺弦。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像孝扛,于是被迫代替她去往敵國和親列吼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

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