Android開(kāi)發(fā)之Activity詳解
【Activity】
一個(gè)Activity是一個(gè)應(yīng)用程序組件,提供一個(gè)屏幕,用戶可以用來(lái)交互為了完成某項(xiàng)任務(wù),例如撥號(hào)、拍照、發(fā)送email、看地圖。每一個(gè)activity被給予一個(gè)窗口,在上面可以繪制用戶接口。窗口通常充滿屏幕,但也可以小于屏幕而浮于其它窗口之上。
一個(gè)應(yīng)用程序通常由多個(gè)activities組成,他們通常是松耦合關(guān)系。通常,一個(gè)應(yīng)用程序中的activity被指定為"main"activity,當(dāng)?shù)谝淮螁?dòng)應(yīng)用程序的時(shí)候呈現(xiàn)給用戶的那個(gè)activity。每一個(gè)activity然后可以啟動(dòng)另一個(gè)activity為了完成不同的動(dòng)作。每一次一個(gè)activity啟動(dòng),前一個(gè)activity就停止了,但是系統(tǒng)保留activity在一個(gè)棧上(“back stack”)。當(dāng)一個(gè)新activity啟動(dòng),它被推送到棧頂,取得用戶焦點(diǎn)。Back Stack符合簡(jiǎn)單“后進(jìn)先出”原則,所以,當(dāng)用戶完成當(dāng)前activity然后點(diǎn)擊back按鈕,它被彈出棧(并且被摧毀),然后之前的activity恢復(fù)。
當(dāng)一個(gè)activity因新的activity啟動(dòng)而停止,它被通知這種狀態(tài)轉(zhuǎn)變通過(guò)activity的生命周期回調(diào)函數(shù)。有許多回調(diào)函數(shù)一個(gè)activity可能會(huì)收到,源于它自己的狀態(tài)變化-無(wú)論系統(tǒng)創(chuàng)建它、停止它、恢復(fù)它、摧毀它-并且每個(gè)回調(diào)提供你完成適合這個(gè)狀態(tài)的指定工作的機(jī)會(huì)。例如,當(dāng)停止的時(shí)候,你的activity應(yīng)該釋放任何大的對(duì)象,例如網(wǎng)絡(luò)數(shù)據(jù)庫(kù)連接。當(dāng)activity恢復(fù),你可以重新獲得必要的資源和恢復(fù)被中斷的動(dòng)作。這些狀態(tài)轉(zhuǎn)換都是activity的生命周期的部分。
【Creating an Activity】
創(chuàng)建一個(gè)activity,你必須創(chuàng)建一個(gè)Activity的子類(lèi)(或者一個(gè)Activity的子類(lèi)的子類(lèi))。在你的子類(lèi)中,你需要實(shí)現(xiàn)系統(tǒng)回調(diào)的回調(diào)方法,當(dāng)activity在它的生命周期的多種狀態(tài)中轉(zhuǎn)換的時(shí)候,例如當(dāng)activity被創(chuàng)建、停止、恢復(fù)或摧毀。兩個(gè)最重要的回調(diào)方法是:
onCreate()
你必須實(shí)現(xiàn)這個(gè)方法。系統(tǒng)調(diào)用它當(dāng)創(chuàng)建你的activity的時(shí)候。在你的實(shí)現(xiàn)中,你應(yīng)該初始化你的activity的基本的組件。更重要的是,這里就是你必須調(diào)用setContentView()來(lái)定義activity用戶接口而已的地方。
onPause()
系統(tǒng)調(diào)用這個(gè)方法當(dāng)用戶離開(kāi)你的activity(雖然不總是意味著activity被摧毀)。這通常是你應(yīng)該提交任何變化,那此將會(huì)超越user session而存在的(因?yàn)橛脩艨赡懿辉倩貋?lái))。
有若干其它生命周期回調(diào)函數(shù)你應(yīng)該使用為了提供一個(gè)流暢的用戶體驗(yàn),并表操作異常中斷會(huì)引起你的activity被中斷甚至被摧毀。
1、Implementing a user interface
一個(gè)activity的用戶接口被一個(gè)層次化的視圖提供--繼承于View類(lèi)的對(duì)象。每個(gè)View控制activity窗口中的一個(gè)特定矩形區(qū)域并且能響應(yīng)用戶交互。例如,一個(gè)view可能是個(gè)button,初始化動(dòng)作當(dāng)用戶觸摸它的時(shí)候。
Android提供大量預(yù)定義的view,你可以使用來(lái)設(shè)計(jì)和組件你的布局?!癢idgets”是一種給屏幕提供可視化(并且交互)元素的view,例如按鈕、文件域、復(fù)選框或者僅僅是圖像?!癓ayouts”是繼承于ViewGroup的View,提供特殊的布局模型為它的子view,例如線程布局、格子布局或相關(guān)性布局。你可以子類(lèi)化View和ViewGroup類(lèi)(或者存在的子類(lèi))來(lái)創(chuàng)建自己的widget和而已并且應(yīng)用它們到你的activity布局中。
最普通的方法是定義一個(gè)布局使用view加上XML布局文件保存在你的程序資源里。這樣,你可以單獨(dú)維護(hù)你的用戶接口設(shè)計(jì),而與定義activity行為的代碼無(wú)關(guān)。你可以設(shè)置布局作為UI使用setContentView(),傳遞資源布局的資源ID。可是,你也可以創(chuàng)建新Views在你的activity代碼,并且創(chuàng)建一個(gè)view層次通過(guò)插入新Views到ViewGroup,然后使用那個(gè)布局通過(guò)傳遞到根ViewGroup給setContentView()。
【Declaring the activity in the manifest】
你必須聲明你的activity在manifest文件為了它可以被系統(tǒng)訪問(wèn)。要聲明你的activity,打開(kāi)你的manifest文件,添加一個(gè)<activity>元素作為<application>元素的子元素。例如:
【Using intent filters】
一個(gè)<activity>元素也能指定多種intent filters--使用<inetent-filter>元素--為了聲明其它應(yīng)用程序可以激活它。
當(dāng)你創(chuàng)建一個(gè)新應(yīng)用程序使用Android SDK工具,存根activity自動(dòng)為你創(chuàng)建,包含一個(gè)intent filter,聲明了activity響應(yīng)"main"動(dòng)作,并且應(yīng)該被 放置 在"launcher"分類(lèi)。Intent filter看起來(lái)像這個(gè)樣子。
<action>元素指定這是一個(gè)"main"入口點(diǎn)對(duì)這個(gè)應(yīng)用程序。<category>元素指定,這個(gè)activity應(yīng)該被列入系統(tǒng)應(yīng)用程序列表中(為了允許用戶啟動(dòng)這個(gè)activity)。
如果你希望應(yīng)用程序自包含,并且不希望別的應(yīng)用程序激活它的activities,那么你不需要任何其它intent filters。只有一個(gè)activity應(yīng)該有“main"動(dòng)作和”launcher“分類(lèi),就像前面這個(gè)例子。你不希望被其它應(yīng)用程序訪問(wèn)原Activities應(yīng)該沒(méi)有intent filters而且你能啟動(dòng)他們通過(guò)自己顯示的intent。
可是,如果你希望你的activity響應(yīng)影含的intents,從其它應(yīng)用程序(和你自己的),那么你必須定義額外的intent filters為這個(gè)activity。每一種你希望響應(yīng)的類(lèi)型的intent,你必須包含<intent-filter>,包含<action>元素,可選的,一個(gè)<category>元素并且/或一個(gè)<data>元素。這些元素指定你的activity能響應(yīng)的intent的類(lèi)型。
【Starting an Activity】
你可以開(kāi)啟另一個(gè)activity通過(guò)startActivity(),傳遞一個(gè)Intent描述了你希望啟動(dòng)的Activity。Intent指定要么準(zhǔn)備的activity你希望啟動(dòng)或描述你希望完成的動(dòng)作(操作系統(tǒng)選擇合適的activity為你,可能來(lái)自定不同的應(yīng)用程序)。一個(gè)intent可以傳輸小量數(shù)據(jù)被啟動(dòng)的activity使用。
完全工作在你的應(yīng)用程序之內(nèi),你將經(jīng)常需要簡(jiǎn)單的啟動(dòng)一個(gè)未知的activity。你可以這么通過(guò)創(chuàng)建一個(gè)intent顯示的定義你希望啟動(dòng)的activity,使用類(lèi)名。例如,下面顯示一個(gè)activity怎么啟動(dòng)另一個(gè)activity命名為SignInActivity:
可是,你的應(yīng)用程序或許希望執(zhí)行一些動(dòng)作,例如發(fā)送一份郵件、文件消息或者狀態(tài)更新,使用你的activity的數(shù)據(jù)。在這種情況下,你的應(yīng)用程序或許沒(méi)有它自己的activity來(lái)完成這個(gè)動(dòng)作,因此你可以促使設(shè)備上其它應(yīng)用程序提供的activity來(lái)完成你的動(dòng)作。這才是intent真正有價(jià)值的地方--你可以創(chuàng)建一個(gè)intent描述一個(gè)你希望執(zhí)行的動(dòng)作,然后系統(tǒng)啟動(dòng)一個(gè)合適的activity從其它應(yīng)用程序。如果有多種activities可以處理這個(gè)intent,那么 用戶可以選擇哪一個(gè)來(lái)執(zhí)行。例如,如果你希望允許用戶發(fā)送郵件,你可以創(chuàng)建下面的Intent:
EXTRA_EMAIL額外的添加給intent一個(gè)字符串?dāng)?shù)組指定email地址,當(dāng)一個(gè)郵件應(yīng)用程序響應(yīng)這個(gè)intent的時(shí)候,它讀取這些字符串?dāng)?shù)組并且放置他們到相應(yīng)字段。在這種情況下,email應(yīng)用程序的activity啟動(dòng)并且當(dāng)用戶執(zhí)行完,你的activity恢復(fù)。
【Starting an activity for a result】
有時(shí),你或許希望接收一個(gè)結(jié)果從你啟動(dòng)的activity。在這種情況下,開(kāi)啟這個(gè)activity通過(guò)startActivityForResult()(而不是startActivity())。然后從隨后的activity接收結(jié)果,實(shí)現(xiàn)onActiviryResult()回調(diào)函數(shù)。當(dāng)隨后的activity完成,它返回一個(gè)結(jié)果給你的onActivityResult()函數(shù)通過(guò)一個(gè)intent。
例如,或許你希望用戶選擇他們中的一個(gè)聯(lián)系人,所以你的activity可以對(duì)這個(gè)聯(lián)系人做些事情。下面是你怎么建立這樣一個(gè)Intent和操作結(jié)果:
這個(gè)例子展現(xiàn)了基本的邏輯你應(yīng)該使用的在你的onActivityResult()函數(shù)中,為了操作一個(gè)activity的結(jié)果。第一個(gè)條件檢測(cè)是否請(qǐng)求成功--如果是,那么 resultCode將會(huì)是RESULT_OK--并且是否這個(gè)請(qǐng)求是否是這個(gè)響應(yīng)是響知道--在這種情況下,requestCode匹配第二個(gè)參數(shù)用startActivityForResult()的參數(shù)。在那里,代碼操作activity結(jié)果通過(guò)查詢返回在intent中的數(shù)據(jù)(data參數(shù))。
將發(fā)生的是,一個(gè)ContentResolver實(shí)現(xiàn)查詢content provider,返回一個(gè)Cursor允許讀查詢的數(shù)據(jù)。
【Shut Down an Activity】
你可以關(guān)閉一個(gè)activity通過(guò)調(diào)用自身的finish()方法。你也可以關(guān)閉一個(gè)獨(dú)立的activity你之前啟動(dòng)的通過(guò)finiActivity()。
注意:在大多數(shù)情況下,你不應(yīng)該顯示結(jié)果一個(gè)activity使用這些方法。正在下文所討論的關(guān)于activity的生命周期,Android系統(tǒng)管理一個(gè)activity的生命周期為你,所以你不需要結(jié)果你自己的activity。調(diào)用這些函數(shù)對(duì)用戶體驗(yàn)有害并且只有在你決對(duì)不希望用戶返回到這個(gè)activity的情況下。
【Managing the Activity Lifecycle】
管理你的activity的生命周期通過(guò)實(shí)現(xiàn)回調(diào)函數(shù)非常關(guān)鍵對(duì)開(kāi)發(fā)一個(gè)健壯和有彈性的應(yīng)用程序。一個(gè)activity的生命周期直接被與其相關(guān)聯(lián)的其它activity影響,task和bask stack。
一個(gè)activity可以存在于主要的三種狀態(tài):
1、Resumed
activity在前景并且擁有用戶焦點(diǎn)。(這個(gè)狀態(tài)有時(shí)也叫”running“)
2、Paused
另一個(gè)activity在前景并且擁有用戶焦點(diǎn),但這個(gè)仍然可見(jiàn)。也就是說(shuō),另一個(gè)activity可見(jiàn)在這個(gè)的上面,當(dāng)前activity部分透明或沒(méi)有覆蓋整個(gè)屏幕。一個(gè)paused activity完全活著(the Activity對(duì)象維在內(nèi)存中,它維護(hù)所有的狀態(tài)并且記憶信息,仍然連接著窗口管理器),但是可以被系統(tǒng)殺死在極端需要內(nèi)存的情形下。
3、Stopped
一個(gè)activity被另一個(gè)activity完全阻擋(activity現(xiàn)在在后臺(tái))。一個(gè)stopped activity仍然活著(Activity object維持在內(nèi)存中,它維擴(kuò)所有的狀態(tài)和成員信息,但沒(méi)有綁定窗口管理器)??墒?,它不再被用戶可見(jiàn)并且它可被系統(tǒng)銷(xiāo)毀在需要的地方。
如果一個(gè)activity paused或者stopped,系統(tǒng)可以從內(nèi)存中拋棄它通過(guò)要求它結(jié)束(調(diào)用它的finish()方法),或者簡(jiǎn)單的殺掉它的進(jìn)程。當(dāng)activity再次被打開(kāi)(在被finished或殺死后),它重新建立所有的東西。
【Implementing the lifecycle callbacks】
當(dāng)一個(gè)activity轉(zhuǎn)換到或轉(zhuǎn)換出上面提到的狀態(tài),它被通過(guò)各種不同的回調(diào)函數(shù)通知。所有這些回調(diào)函數(shù)都是hook,你可以覆蓋來(lái)做合適的工作當(dāng)你的activity狀態(tài)變化。下面的activity骨架包含每一個(gè)基本的生命周期函數(shù):
注意:你的這些生命周期函數(shù)的實(shí)現(xiàn)必須調(diào)用父類(lèi)的實(shí)現(xiàn)在你做自己的工作之前,就像上面顯示的一樣。
放在一起,這些函數(shù)定義了整個(gè)生命周期關(guān)于一個(gè)activity。通過(guò)實(shí)現(xiàn)這些方法,你可以監(jiān)視三種嵌套的循環(huán)在activity生命周期中。
1、一個(gè)activity的整個(gè)生命時(shí)間發(fā)生在onCreate()和onDestroy()函數(shù)。你的activity應(yīng)該設(shè)置全局狀態(tài)(例如定義布局)在onCreate(),并且釋放所有的資源在onDestroy()。例如,如果你的activity有一個(gè)線程在后臺(tái)跑下載數(shù)據(jù)從網(wǎng)絡(luò),它可能創(chuàng)建那個(gè)線程在onCreate()然后停止線程在onDestroy()。
2、一個(gè)可視的生命期發(fā)生在onStart()和onStop()之間。在這期間,用戶可以看見(jiàn)activity在屏幕上并且和它交互。例如,onStop()被調(diào)時(shí)當(dāng)一個(gè)新的activity開(kāi)始并且這個(gè)不再被可見(jiàn)。在這兩個(gè)函數(shù)間,你可以維持資源那些需要用來(lái)展現(xiàn)activity給用戶的。例如,你可以注冊(cè)一個(gè)BroadcastReceiver在onStart(),然后注銷(xiāo)在onStop()當(dāng)用戶不再看見(jiàn)你顯示的東西。系統(tǒng)可能會(huì)調(diào)onStart(0和onStop()多次在這整個(gè)生命線期間,當(dāng)activity在是否可見(jiàn)間轉(zhuǎn)換的時(shí)候。
3、一個(gè)activity的前景生命期發(fā)生在onResume()和onPause()之間。在這期間,此activity在所有其它activity之上在屏幕上,并且擁有用戶焦點(diǎn)。一個(gè)activity可以經(jīng)常轉(zhuǎn)換進(jìn)和轉(zhuǎn)換出前景--例如,onPause被調(diào)用當(dāng)設(shè)備準(zhǔn)備休眠蔌當(dāng)一個(gè)對(duì)話框產(chǎn)生。因?yàn)檫@種狀態(tài)可以經(jīng)常轉(zhuǎn)換,代碼在這兩個(gè)狀態(tài)應(yīng)該輕量為了避免減慢轉(zhuǎn)換速度使得用戶等待。
圖像1陳述這些循環(huán)并且展現(xiàn)一個(gè)activity可以發(fā)生的狀態(tài)轉(zhuǎn)換路徑。矩形代表你能實(shí)現(xiàn)的回調(diào)函數(shù)。
Figure 1. The activity lifecycle.
同樣的生命周期回調(diào)函數(shù)被列在table 1,更加詳細(xì)的描述了回調(diào)函數(shù)放置每一個(gè)在activity的事個(gè)生命周期,包含是否系統(tǒng)能殺死activity在回調(diào)函數(shù)完成后。
Table 1. A summary of the activity lifecycle's callback methods.
因?yàn)閛nPause()他們?nèi)齻€(gè)中的第一個(gè),一量activity被建立,onPause()是最后一個(gè)被保證調(diào)用的方法--如果系統(tǒng)必須恢復(fù)內(nèi)存在緊急狀態(tài),然后onStop()和onDestroy()可能將不被調(diào)用。因此,你應(yīng)該使用onPause()來(lái)寫(xiě)數(shù)據(jù)(例如edit)的存儲(chǔ)??墒?,你應(yīng)該精心挑選哪個(gè)信息一定要在onPause()中留住,因?yàn)槿魏魏巫枞牟僮髟谶@個(gè)函數(shù)阻塞到下一個(gè)activity的轉(zhuǎn)換因而降低用戶體驗(yàn)。
【Saving activity state】
本文簡(jiǎn)單的提到了什么一個(gè)activity被paused和stopped,activity的狀態(tài)維持著。這是真的因?yàn)閍ctivity對(duì)象仍然在內(nèi)存當(dāng)它被paused或stopped--所有的信息關(guān)于它的成員變量和當(dāng)前狀態(tài)都存在。如此,任何用戶的變化在activity中都維持在內(nèi)存里,所以當(dāng)activity返回到前景的時(shí)候(resumes),這些變化仍然存在。
可是,當(dāng)系統(tǒng)摧毀一個(gè)activity為了恢復(fù)內(nèi)存,activity對(duì)象被摧毀了,所以系統(tǒng)不能簡(jiǎn)單的以完整狀態(tài)resume它。代替的是,系統(tǒng)必須創(chuàng)建Activity對(duì)象如果用戶瀏覽回它。也就是,用戶不知道系統(tǒng)摧毀了activity并且再創(chuàng)建了它,如此,可以希望activity是它剛才的那個(gè)。在這種情況下,你可以確定重要的信息關(guān)于activity的狀態(tài)被保留通過(guò)實(shí)現(xiàn)一個(gè)額外的回調(diào)函數(shù),允許你保存信息關(guān)于你的activity,然后恢復(fù)它當(dāng)系統(tǒng)重新創(chuàng)建它的時(shí)候。
這個(gè)你可以保存當(dāng)前狀態(tài)信息的回調(diào)函數(shù)是onSaveInstanceState()。系統(tǒng)調(diào)這個(gè)函數(shù)在摧毀activity這前,并且傳遞一個(gè)Bundle對(duì)象。Bundle就是你可存在狀態(tài)信息的地方,采用name-value對(duì),使用方法如putString()。然后,如果系統(tǒng)殺死你的activity進(jìn)程并且用戶瀏覽回到你的activity,系統(tǒng)傳遞Bundle給onCreate,這樣你就可以恢復(fù)activity狀態(tài)你在onSaveInnstanceState()時(shí)候保存的狀態(tài)。如果沒(méi)有信息被保存,傳遞給onCreate()的Bundle是null。
注意:不保證onSaveInstanceState()將會(huì)被調(diào)用在你的activity被摧毀前,因?yàn)橛胁恍枰鎯?chǔ)的情況存在(例如當(dāng)用戶離開(kāi)你的activity,用戶顯示的結(jié)束)。如果這個(gè)方法被調(diào)用,它總是在onStop()前,概率性在onPause()前。
可是,即使你不做什么事也不實(shí)現(xiàn) onSaveInstanceState(),一些activity的狀態(tài)被activity類(lèi)的默認(rèn)onSaveInstanceState實(shí)現(xiàn)恢復(fù)。特別的,默認(rèn)的View的onSaveInstance()在布局方面,允許每一個(gè)視圖提供它自己的信息來(lái)被保存。幾乎所有 的Android框架中的widget實(shí)現(xiàn)這個(gè)方法合適的,這樣任何可見(jiàn)的變化對(duì)UI都自己保存并且恢復(fù)當(dāng)你的activity被創(chuàng)建的時(shí)候。例如,EditText widget保存任何文本被用戶輸入的,并且CheckBox widget保存是否選中還是沒(méi)選中。惟一的工作要求你的是提供一個(gè)惟一的ID(通過(guò)android:id屬性)給每一個(gè)希望保存狀態(tài)的widget。如果一個(gè)widget沒(méi)有ID,那么 它不保存它的狀態(tài)。
雖然onSaveInstanceState()的默認(rèn)實(shí)現(xiàn)保存非常有用的信息關(guān)于你的activity UI你仍然會(huì)需要覆蓋它來(lái)保存額外的信息。例如,你或許需要保存成員變量在activity生命期間變化的(和保存在UI中的數(shù)據(jù)有關(guān),但保存這些UI值的變量卻不會(huì)被默認(rèn)保存)。
因?yàn)槟J(rèn)的onSaveInstanceState()幫你 你保存UI狀態(tài),如果你覆蓋這些方法為了保存額外的信息,你應(yīng)該每次調(diào)用父類(lèi)的實(shí)現(xiàn)關(guān)于onSaveinstanState()在做工作之前。
注意:因?yàn)閛nSaveInstanceState()不保證被調(diào)用,你應(yīng)該用它僅用它記錄臨時(shí)狀態(tài)關(guān)于你的activity--你應(yīng)該永遠(yuǎn)不用它來(lái)存儲(chǔ)永久性數(shù)據(jù)。代替的是,你應(yīng)該用onPause()來(lái)存儲(chǔ)永遠(yuǎn)性數(shù)據(jù)(例如保存在數(shù)據(jù)庫(kù)中的數(shù)據(jù))當(dāng)用戶離開(kāi)activity。
一個(gè)好的方法測(cè)試你程序保存狀態(tài)的功能是簡(jiǎn)單的轉(zhuǎn)換設(shè)備以使屏幕方向改變。當(dāng)屏幕方向變化,系統(tǒng)摧毀和重建activity為了應(yīng)用可選的資源,適合新方向的。出于這個(gè)原因,你的activity恢復(fù)它的狀態(tài)當(dāng)創(chuàng)建的時(shí)候非常重要,因?yàn)橛脩敉ǔ^D(zhuǎn)換屏幕在使用應(yīng)用程序的時(shí)候。
【Handling configuratinon changes】
一些設(shè)備配置能在運(yùn)行時(shí)改變(例如屏幕方向,鍵盤(pán)是否可用和語(yǔ)言)。當(dāng)這樣的變化發(fā)生時(shí),Android重新開(kāi)啟運(yùn)行中的Activity(onDestroy()被調(diào)用,然后onCreate()被調(diào)用)。重啟行為被設(shè)計(jì)來(lái)幫助應(yīng)用程序適應(yīng)新的配置通過(guò)自動(dòng)加載你的應(yīng)用程序通過(guò)可選的資源,你提供的。如果你設(shè)置你的activity合適的操作這個(gè)事件,它將更有彈性對(duì)生命周期中無(wú)法預(yù)料的事件。
最好的方法操作配置變化,例如屏幕方向變,就是簡(jiǎn)單的預(yù)定義你應(yīng)用程序的狀態(tài)使用onSaveInstanceState()和onRestoreInstanceState()(或onCreate()),就像前面討論的。
【Coordinating activities】
當(dāng)一個(gè)activity啟動(dòng)另一個(gè),他們都在體驗(yàn)生命周期轉(zhuǎn)換。第一個(gè)activitypauses和stop(雖然,它不會(huì)stop如果他仍然可見(jiàn)在前景),另一個(gè)activity被創(chuàng)建。萬(wàn)一這些activities共離數(shù)據(jù)保存到磁盤(pán)或哪,那就讓第一個(gè)activity不退出在另一個(gè)啟動(dòng)前就顯得非常重要。相當(dāng)?shù)那闆r是,后一個(gè)進(jìn)程啟動(dòng)覆蓋了前一個(gè)停止的時(shí)候。
生周周期回調(diào)被良好的定義了,特別的當(dāng)兩個(gè)activities都在同一個(gè)進(jìn)程,并且其中一個(gè)啟動(dòng)另一個(gè)。下面是操作順序當(dāng)activity A啟動(dòng)activity B:
1、Activity A 的onPause()的方法執(zhí)行。
2、Activity B 的onCreate()、onStart()和onResume()方法執(zhí)行,順序的。(B現(xiàn)在擁有用戶焦點(diǎn))
3、如果A不再可見(jiàn),它的onStop()方法執(zhí)行。
這種生命期函數(shù)調(diào)用序列允許你從一個(gè)activity到另一個(gè)的信息轉(zhuǎn)換。例如,如果你必須寫(xiě)入一個(gè)數(shù)據(jù)庫(kù),當(dāng)?shù)谝粋€(gè)activity stop,以便讓下一個(gè)activity能讀它,那么你應(yīng)該寫(xiě)入數(shù)據(jù)庫(kù)在onPause()而不是onStop()。
- Android Activity與Intent詳解及示例代碼
- Android開(kāi)發(fā)之a(chǎn)ctivity的生命周期詳解
- Android利用Intent啟動(dòng)和關(guān)閉Activity
- Android使用Messenger實(shí)現(xiàn)service與activity交互
- Android開(kāi)發(fā)中Activity的生命周期及加載模式詳解
- Android開(kāi)發(fā)中Activity創(chuàng)建跳轉(zhuǎn)及傳值的方法
- Android 啟動(dòng)activity的4種方式及打開(kāi)其他應(yīng)用的activity的坑
- Android學(xué)習(xí)小結(jié)之Activity保存和恢復(fù)狀態(tài)
相關(guān)文章
Android入門(mén)之日歷選擇與時(shí)間選擇組件的使用
這篇文章主要為大家詳細(xì)介紹了Android中TimePicker時(shí)間選擇與DatePicker日期選擇組件的使用方法,文中的示例代碼講解詳細(xì),需要的朋友可以參考下2022-11-11Android自定義評(píng)分控件的完整實(shí)例
在Android開(kāi)發(fā)中,我們經(jīng)常會(huì)用到對(duì)商家或者商品的評(píng)價(jià),運(yùn)用星星進(jìn)行打分,下面這篇文章主要給大家介紹了關(guān)于Android自定義評(píng)分控件的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05Android編輯框EditText與焦點(diǎn)變更監(jiān)視器及文本變化監(jiān)視器實(shí)現(xiàn)流程詳解
這篇文章主要介紹了Android編輯框EditText與焦點(diǎn)變更監(jiān)視器及文本變化監(jiān)視器實(shí)現(xiàn)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09Flutter中如何加載并預(yù)覽本地的html文件的方法
這篇文章主要介紹了Flutter中如何加載并預(yù)覽本地的html文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Android studio保存logcat日志到本地的操作
這篇文章主要介紹了Android studio保存logcat日志到本地的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Android中判斷是否聯(lián)網(wǎng)實(shí)現(xiàn)代碼
這篇文章主要介紹了Android中判斷是否聯(lián)網(wǎng)實(shí)現(xiàn)代碼,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06Android編程實(shí)現(xiàn)滑動(dòng)按鈕功能詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)滑動(dòng)按鈕功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android實(shí)現(xiàn)滑動(dòng)按鈕的功能、布局及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-02-02Android實(shí)現(xiàn)EditText中添加和刪除bitmap的方法
這篇文章主要介紹了Android實(shí)現(xiàn)EditText中添加和刪除bitmap的方法,實(shí)例分析了Android中EditText控件的bitmap操作技巧,需要的朋友可以參考下2016-01-01