安卓翻译—Activies
一個(gè)Activity是提供用戶交互的界面來(lái)做某些事情得一個(gè)應(yīng)用組件,例如打電話,照片,發(fā)送郵件,或者看地圖。每個(gè)activity都被給出一個(gè)窗口來(lái)刻畫(huà)用戶接口。這個(gè)窗口一般都是填充了整個(gè)屏幕,但是也可能會(huì)比屏幕更小,浮動(dòng)與其它窗口的頂部。
一個(gè)應(yīng)用經(jīng)常是由幾個(gè)寬松地綁定在一起的幾個(gè)activities組成的。一般來(lái)說(shuō),應(yīng)用中的一個(gè)activity被指定作為‘main’activity,當(dāng)打開(kāi)應(yīng)用的時(shí)候首先呈現(xiàn)個(gè)用戶。每個(gè)activity都能夠啟動(dòng)其它的activity來(lái)執(zhí)行不同的行為。每次一個(gè)新activity啟動(dòng)時(shí),前一個(gè)activity被停止,但是系統(tǒng)將這個(gè)activity保存到棧里面。當(dāng)一個(gè)新activity啟動(dòng)時(shí),它被壓進(jìn)棧頂并且取得用戶焦點(diǎn)。返回棧遵循“后進(jìn)先出的”棧基本機(jī)制,因此,當(dāng)用戶使用完當(dāng)前activity時(shí)并且按下返回鍵,它被從棧中取出)并被銷(xiāo)毀(,然后前一個(gè)activity被重新呈現(xiàn)。
當(dāng)一個(gè)activity因?yàn)橐粋€(gè)新的activity啟動(dòng)被停止時(shí),它是通過(guò)activity的生命循環(huán)回調(diào)函數(shù)來(lái)被通知這種狀態(tài)的改變。這兒有幾種一個(gè)activity可能接受的回收函數(shù),由于在它的狀態(tài)中的一種變化——不論是系統(tǒng)創(chuàng)建它,停止它,重新啟動(dòng)它,或者銷(xiāo)毀它——和每次回收都給你提供了一個(gè)執(zhí)行最適那種狀態(tài)變化的工作的機(jī)會(huì)。例如,當(dāng)停止的時(shí)候,,你的activity必須釋放任何大對(duì)象,譬如網(wǎng)絡(luò)或者數(shù)據(jù)庫(kù)連接。當(dāng)activity重新呈現(xiàn)時(shí),你能夠重新請(qǐng)求必須資源和恢復(fù)被打斷的動(dòng)作。這些狀態(tài)事件是activity生命循環(huán)中的所有部分。
創(chuàng)建一個(gè)Activity
為了創(chuàng)建一個(gè)activity,你必須創(chuàng)建一個(gè)Activity的子類(lèi)(或者它的一個(gè)已經(jīng)存在的子類(lèi))。在你的子類(lèi)中,你需要實(shí)現(xiàn)回收函數(shù),當(dāng)activity事物出于它的生命循環(huán)不同狀態(tài)之間時(shí),系統(tǒng)調(diào)用他們,例如,一個(gè)activity被創(chuàng)建,停止,恢復(fù),或者銷(xiāo)毀。兩個(gè)最重要的回收函數(shù)是:
onCreate():
你必須實(shí)現(xiàn)這個(gè)函數(shù)。當(dāng)創(chuàng)建activity時(shí)系統(tǒng)會(huì)調(diào)用它。在你的實(shí)現(xiàn)當(dāng)中,你應(yīng)該初始化activity的基本組件。最重要的是,這是你必須調(diào)用setContentView()來(lái)定影activity的用戶界面布局的地方。
onPause():
系統(tǒng)調(diào)用這個(gè)函數(shù)來(lái)作為用戶離開(kāi)activity的指示(盡管這不總意味著activity被銷(xiāo)毀掉)。(后面的翻譯不過(guò)來(lái))
你應(yīng)該還需要用到幾種其它的生存循環(huán)回收函數(shù)來(lái)提供一個(gè)流暢的用戶體驗(yàn),在activities和處理意外的引起activity停止甚至銷(xiāo)毀的中斷之間。
實(shí)現(xiàn)用戶界面
views的層級(jí)提供了activity的用戶界面——由View 類(lèi)衍生的對(duì)象。每個(gè)視圖都控制著在activity中的一個(gè)特定的矩形區(qū)域,并且能對(duì)用戶的交互做出反應(yīng)。例如,一個(gè)視圖可能是一個(gè)按鈕,當(dāng)用戶觸摸的時(shí)候啟動(dòng)一個(gè)行為。
安卓提供了一些已經(jīng)準(zhǔn)備好的視圖使你能夠用來(lái)設(shè)計(jì)和組織你的布局。“widgets”是能夠給屏幕提供可視的(還有交互式的)元素,例如,按鈕,復(fù)選框,或者僅僅是張圖片。
laylouts是來(lái)源于視圖組的視圖,視圖組為它的子類(lèi)提供一個(gè)獨(dú)一無(wú)二的布局類(lèi)型,例如,線性布局,表格布局,或者相對(duì)布局。你也能夠?qū)iew和ViewGroup劃入子集來(lái)創(chuàng)建自己的小部件和布局,并也將它們應(yīng)用到activity布局中。
用視圖定義一個(gè)布局最常用的方式是在應(yīng)用資源中包含進(jìn)一個(gè)XML布局文件。這種方式下,你能夠?qū)⒂脩艚缑娴脑O(shè)計(jì)維護(hù)與定義activity的行為的源代碼相分離。你能夠通過(guò)使用setContentView()來(lái)設(shè)置布局的UI,為布局傳遞資源ID。然而,你也能夠在你的activity代碼中創(chuàng)建新的視圖,和通過(guò)向ViewGroup中插入新View來(lái)建立新的視圖金字塔,然后通過(guò)將根視圖組傳遞給setContentView()來(lái)使用那個(gè)layout。
在manifest中聲明activity
你必須在manifest文件中聲明activity為了使系統(tǒng)能夠獲取它。聲明activity時(shí),打開(kāi)manifest文件,在其中增加一個(gè)<activity>作為<application>標(biāo)簽的子元素。例如:
<manifest ... ><application ... ><activity android:name=".ExampleActivity" />...</application ... >... </manifest > 這里也有幾個(gè)其他的屬性是你可以包含進(jìn)這個(gè)標(biāo)簽里的,為了定義activity像這樣的特性,label,icon,或者一個(gè)來(lái)設(shè)計(jì)activityUI的主題。android:name屬性是唯一被要求的屬性——它指定了activity的類(lèi)名。一旦發(fā)布了應(yīng)用,你就不能更改它的名字了,因?yàn)槿绻氵@樣做的話,你可能會(huì)破壞一些功能,例如應(yīng)用的快捷方式。
使用intent過(guò)濾器
<activity>標(biāo)簽也能指定不同的intent過(guò)濾器——使用<intent-filter>標(biāo)簽——為了聲明其它應(yīng)用組件怎樣可能激活它。
當(dāng)你用Android SDK工具去創(chuàng)建一個(gè)新應(yīng)用的時(shí)候,這個(gè)工具為你創(chuàng)建的根activity會(huì)自動(dòng)包含進(jìn)一個(gè)intent過(guò)濾器,聲明activity對(duì)“main”行為做出回應(yīng),并且應(yīng)該放置一個(gè)“l(fā)auncher”分類(lèi)。intent過(guò)濾器看起來(lái)像這樣:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter> </activity> <action>標(biāo)簽指明了這是指向應(yīng)用的主入口。<category>標(biāo)簽指明了這個(gè)activity應(yīng)該被放置在系統(tǒng)應(yīng)用啟動(dòng)器里(為了允許用戶啟動(dòng)這個(gè)activity)。如果你打算將你的應(yīng)用獨(dú)立,并且不允許其他應(yīng)用激活它的activity,那么你不需要任何其它的intent過(guò)濾器。僅僅有一個(gè)activity有'main"行為和"launcher"分類(lèi),就如前一個(gè)例子中的一樣。你打算對(duì)其它應(yīng)用隱藏的activity應(yīng)該沒(méi)有intent過(guò)濾器,你可以用明確的intents來(lái)啟動(dòng)它們(下面的章節(jié)將要討論)。
然而,如果你想讓你的activity對(duì)由其它應(yīng)用發(fā)出的模糊的intent做出回應(yīng),那么你必須為你的activity定義額外的intent過(guò)濾器。對(duì)每種你想要做出響應(yīng)的intent,就必須包含一個(gè)里面包含有<action>標(biāo)簽的<intent-filter>,可選的有一個(gè)<category>或者一個(gè)<data>標(biāo)簽。這些標(biāo)簽指明了你的activity能夠響應(yīng)的intent類(lèi)型。
啟動(dòng)一個(gè)Activity
你能夠通過(guò)調(diào)用startActivity()來(lái)啟動(dòng)其它的activity,給它傳遞一個(gè)描述你想要啟動(dòng)的activity類(lèi)型的intent。這個(gè)intent指明了你想要啟動(dòng)的特定的activity或者描述了想要執(zhí)行的行為類(lèi)型(系統(tǒng)為你選擇合適的activity,甚至能夠從不同的應(yīng)用中選擇)。一個(gè)intent也能攜帶微量的能夠要啟動(dòng)的activity使用的數(shù)據(jù)。
Intent intent = new Intent(this, SignInActivity.class); startActivity(intent); 然而,你的應(yīng)用也可能想要執(zhí)行一些行為,例如,發(fā)送郵件,短信,或者狀態(tài)更新,使用從activity中來(lái)的數(shù)據(jù)。在這種情況下,你的應(yīng)用可能沒(méi)有執(zhí)行這種行為的activity,因此你能利用設(shè)備上其他能夠執(zhí)行這種動(dòng)作的activity來(lái)代替。這就是intent的價(jià)值所在——你能夠創(chuàng)建一個(gè)intent來(lái)描述想要執(zhí)行的動(dòng)作,然后系統(tǒng)會(huì)從其它的應(yīng)用中來(lái)啟動(dòng)合適的activity。如果這里有多個(gè)能夠處理intent的activity,那么用戶可以選擇一個(gè)來(lái)使用。例如,如果你想允許用戶發(fā)送一封郵件,你能夠創(chuàng)建一個(gè)類(lèi)似下面的intent: Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent); 額外加進(jìn)intent的EXTRA_EMAIL是郵件應(yīng)該發(fā)送地方的地址的字符串。當(dāng)一個(gè)應(yīng)用對(duì)這個(gè)intent做出響應(yīng),它會(huì)讀取在extra中的字符串并將它放到郵件收件人的那一欄。在這種情況下,郵件應(yīng)用的activity啟動(dòng)并且當(dāng)用戶使用完畢后,你的activity會(huì)恢復(fù)。
啟動(dòng)有反饋的activity
有時(shí),你可能想從你啟動(dòng)的activity中得到一個(gè)結(jié)果。在那種情況下,通過(guò)調(diào)用startActivityResult()(代替startActivity())來(lái)啟動(dòng)activity。為了接收從后來(lái)的activity中的結(jié)果,需要實(shí)現(xiàn)onActivityResult()回收方法。當(dāng)后來(lái)的activity結(jié)束后,它會(huì)在Intent中返回一個(gè)結(jié)果給你的onActivityResult()方法。
例如,你也許想讓用戶選取通訊錄中的一個(gè),因此你的activity需要對(duì)通訊錄中的信息做些工作。這兒是你怎樣能創(chuàng)建一個(gè)這樣的intent和處理結(jié)果:
private void pickContact() {// Create an intent to "pick" a contact, as defined by the content provider URIIntent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);startActivityForResult(intent, PICK_CONTACT_REQUEST); }@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {// If the request went well (OK) and the request was PICK_CONTACT_REQUESTif (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {// Perform a query to the contact's content provider for the contact's nameCursor cursor = getContentResolver().query(data.getData(),new String[] {Contacts.DISPLAY_NAME}, null, null, null);if (cursor.moveToFirst()) { // True if the cursor is not emptyint columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);String name = cursor.getString(columnIndex);// Do something with the selected contact's name...}} } 這個(gè)例子展示了在你的onActivityResult()方法中應(yīng)該使用的基本邏輯來(lái)處理activity結(jié)果。第一個(gè)參數(shù)檢查了請(qǐng)求是否成功——如果成功,resultCode值為RESULT_OK——不論結(jié)果正在響應(yīng)的請(qǐng)求是否已知——在這種情況下,requestCode與startActivityForResult()的第二個(gè)參數(shù)相匹配。從這里,代碼處理通過(guò)查詢(xún)Intent中返回的數(shù)據(jù)來(lái)處理activity結(jié)果(數(shù)據(jù)參數(shù))。期間發(fā)生的是,ContentResolver執(zhí)行一次查詢(xún)通過(guò)content provider,然后返回一個(gè)允許數(shù)據(jù)被讀取的游標(biāo)(, which returns a?Cursor?that allows the queried data to be read.)。
關(guān)閉一個(gè)Activity
你能通過(guò)調(diào)用它的finish()方法來(lái)關(guān)閉它。你也能通過(guò)調(diào)用finishActivity()來(lái)關(guān)閉你之前啟動(dòng)的一個(gè)分離的activity。
注意:在大部分情況下,你不應(yīng)該使用這些方法來(lái)結(jié)束一個(gè)activity。就如在下面的章節(jié)中討論的關(guān)于activity生命循環(huán)的章節(jié)中,安卓系統(tǒng)為你來(lái)管理activity的生命,因此你不需要結(jié)束你的activity。調(diào)用這些方法,可能會(huì)不好地影響預(yù)期的用戶體驗(yàn),僅僅在你絕對(duì)不想讓用戶返回到這個(gè)activity實(shí)例上才使用它們。
管理activity生命循環(huán)
通過(guò)實(shí)現(xiàn)回收函數(shù)來(lái)管理activity的生命循環(huán)對(duì)開(kāi)發(fā)一個(gè)強(qiáng)壯靈活的應(yīng)用來(lái)說(shuō)是重要的。activity的生命周期是被它與其它的activities,它的任務(wù)和返回棧直接影響的。
一個(gè)activity能在另外的三種狀態(tài)下生存:
恢復(fù):
activity在屏幕的最上方并且有用戶焦點(diǎn)(這個(gè)狀態(tài)在有時(shí)候也歸做運(yùn)行時(shí))。
暫停:
另外一個(gè)activity在最前面并且有用戶焦點(diǎn),但是這一個(gè)仍然可視。這是,另外的activity在這個(gè)的最上面可視,并且那個(gè)activity部分透明或者沒(méi)有覆蓋全部屏幕。一個(gè)被暫停了的activity是確確實(shí)實(shí)地活著(Activity對(duì)象保存在記憶中,它維持著所有的狀態(tài)和成員信息,依然依附于窗口管理器),但是在極端的低內(nèi)存情況下會(huì)被殺死。
停止:
activity被另外的activity完全掩蓋(activity現(xiàn)在是在后臺(tái))。一個(gè)停止了的activity是依然存在的(Activity對(duì)象保存在內(nèi)存中,它保留著所有狀態(tài)和成員信息,但是不依附于窗口管理器)。然而,它不再對(duì)用戶可見(jiàn),并且當(dāng)內(nèi)存需要用在其它地方的時(shí)候它會(huì)被殺死。
如果一個(gè)activity被暫停或者停止,系統(tǒng)能夠通過(guò)請(qǐng)求它結(jié)束(調(diào)用它的finis()方法)或者僅僅殺死它的進(jìn)程來(lái)將它從內(nèi)存中取出。當(dāng)activity被重新打開(kāi)(在被結(jié)束后或者殺死后),它必須重新創(chuàng)建一遍。
實(shí)現(xiàn)生命周期回調(diào)函數(shù)
當(dāng)一個(gè)activity轉(zhuǎn)換成并且不是上面所述的狀態(tài),它會(huì)被各種回調(diào)函數(shù)通知。所有的回調(diào)函數(shù)都是當(dāng)activity狀態(tài)時(shí)你能夠重寫(xiě)來(lái)做合適工作的掛鉤。接下來(lái)的簡(jiǎn)要activity包含了每個(gè)基本的生命周期方法:
public class ExampleActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// The activity is being created.}@Overrideprotected void onStart() {super.onStart();// The activity is about to become visible.}@Overrideprotected void onResume() {super.onResume();// The activity has become visible (it is now "resumed").}@Overrideprotected void onPause() {super.onPause();// Another activity is taking focus (this activity is about to be "paused").}@Overrideprotected void onStop() {super.onStop();// The activity is no longer visible (it is now "stopped")}@Overrideprotected void onDestroy() {super.onDestroy();// The activity is about to be destroyed.} } 注意:你的這些生命周期方法的實(shí)現(xiàn)必須總是調(diào)用超類(lèi)實(shí)現(xiàn)在做任何工作之前,就如上面的例子中展示的。
合起來(lái),這些方法定義了一個(gè)activity的所有生命周期。通過(guò)實(shí)現(xiàn)這些方法,你能夠在activity生命周期中監(jiān)控三個(gè)嵌套的循環(huán):
?activity的整個(gè)生命發(fā)生在對(duì)onCreate()和onDestory()的調(diào)用之間。你的activity應(yīng)該在onCreate()中執(zhí)行全局狀態(tài)的設(shè)置(例如定義布局),和釋放所有保存的資源在onDestory()中。例如,如果你的activity有一個(gè)線程運(yùn)行在后臺(tái)從網(wǎng)絡(luò)中下載數(shù)據(jù),它可能在onCreate()中創(chuàng)建那個(gè)線程,然后在onDestory()中停止線程。
activity的可見(jiàn)生命發(fā)生在onStart()和onStop()的調(diào)用之間。在這個(gè)時(shí)段內(nèi),用戶能在屏幕上看到activity,還能與之交互。例如,onStop()當(dāng)一個(gè)新的activity啟動(dòng)時(shí)被調(diào)用,
這個(gè)就不再可見(jiàn)。在這兩個(gè)方法之間,你能夠保存這些需要將activity展示給用戶看的資源。例如,你能在onStart()中注冊(cè)一個(gè)BroadcastReceiver來(lái)監(jiān)控影像UI的變化,在onStop()中注銷(xiāo)它當(dāng)用戶不再看你呈現(xiàn)的時(shí)候。系統(tǒng)可能會(huì)在activity的整個(gè)生命周期中調(diào)用onStart()和onStop()多次,因?yàn)閍ctivity可以在對(duì)用戶可見(jiàn)和隱藏之間選擇。
activity的前臺(tái)生命發(fā)生在onResume()和onPause()的調(diào)用之間。在這個(gè)時(shí)段內(nèi),這個(gè)activity在屏幕上其它的activities之前,并且有用戶的輸入焦點(diǎn)。一個(gè)activity能平凡地轉(zhuǎn)換成和轉(zhuǎn)出前臺(tái)——例如,onPause()當(dāng)設(shè)備休眠或者當(dāng)一個(gè)對(duì)話框出現(xiàn)時(shí)被調(diào)用。因?yàn)檫@個(gè)狀態(tài)能經(jīng)常轉(zhuǎn)換,在這兩個(gè)方法中的代碼應(yīng)該盡量的少來(lái)為了避免緩慢的轉(zhuǎn)換時(shí)用戶等待。
標(biāo)簽為“使用后是否能殺死”的列指明了系統(tǒng)是否能殺死正在托管activity的進(jìn)程在方法返回之后的任意時(shí)間內(nèi),不再執(zhí)行activity的代碼。三個(gè)方法標(biāo)記為 是:(onPause(),onStop(),onDestory())。因?yàn)閛nPause()是三個(gè)方法中的第一個(gè),一旦activity被創(chuàng)建,onPasue()是在進(jìn)程被殺死之前的保證被調(diào)用的最后一個(gè)方法——如果系統(tǒng)必須在緊急情況下恢復(fù)內(nèi)存,那么onStop 和 onDestory()可能沒(méi)被調(diào)用。因此,你應(yīng)該用onPause()來(lái)將重要的永久數(shù)據(jù)(例如,用戶編輯)存儲(chǔ)起來(lái)。然而,你應(yīng)該有選擇性的保存信息,在onPause(),因?yàn)樵谶@個(gè)方法任何阻塞的程序可能阻塞向下一個(gè)activity的轉(zhuǎn)變和變慢用戶體驗(yàn)。
在可被殺死的那一列標(biāo)記為 NO的方法避免在它們被調(diào)用的時(shí)候沙溪正在托管activity的進(jìn)程。因此,一個(gè)activity在從onPause()返回到onResume()的時(shí)間段內(nèi)是可被殺死的。直到onPause()被再次調(diào)用和返回的時(shí)候是不可被殺死的。
注意:在表一中沒(méi)有被標(biāo)記為可殺死的activity仍然可被系統(tǒng)殺死——但是這僅發(fā)生在極端的沒(méi)有其他援助的情況下。當(dāng)一個(gè)activity可被殺死的時(shí)候的會(huì)在 Processes and Threading中討論。
保存activity狀態(tài)
管理activity生命周期的介紹明確地提到了當(dāng)一個(gè)activity被暫停或者停止的時(shí)候,activity的狀態(tài)是被保存的。這是真的,因?yàn)閍ctivity對(duì)象仍然存在于內(nèi)存中當(dāng)它被暫停或停止的時(shí)候——所有關(guān)于它的成員的信息和當(dāng)前狀態(tài)是仍然存在的。因此,任何用戶對(duì)activity做出的變化被保留著以至于當(dāng)activity返回到前臺(tái)的時(shí)候(當(dāng)它恢復(fù)的時(shí)候),這些變化仍然原封不動(dòng)。
然而,當(dāng)系統(tǒng)為了恢復(fù)內(nèi)存銷(xiāo)毀一個(gè)activity時(shí),activity對(duì)象也被銷(xiāo)毀掉,因此系統(tǒng)不能簡(jiǎn)單地恢復(fù)它原先的狀態(tài)。相反,系統(tǒng)必須重新創(chuàng)建activity對(duì)象如果用戶導(dǎo)航返回到它的時(shí)。用于缺意識(shí)不到系統(tǒng)銷(xiāo)毀了它又重新創(chuàng)建了它,因此可能期望activity還是原先的樣子。在這種情況下,你能確保關(guān)于activity狀態(tài)的重要信息通過(guò)實(shí)現(xiàn)一個(gè)附加的回收函數(shù)保存,這個(gè)方法允許你保存關(guān)于你的activity狀態(tài)的信息:onSaveInstanceState()。
系統(tǒng)調(diào)用onSaveInstanceState()在確認(rèn)activity可被銷(xiāo)毀之前。系統(tǒng)傳遞一個(gè)Bundle給這個(gè)方法,你能使用類(lèi)似putString()和inPut()的方法來(lái)以名稱(chēng)—值對(duì)的方式來(lái)保存關(guān)于activity的狀態(tài)信息。然后,如果系統(tǒng)殺死你的應(yīng)用進(jìn)程,用戶導(dǎo)航會(huì)你的activity,系統(tǒng)重新創(chuàng)建activity并且將Bundle傳遞給onCreate()和onRestoreInstanceState()。使用這些方法中的一個(gè),你能夠從Bundle中提取保存的狀態(tài),重新存儲(chǔ)activity狀態(tài)。如果沒(méi)有新的狀態(tài)信息要存儲(chǔ),那么Bundle給你傳遞null值(當(dāng)activity第一次被創(chuàng)建的情況)。
注意:onSaveInstanceState()在activity被銷(xiāo)毀前被調(diào)用是不確定的,因?yàn)橐灿兴恍枰4嫘畔⒌那闆r(例如,當(dāng)用戶使用返回鍵的時(shí)候,因?yàn)橛脩艉苊鞔_地關(guān)閉了activity)。如果系統(tǒng)調(diào)用了onSaveInstanceState(),它發(fā)生在onStop()之前和可能發(fā)生在onPause()之前。
然而,即使你不做任何事情并且不實(shí)現(xiàn)onSaveInstanceState(),activity的一些狀態(tài)會(huì)被activity類(lèi)的默認(rèn)onSaveInstanceState()實(shí)現(xiàn)來(lái)保存。特別的是,默認(rèn)實(shí)現(xiàn)調(diào)用為了在布局里的每個(gè)視圖調(diào)用類(lèi)似的onSaveInstanceState()方法,這樣允許每個(gè)視圖提供關(guān)于它自己應(yīng)該保存的信息。幾乎在安卓框架中的每個(gè)小部件都是合適地實(shí)現(xiàn)了這個(gè)方法,一次任何可見(jiàn)的UI改變都自動(dòng)地保存和存儲(chǔ)當(dāng)activity被重新創(chuàng)建的時(shí)候。例如,EditText小部件保存了用戶輸入的任何文本,復(fù)選框小部件保存了它是否被選擇過(guò)。你需要做的唯一工作是為每個(gè)你想保存的狀態(tài)的小部件提供一個(gè)獨(dú)一無(wú)二的ID(使用android:id)。如果一個(gè)小部件沒(méi)有ID,那么系統(tǒng)不能保存它的狀態(tài)。
盡管onSaveInstanceState()的默認(rèn)實(shí)現(xiàn)保存了關(guān)于關(guān)于你activity UI的有用信息,你仍然可能需要重載它來(lái)保存額外的信息。例如,你可能需要保存改變的成員值在activity的生命期間(可能重新保存在UI中的值相關(guān),但是成員持有的那些UI值不被重新保存,默認(rèn)情況下)。
因?yàn)閛nSaveInstanceState()的默認(rèn)實(shí)現(xiàn)幫助保存UI的狀態(tài),如果你重載這個(gè)方法為了保存額外信息,你應(yīng)該總是在做任何工作前來(lái)調(diào)用onSaveInstanceState()的超類(lèi)。同樣地,如果你重載它的話,你也應(yīng)該調(diào)用onSaveInstanceState()的超類(lèi)實(shí)現(xiàn),因此默認(rèn)實(shí)現(xiàn)能重新保存視圖狀態(tài) 。
注意:因?yàn)閛nSaveInstanceState()不一定會(huì)被調(diào)用,你應(yīng)該使用它僅僅記錄activity短暫的狀態(tài)(UI的狀態(tài))——你應(yīng)該從來(lái)不用它保存永久數(shù)據(jù)。相反,你應(yīng)該用onPause()來(lái)保存持久數(shù)據(jù)(像應(yīng)該保存在數(shù)據(jù)庫(kù)中的數(shù)據(jù))當(dāng)用戶離開(kāi)activity的時(shí)候。
一個(gè)測(cè)試我們的應(yīng)用重新保存它的狀態(tài)的能力好的方式是簡(jiǎn)單地旋轉(zhuǎn)設(shè)備,這樣屏幕的方向就改變了。當(dāng)屏幕方向改變時(shí),系統(tǒng)會(huì)摧毀和重新創(chuàng)建activity來(lái)為新的屏幕配置應(yīng)用可能存在的可選擇的資源。除了這個(gè)原因,當(dāng)activity被重新創(chuàng)建時(shí),它重新存儲(chǔ)它的狀態(tài)是非常重要的,因?yàn)橛脩舢?dāng)使用應(yīng)用時(shí)經(jīng)常轉(zhuǎn)動(dòng)屏幕。
處理配置改變
一些設(shè)備的配置能在運(yùn)行時(shí)改變(例如屏幕方向,鍵盤(pán)可用性,和語(yǔ)言)。當(dāng)類(lèi)似的改變發(fā)生時(shí),安卓重新創(chuàng)建正在運(yùn)行的activity(系統(tǒng)調(diào)用onDestory(),然后直接調(diào)用onCreate())。這個(gè)行為被設(shè)計(jì)出來(lái)為了幫助應(yīng)用采用新的配置,通過(guò)用你提供的可選擇的資源來(lái)自動(dòng)重新裝載應(yīng)用(例如,不同的布局對(duì)不同屏幕方向和尺寸)。
如果你正確地設(shè)計(jì)activity處理因?yàn)槠聊桓淖兊牡闹匦麻_(kāi)始,并且重新存儲(chǔ)像上面所描述的activity狀態(tài),你的應(yīng)用將會(huì)相對(duì)于其他在activity生命周期中意料之外的事件更有彈性。
處理想這樣的重新開(kāi)始的最好的方式是使用onSaveInstanceState()和onStoreInstanceState()(或者onCreate())保存和重新存儲(chǔ)你的activity的狀態(tài),像之前章節(jié)中討論的。
協(xié)調(diào)的activity
當(dāng)一個(gè)activity啟動(dòng)另外一個(gè)時(shí),它們兩個(gè)都經(jīng)歷了生命周期轉(zhuǎn)換。第一個(gè)activity暫停和停止(但是,如果它在前臺(tái)依然可見(jiàn)就不會(huì)停止),然而另外一個(gè)activity被創(chuàng)建。在這些activity共享保存在硬盤(pán)或者其它地方上的數(shù)據(jù)時(shí),理解第一個(gè)activity在第二個(gè)被創(chuàng)建前沒(méi)有完全停止是非常重要的。當(dāng)然啦,啟動(dòng)第二個(gè)activity的進(jìn)程重疊了停止第一個(gè)activity的進(jìn)程。
生命周期回調(diào)的順序是被定義好了的,特別是當(dāng)兩個(gè)activity在同一個(gè)進(jìn)程并且一個(gè)正在啟動(dòng)另外一個(gè)。這里是當(dāng)Activity A啟動(dòng)Activity B時(shí)發(fā)生的操作順序:
1. Activity A的onPause()方法執(zhí)行。
2. Activity B 的onCreate(),onStart(),onResume方法順序執(zhí)行。(Activity B 現(xiàn)在有著用戶焦點(diǎn))
3.然后,如果Activity A不再屏幕上可見(jiàn),它的onStop()方法執(zhí)行。
這些可預(yù)料的生命周期回調(diào)允許你管理從一個(gè)activity到另外一個(gè)過(guò)渡信息。例如,如果當(dāng)?shù)谝粋€(gè)activity停止的時(shí)你必須寫(xiě)入數(shù)據(jù)庫(kù)以便后面的activity能夠讀取它,那么你應(yīng)該在onPause()期間寫(xiě)入數(shù)據(jù)庫(kù)而不是在onStop()。
(老子可翻譯完一篇了,翻譯著還真難,好多句子都不通順,再接再厲)
總結(jié)
以上是生活随笔為你收集整理的安卓翻译—Activies的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ERP词汇中英文对照
- 下一篇: Fineplus 1.1(QQ完美助手)