安卓翻译—Activies
一個Activity是提供用戶交互的界面來做某些事情得一個應用組件,例如打電話,照片,發送郵件,或者看地圖。每個activity都被給出一個窗口來刻畫用戶接口。這個窗口一般都是填充了整個屏幕,但是也可能會比屏幕更小,浮動與其它窗口的頂部。
一個應用經常是由幾個寬松地綁定在一起的幾個activities組成的。一般來說,應用中的一個activity被指定作為‘main’activity,當打開應用的時候首先呈現個用戶。每個activity都能夠啟動其它的activity來執行不同的行為。每次一個新activity啟動時,前一個activity被停止,但是系統將這個activity保存到棧里面。當一個新activity啟動時,它被壓進棧頂并且取得用戶焦點。返回棧遵循“后進先出的”棧基本機制,因此,當用戶使用完當前activity時并且按下返回鍵,它被從棧中取出)并被銷毀(,然后前一個activity被重新呈現。
當一個activity因為一個新的activity啟動被停止時,它是通過activity的生命循環回調函數來被通知這種狀態的改變。這兒有幾種一個activity可能接受的回收函數,由于在它的狀態中的一種變化——不論是系統創建它,停止它,重新啟動它,或者銷毀它——和每次回收都給你提供了一個執行最適那種狀態變化的工作的機會。例如,當停止的時候,,你的activity必須釋放任何大對象,譬如網絡或者數據庫連接。當activity重新呈現時,你能夠重新請求必須資源和恢復被打斷的動作。這些狀態事件是activity生命循環中的所有部分。
創建一個Activity
為了創建一個activity,你必須創建一個Activity的子類(或者它的一個已經存在的子類)。在你的子類中,你需要實現回收函數,當activity事物出于它的生命循環不同狀態之間時,系統調用他們,例如,一個activity被創建,停止,恢復,或者銷毀。兩個最重要的回收函數是:
onCreate():
你必須實現這個函數。當創建activity時系統會調用它。在你的實現當中,你應該初始化activity的基本組件。最重要的是,這是你必須調用setContentView()來定影activity的用戶界面布局的地方。
onPause():
系統調用這個函數來作為用戶離開activity的指示(盡管這不總意味著activity被銷毀掉)。(后面的翻譯不過來)
你應該還需要用到幾種其它的生存循環回收函數來提供一個流暢的用戶體驗,在activities和處理意外的引起activity停止甚至銷毀的中斷之間。
實現用戶界面
views的層級提供了activity的用戶界面——由View 類衍生的對象。每個視圖都控制著在activity中的一個特定的矩形區域,并且能對用戶的交互做出反應。例如,一個視圖可能是一個按鈕,當用戶觸摸的時候啟動一個行為。
安卓提供了一些已經準備好的視圖使你能夠用來設計和組織你的布局。“widgets”是能夠給屏幕提供可視的(還有交互式的)元素,例如,按鈕,復選框,或者僅僅是張圖片。
laylouts是來源于視圖組的視圖,視圖組為它的子類提供一個獨一無二的布局類型,例如,線性布局,表格布局,或者相對布局。你也能夠將View和ViewGroup劃入子集來創建自己的小部件和布局,并也將它們應用到activity布局中。
用視圖定義一個布局最常用的方式是在應用資源中包含進一個XML布局文件。這種方式下,你能夠將用戶界面的設計維護與定義activity的行為的源代碼相分離。你能夠通過使用setContentView()來設置布局的UI,為布局傳遞資源ID。然而,你也能夠在你的activity代碼中創建新的視圖,和通過向ViewGroup中插入新View來建立新的視圖金字塔,然后通過將根視圖組傳遞給setContentView()來使用那個layout。
在manifest中聲明activity
你必須在manifest文件中聲明activity為了使系統能夠獲取它。聲明activity時,打開manifest文件,在其中增加一個<activity>作為<application>標簽的子元素。例如:
<manifest ... ><application ... ><activity android:name=".ExampleActivity" />...</application ... >... </manifest > 這里也有幾個其他的屬性是你可以包含進這個標簽里的,為了定義activity像這樣的特性,label,icon,或者一個來設計activityUI的主題。android:name屬性是唯一被要求的屬性——它指定了activity的類名。一旦發布了應用,你就不能更改它的名字了,因為如果你這樣做的話,你可能會破壞一些功能,例如應用的快捷方式。
使用intent過濾器
<activity>標簽也能指定不同的intent過濾器——使用<intent-filter>標簽——為了聲明其它應用組件怎樣可能激活它。
當你用Android SDK工具去創建一個新應用的時候,這個工具為你創建的根activity會自動包含進一個intent過濾器,聲明activity對“main”行為做出回應,并且應該放置一個“launcher”分類。intent過濾器看起來像這樣:
<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>標簽指明了這是指向應用的主入口。<category>標簽指明了這個activity應該被放置在系統應用啟動器里(為了允許用戶啟動這個activity)。如果你打算將你的應用獨立,并且不允許其他應用激活它的activity,那么你不需要任何其它的intent過濾器。僅僅有一個activity有'main"行為和"launcher"分類,就如前一個例子中的一樣。你打算對其它應用隱藏的activity應該沒有intent過濾器,你可以用明確的intents來啟動它們(下面的章節將要討論)。
然而,如果你想讓你的activity對由其它應用發出的模糊的intent做出回應,那么你必須為你的activity定義額外的intent過濾器。對每種你想要做出響應的intent,就必須包含一個里面包含有<action>標簽的<intent-filter>,可選的有一個<category>或者一個<data>標簽。這些標簽指明了你的activity能夠響應的intent類型。
啟動一個Activity
你能夠通過調用startActivity()來啟動其它的activity,給它傳遞一個描述你想要啟動的activity類型的intent。這個intent指明了你想要啟動的特定的activity或者描述了想要執行的行為類型(系統為你選擇合適的activity,甚至能夠從不同的應用中選擇)。一個intent也能攜帶微量的能夠要啟動的activity使用的數據。
Intent intent = new Intent(this, SignInActivity.class); startActivity(intent); 然而,你的應用也可能想要執行一些行為,例如,發送郵件,短信,或者狀態更新,使用從activity中來的數據。在這種情況下,你的應用可能沒有執行這種行為的activity,因此你能利用設備上其他能夠執行這種動作的activity來代替。這就是intent的價值所在——你能夠創建一個intent來描述想要執行的動作,然后系統會從其它的應用中來啟動合適的activity。如果這里有多個能夠處理intent的activity,那么用戶可以選擇一個來使用。例如,如果你想允許用戶發送一封郵件,你能夠創建一個類似下面的intent: Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent); 額外加進intent的EXTRA_EMAIL是郵件應該發送地方的地址的字符串。當一個應用對這個intent做出響應,它會讀取在extra中的字符串并將它放到郵件收件人的那一欄。在這種情況下,郵件應用的activity啟動并且當用戶使用完畢后,你的activity會恢復。
啟動有反饋的activity
有時,你可能想從你啟動的activity中得到一個結果。在那種情況下,通過調用startActivityResult()(代替startActivity())來啟動activity。為了接收從后來的activity中的結果,需要實現onActivityResult()回收方法。當后來的activity結束后,它會在Intent中返回一個結果給你的onActivityResult()方法。
例如,你也許想讓用戶選取通訊錄中的一個,因此你的activity需要對通訊錄中的信息做些工作。這兒是你怎樣能創建一個這樣的intent和處理結果:
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...}} } 這個例子展示了在你的onActivityResult()方法中應該使用的基本邏輯來處理activity結果。第一個參數檢查了請求是否成功——如果成功,resultCode值為RESULT_OK——不論結果正在響應的請求是否已知——在這種情況下,requestCode與startActivityForResult()的第二個參數相匹配。從這里,代碼處理通過查詢Intent中返回的數據來處理activity結果(數據參數)。期間發生的是,ContentResolver執行一次查詢通過content provider,然后返回一個允許數據被讀取的游標(, which returns a?Cursor?that allows the queried data to be read.)。
關閉一個Activity
你能通過調用它的finish()方法來關閉它。你也能通過調用finishActivity()來關閉你之前啟動的一個分離的activity。
注意:在大部分情況下,你不應該使用這些方法來結束一個activity。就如在下面的章節中討論的關于activity生命循環的章節中,安卓系統為你來管理activity的生命,因此你不需要結束你的activity。調用這些方法,可能會不好地影響預期的用戶體驗,僅僅在你絕對不想讓用戶返回到這個activity實例上才使用它們。
管理activity生命循環
通過實現回收函數來管理activity的生命循環對開發一個強壯靈活的應用來說是重要的。activity的生命周期是被它與其它的activities,它的任務和返回棧直接影響的。
一個activity能在另外的三種狀態下生存:
恢復:
activity在屏幕的最上方并且有用戶焦點(這個狀態在有時候也歸做運行時)。
暫停:
另外一個activity在最前面并且有用戶焦點,但是這一個仍然可視。這是,另外的activity在這個的最上面可視,并且那個activity部分透明或者沒有覆蓋全部屏幕。一個被暫停了的activity是確確實實地活著(Activity對象保存在記憶中,它維持著所有的狀態和成員信息,依然依附于窗口管理器),但是在極端的低內存情況下會被殺死。
停止:
activity被另外的activity完全掩蓋(activity現在是在后臺)。一個停止了的activity是依然存在的(Activity對象保存在內存中,它保留著所有狀態和成員信息,但是不依附于窗口管理器)。然而,它不再對用戶可見,并且當內存需要用在其它地方的時候它會被殺死。
如果一個activity被暫停或者停止,系統能夠通過請求它結束(調用它的finis()方法)或者僅僅殺死它的進程來將它從內存中取出。當activity被重新打開(在被結束后或者殺死后),它必須重新創建一遍。
實現生命周期回調函數
當一個activity轉換成并且不是上面所述的狀態,它會被各種回調函數通知。所有的回調函數都是當activity狀態時你能夠重寫來做合適工作的掛鉤。接下來的簡要activity包含了每個基本的生命周期方法:
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.} } 注意:你的這些生命周期方法的實現必須總是調用超類實現在做任何工作之前,就如上面的例子中展示的。
合起來,這些方法定義了一個activity的所有生命周期。通過實現這些方法,你能夠在activity生命周期中監控三個嵌套的循環:
?activity的整個生命發生在對onCreate()和onDestory()的調用之間。你的activity應該在onCreate()中執行全局狀態的設置(例如定義布局),和釋放所有保存的資源在onDestory()中。例如,如果你的activity有一個線程運行在后臺從網絡中下載數據,它可能在onCreate()中創建那個線程,然后在onDestory()中停止線程。
activity的可見生命發生在onStart()和onStop()的調用之間。在這個時段內,用戶能在屏幕上看到activity,還能與之交互。例如,onStop()當一個新的activity啟動時被調用,
這個就不再可見。在這兩個方法之間,你能夠保存這些需要將activity展示給用戶看的資源。例如,你能在onStart()中注冊一個BroadcastReceiver來監控影像UI的變化,在onStop()中注銷它當用戶不再看你呈現的時候。系統可能會在activity的整個生命周期中調用onStart()和onStop()多次,因為activity可以在對用戶可見和隱藏之間選擇。
activity的前臺生命發生在onResume()和onPause()的調用之間。在這個時段內,這個activity在屏幕上其它的activities之前,并且有用戶的輸入焦點。一個activity能平凡地轉換成和轉出前臺——例如,onPause()當設備休眠或者當一個對話框出現時被調用。因為這個狀態能經常轉換,在這兩個方法中的代碼應該盡量的少來為了避免緩慢的轉換時用戶等待。
標簽為“使用后是否能殺死”的列指明了系統是否能殺死正在托管activity的進程在方法返回之后的任意時間內,不再執行activity的代碼。三個方法標記為 是:(onPause(),onStop(),onDestory())。因為onPause()是三個方法中的第一個,一旦activity被創建,onPasue()是在進程被殺死之前的保證被調用的最后一個方法——如果系統必須在緊急情況下恢復內存,那么onStop 和 onDestory()可能沒被調用。因此,你應該用onPause()來將重要的永久數據(例如,用戶編輯)存儲起來。然而,你應該有選擇性的保存信息,在onPause(),因為在這個方法任何阻塞的程序可能阻塞向下一個activity的轉變和變慢用戶體驗。
在可被殺死的那一列標記為 NO的方法避免在它們被調用的時候沙溪正在托管activity的進程。因此,一個activity在從onPause()返回到onResume()的時間段內是可被殺死的。直到onPause()被再次調用和返回的時候是不可被殺死的。
注意:在表一中沒有被標記為可殺死的activity仍然可被系統殺死——但是這僅發生在極端的沒有其他援助的情況下。當一個activity可被殺死的時候的會在 Processes and Threading中討論。
保存activity狀態
管理activity生命周期的介紹明確地提到了當一個activity被暫停或者停止的時候,activity的狀態是被保存的。這是真的,因為activity對象仍然存在于內存中當它被暫停或停止的時候——所有關于它的成員的信息和當前狀態是仍然存在的。因此,任何用戶對activity做出的變化被保留著以至于當activity返回到前臺的時候(當它恢復的時候),這些變化仍然原封不動。
然而,當系統為了恢復內存銷毀一個activity時,activity對象也被銷毀掉,因此系統不能簡單地恢復它原先的狀態。相反,系統必須重新創建activity對象如果用戶導航返回到它的時。用于缺意識不到系統銷毀了它又重新創建了它,因此可能期望activity還是原先的樣子。在這種情況下,你能確保關于activity狀態的重要信息通過實現一個附加的回收函數保存,這個方法允許你保存關于你的activity狀態的信息:onSaveInstanceState()。
系統調用onSaveInstanceState()在確認activity可被銷毀之前。系統傳遞一個Bundle給這個方法,你能使用類似putString()和inPut()的方法來以名稱—值對的方式來保存關于activity的狀態信息。然后,如果系統殺死你的應用進程,用戶導航會你的activity,系統重新創建activity并且將Bundle傳遞給onCreate()和onRestoreInstanceState()。使用這些方法中的一個,你能夠從Bundle中提取保存的狀態,重新存儲activity狀態。如果沒有新的狀態信息要存儲,那么Bundle給你傳遞null值(當activity第一次被創建的情況)。
注意:onSaveInstanceState()在activity被銷毀前被調用是不確定的,因為也有它不需要保存信息的情況(例如,當用戶使用返回鍵的時候,因為用戶很明確地關閉了activity)。如果系統調用了onSaveInstanceState(),它發生在onStop()之前和可能發生在onPause()之前。
然而,即使你不做任何事情并且不實現onSaveInstanceState(),activity的一些狀態會被activity類的默認onSaveInstanceState()實現來保存。特別的是,默認實現調用為了在布局里的每個視圖調用類似的onSaveInstanceState()方法,這樣允許每個視圖提供關于它自己應該保存的信息。幾乎在安卓框架中的每個小部件都是合適地實現了這個方法,一次任何可見的UI改變都自動地保存和存儲當activity被重新創建的時候。例如,EditText小部件保存了用戶輸入的任何文本,復選框小部件保存了它是否被選擇過。你需要做的唯一工作是為每個你想保存的狀態的小部件提供一個獨一無二的ID(使用android:id)。如果一個小部件沒有ID,那么系統不能保存它的狀態。
盡管onSaveInstanceState()的默認實現保存了關于關于你activity UI的有用信息,你仍然可能需要重載它來保存額外的信息。例如,你可能需要保存改變的成員值在activity的生命期間(可能重新保存在UI中的值相關,但是成員持有的那些UI值不被重新保存,默認情況下)。
因為onSaveInstanceState()的默認實現幫助保存UI的狀態,如果你重載這個方法為了保存額外信息,你應該總是在做任何工作前來調用onSaveInstanceState()的超類。同樣地,如果你重載它的話,你也應該調用onSaveInstanceState()的超類實現,因此默認實現能重新保存視圖狀態 。
注意:因為onSaveInstanceState()不一定會被調用,你應該使用它僅僅記錄activity短暫的狀態(UI的狀態)——你應該從來不用它保存永久數據。相反,你應該用onPause()來保存持久數據(像應該保存在數據庫中的數據)當用戶離開activity的時候。
一個測試我們的應用重新保存它的狀態的能力好的方式是簡單地旋轉設備,這樣屏幕的方向就改變了。當屏幕方向改變時,系統會摧毀和重新創建activity來為新的屏幕配置應用可能存在的可選擇的資源。除了這個原因,當activity被重新創建時,它重新存儲它的狀態是非常重要的,因為用戶當使用應用時經常轉動屏幕。
處理配置改變
一些設備的配置能在運行時改變(例如屏幕方向,鍵盤可用性,和語言)。當類似的改變發生時,安卓重新創建正在運行的activity(系統調用onDestory(),然后直接調用onCreate())。這個行為被設計出來為了幫助應用采用新的配置,通過用你提供的可選擇的資源來自動重新裝載應用(例如,不同的布局對不同屏幕方向和尺寸)。
如果你正確地設計activity處理因為屏幕改變的的重新開始,并且重新存儲像上面所描述的activity狀態,你的應用將會相對于其他在activity生命周期中意料之外的事件更有彈性。
處理想這樣的重新開始的最好的方式是使用onSaveInstanceState()和onStoreInstanceState()(或者onCreate())保存和重新存儲你的activity的狀態,像之前章節中討論的。
協調的activity
當一個activity啟動另外一個時,它們兩個都經歷了生命周期轉換。第一個activity暫停和停止(但是,如果它在前臺依然可見就不會停止),然而另外一個activity被創建。在這些activity共享保存在硬盤或者其它地方上的數據時,理解第一個activity在第二個被創建前沒有完全停止是非常重要的。當然啦,啟動第二個activity的進程重疊了停止第一個activity的進程。
生命周期回調的順序是被定義好了的,特別是當兩個activity在同一個進程并且一個正在啟動另外一個。這里是當Activity A啟動Activity B時發生的操作順序:
1. Activity A的onPause()方法執行。
2. Activity B 的onCreate(),onStart(),onResume方法順序執行。(Activity B 現在有著用戶焦點)
3.然后,如果Activity A不再屏幕上可見,它的onStop()方法執行。
這些可預料的生命周期回調允許你管理從一個activity到另外一個過渡信息。例如,如果當第一個activity停止的時你必須寫入數據庫以便后面的activity能夠讀取它,那么你應該在onPause()期間寫入數據庫而不是在onStop()。
(老子可翻譯完一篇了,翻譯著還真難,好多句子都不通順,再接再厲)
總結
以上是生活随笔為你收集整理的安卓翻译—Activies的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ERP词汇中英文对照
- 下一篇: Fineplus 1.1(QQ完美助手)