欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開(kāi)發(fā)之Activity詳解

 更新時(shí)間:2016年06月03日 12:05:15   作者:Tekkaman  
本文是翻譯的官方文檔的內(nèi)容,看起來(lái)可能會(huì)有些生硬,但是內(nèi)容很有用,給大家一個(gè)參考,希望對(duì)大家學(xué)習(xí)有所幫助。

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>元素的子元素。例如:

http://img.jbzj.com/file_images/article/201606/201606031205195.png

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è)樣子。

http://img.jbzj.com/file_images/article/201606/201606031205196.png

  <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:

http://img.jbzj.com/file_images/article/201606/201606031205197.png

  可是,你的應(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: 

http://img.jbzj.com/file_images/article/201606/201606031205198.png

  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é)果:

http://img.jbzj.com/file_images/article/201606/201606031205209.png

  這個(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ù):

http://img.jbzj.com/file_images/article/201606/2016060312082710.png

  注意:你的這些生命周期函數(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ù)。

http://img.jbzj.com/file_images/article/201606/2016060312082711.png

  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.

http://img.jbzj.com/file_images/article/201606/2016060312082712.png 

  因?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í)候。

http://img.jbzj.com/file_images/article/201606/2016060312082713.png

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()。

相關(guān)文章

最新評(píng)論