https://developer.android.google.cn/guide/components/activities/intro-activities.html#java --翻譯水平有限,歡迎指正html
Activity類是Android應用程序的一個關鍵組件,activities啓動和之間的組合是平臺應用模型的一個基本部分。和應用程序經過main()方法啓動的編程範式不一樣,Android系統經過調用對應於activity生命週期的特定階段的特定回調方法來啓動activity實例中的代碼。java
這個文檔介紹了Activity的概念,而後提供了一些關於如何使用它們的輕量級指導。android
移動應用程序體驗與桌面應用程序體驗不一樣之處在於用戶與移動應用程序的交互並不老是在同一個地方開始。相反,用戶的旅程一般是不肯定的。例如,若是你從主屏幕打開一個電子郵件應用程序,你可能會看到一個電子郵件列表。相比之下,若是你使用的是社交媒體應用程序,而後啓動你的電子郵件應用程序,你可能會直接進入電子郵件應用程序用來撰寫電子郵件的屏幕。數據庫
Activity類的設計目的是爲了實現這個模式。當一個應用程序調用另外一個應用程序時,調用應用程序會調用另外一個應用程序中的某個activity,而不是做爲一個原子總體來調用應用程序。這樣,activity就成爲應用程序與用戶交互的入口點。實現activity類的子類來得到activity。編程
activity提供了應用程序繪製UI的窗口。這個窗口一般會填充屏幕,但可能比屏幕小,並在其餘窗口上浮動。一般,一個activity在應用程序中實現一個屏幕,例如,一個應用程序的一個activity可能實現一個偏好屏幕,而另外一個activity實現一個選擇的照片屏幕。瀏覽器
大多數應用程序包含多個屏幕,這意味着它們包含多個activity。一般,應用程序中的一個activity被指定爲main activity,這是用戶啓動應用程序時出現的第一個屏幕,而後每一個activity均可以啓動另外一個activity,以執行不一樣的操做。例如,一個簡單的電子郵件應用程序的main activity可能提供顯示電子郵件收件箱的屏幕。從那裏開始,main activity可能會啓動其餘activity,爲諸如寫電子郵件和打開單個電子郵件等任務提供屏幕。網絡
雖然activity能夠在應用程序中造成聚合的用戶體驗,但每一個activity都只是鬆散地綁定到其餘activity;在應用程序中,activity之間的依賴性一般是最小的,實際上,activity一般會啓動屬於其餘應用程序的activity。例如,一個瀏覽器應用程序可能啓動社交媒體應用程序的共享activity。app
要在應用程序中使用activity,必須在應用程序的manifest中註冊信息,而且必須適當地管理activity的生命週期。本文的其他部分將介紹這些主題。ide
要聲明您的activity,請打開您的manifest文件,並添加一個 <activity> 元素做爲 <application> 元素的子元素。例如: 佈局
<manifest ... > <application ... > <activity android:name=".ExampleActivity" /> ... </application ... > ... </manifest >
這個元素惟一須要的屬性是android:name,它指定activity的類名。您還能夠添加定義activity特性的屬性,如標籤、圖標或UI主題。
發佈應用程序後,不該該更改activity名稱。若是這樣作,可能會破壞一些功能,好比應用程序快捷鍵
intent filters是Android平臺的一個很是強大的特性。它們提供了基於明確的請求和隱式請求啓動activity的能力。例如,一個明確的請求可能會告訴系統「在Gmail應用程序中啓動發送郵件activity」。相比之下,當系統UI詢問用戶在執行任務時使用哪一個應用程序時,隱式請求告訴系統「在任何能夠完成任務的activity中啓動發送電子郵件屏幕」。這就是intent filters在起做用。
經過在 <activity>元素中聲明 <intent-filter>屬性,您能夠利用這個特性。該元素的定義包括<action>元素和,可選地一個<category> 元素和/或 <data> 元素。這些元素結合在一塊兒,指定您的activity能夠響應的intent類型。例如,下面的代碼片斷展現瞭如何配置發送文本數據的activity,並接收來自其餘activity的請求:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity>
在本例中, <action> 元素指定該activity發送數據。聲明 <category>元素爲 DEFAULT
,使activity可以接收啓動請求。<data>元素指定此activity能夠發送的數據類型。下面的代碼片斷展現瞭如何調用上面描述的activity:
// Create the text message with a string Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.setType("text/plain"); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); // Start the activity startActivity(sendIntent);
若是你想讓你的應用程序是獨立的,不容許其餘應用程序激活它的activity,你不須要任何其餘 intent filters。您不但願向其餘應用程序提供的activity應該沒有intent filters,您可使用明確的 intents來啓動它們。
您可使用manifest的 <activity>
標記來控制哪些應用程序能夠啓動特定的activity。除非兩個activity在其manifest中具備相同的權限,不然父activity不能啓動子activity。若是您爲特定的activity聲明一個 <uses-permission>
元素,那麼調用activity必須有一個匹配的 <uses-permission>
元素。
例如,若是你的應用程序想要使用一個名爲SocialApp的虛擬應用程序在社交媒體上分享一個帖子,SocialApp自己必須定義一個該應用程序必須擁有的權限:
<manifest> <activity android:name="...." android:permission=」com.google.socialapp.permission.SHARE_POST」 />
而後,要被容許調用SocialApp,你的應用程序必須匹配SocialApp的清單上的權限集:
<manifest> <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" /> </manifest>
在activity聲明週期中,一個activity要通過若干狀態。您使用一系列回調來處理狀態間的轉換。下面的部分將介紹這些回調。
您必須實現這個回調,該回調在系統建立activity時觸發。您的實現應該初始化activity的基本組件:例如,應用程序應該建立視圖並將數據綁定到這裏的列表。最重要的是,在這裏必須調用setContentView()來定義activity的用戶界面的佈局。
當onCreate()完成時,下一個回調老是onStart()。
當onCreate()退出時,activity進入Started狀態,activity對用戶可見。這個回調包含了activity用於進入前臺並進行交互的最後準備工做。
系統在activity開始與用戶交互以前調用這個回調。此時,activity位於activity堆棧的頂部,並捕獲全部用戶輸入。大多數應用程序的核心功能都是在onResume()方法中實現的。
當activity失去焦點並進入Paused 狀態時,系統調用onPause()。例如,當用戶點擊Back或Recents按鈕時,就會出現這種狀態。當系統爲您的activity調用onPause()時,技術上意味着您的activity仍然部分可見,但大多數狀況下是指用戶將離開activity,activity將很快進入Stopped狀態或Resumed狀態。
您不該該使用onPause()來保存應用程序或用戶數據、進行網絡調用或執行數據庫事務。
onPause()完成執行後,下一個回調要麼是onStop(),要麼是onResume(),這取決於activity進入暫停狀態後發生的狀況。
當activity再也不對用戶可見時,系統調用onStop()。這可能會發生,由於activity正在被銷燬,一個新的activity正在啓動,或者一個現有的activity正在進入一個 Resumed 狀態,而且正在覆蓋中止的activity。在全部這些狀況下,中止的activity都再也不可見。
若是該activity返回與用戶交互,系統調用的下一個回調是onRestart(),或者若是該activity徹底終止,則是onDestroy(),
當 Stopped 狀態的activity即將從新啓動時,系統調用此回調。onRestart()從中止activity的時候恢復activity狀態。
系統在activity被銷燬以前調用這個回調。