Activity
類別是 Android 應用程式的重要元件,而活動的啟動和組合方式是平台應用程式模型的基本要素。不同於使用 main()
方法啟動應用程式的程式設計範例,Android 系統會叫用對應生命週期的特定階段的特定回呼方法,藉此在 Activity
例項中啟動程式碼。
本文將介紹活動的概念,並提供使用這類活動的一些簡易指南。如要進一步瞭解建構應用程式的最佳做法,請參閱「 應用程式架構指南」。
活動概念
行動應用程式的體驗與電腦版有所差異,因為使用者與應用程式的互動不一定從相同的位置開始。使用者歷程往往從非確定性開始。舉例來說,如果您在主畫面開啟電子郵件應用程式,可能會看到電子郵件清單。相較之下,如果您使用社群媒體應用程式啟動電子郵件應用程式,則可直接前往電子郵件應用程式的畫面撰寫電子郵件。
Activity
類別旨在協助執行此範例。當一個應用程式叫用另一個應用程式時,呼叫應用程式會叫用其他應用程式中的活動,而不會叫用整個應用程式。如此一來,活動可做為使用者與應用程式互動的進入點。您可將活動實作為 Activity
類別的子類別。
活動會提供應用程式繪製使用者介面的視窗。這個視窗通常會填滿螢幕,但可能小於螢幕,且浮動於其他視窗上方。一般來說,一個活動會實作應用程式中的一個畫面。舉例來說,某個應用程式的一個活動可能會實作「Preferences」畫面,而另一個活動則會實作「Select Photo」畫面。
大多數應用程式都含有多個畫面,表示這些應用程式包含多個活動。一般來說,系統會將應用程式中的一個活動指定為主要活動,這是使用者啟動應用程式時顯示的第一個畫面。接著,每項活動都可以啟動另一個活動,以便執行不同操作。例如,簡易電子郵件應用程式中的主要活動可能會提供顯示電子郵件收件匣的畫面。然後,主要活動可能會啟動其他活動,為撰寫電子郵件和開啟個別電子郵件等工作提供畫面。
雖然活動會彼此搭配運作,藉此在應用程式中形成一致的使用者體驗,但每項活動只會寬鬆地繫結到其他活動。應用程式的活動依附元件通常極少。事實上,活動通常會啟動屬於其他應用程式的活動。舉例來說,瀏覽器應用程式可能會啟動社群媒體應用程式的分享活動。
如要使用應用程式中的活動,您必須在應用程式的資訊清單中註冊活動的相關資訊,且必須妥善管理活動生命週期。本文件其他部分將介紹這些主題。
設定資訊清單
您必須在資訊清單中宣告活動及其部分屬性,應用程式才能使用活動。
宣告活動
如要宣告活動,請開啟資訊清單檔案,然後將 <activity> 元素新增為 <application> 元素的子項。例如:
<manifest ... > <application ... > <activity android:name=".ExampleActivity" /> ... </application ... > ... </manifest >
這個元素的唯一必要屬性為 android:name,用來指定活動的類別名稱。您也可以新增定義活動特性的屬性,例如標籤、圖示或 UI 主題。如要進一步瞭解這些屬性及其他屬性,請參閱 <activity> 元素參考說明文件。
注意: 發布應用程式後,請勿變更活動名稱。否則可能會破壞部分功能,例如應用程式捷徑。如要進一步瞭解發布後應避免的變更,請參閱「 無法變更的項目」。
宣告意圖篩選器
意圖篩選器是 Android 平台的一項強大功能。這些物件不只可根據明確要求和「隱含」要求來啟動活動。舉例來說,明確要求可能會指示系統「在 Gmail 應用程式中啟動「傳送電子郵件活動」。相反地,隱含要求會指示系統「在任何可執行工作的任何活動中啟動『發送電子郵件』畫面」。當系統 UI 詢問使用者要使用哪個應用程式執行工作時,這是運作中的意圖篩選器。
如要善用這項功能,您可以在 <activity> 元素中宣告 <intent-filter> 屬性。這個元素的定義包含 <action> 元素,以及 (選用) <category> 元素和/或 <data> 元素。這些元素結合了指定活動可回應的意圖類型。例如,下列程式碼片段說明如何設定要傳送文字資料的活動,並接收來自其他活動的要求:
<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> 元素會指定這個活動傳送資料。將 <category> 元素宣告為 DEFAULT
,可讓活動接收啟動要求。<data> 元素會指定這個活動可傳送的資料類型。下列程式碼片段說明如何呼叫上述活動:
Kotlin
val sendIntent = Intent().apply { action = Intent.ACTION_SEND type = "text/plain" putExtra(Intent.EXTRA_TEXT, textMessage) } startActivity(sendIntent)
Java
// 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>
標記控制哪些應用程式可以啟動特定活動。除非兩個活動資訊清單中的權限相同,否則父項活動無法啟動子項活動。如果您宣告父項活動的
<uses-permission>
元素,每個子項活動都必須有相符的
<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>
如要進一步瞭解權限和安全性的一般資訊,請參閱安全性和權限。
管理活動生命週期
在活動的生命週期中,活動會經歷多種狀態。您需要使用一系列回呼來處理狀態之間的轉換。下列各節將介紹這些回呼。
onCreate()
您必須實作這個回呼,在系統建立活動時觸發。實作作業應初始化活動的基本元件:舉例來說,應用程式應建立檢視畫面,並將資料繫結至清單。最重要的是,您必須在此呼叫 setContentView()
,定義活動使用者介面的版面配置。
onCreate()
完成後,下一個回呼一律為 onStart()
。
onStart()
當 onCreate()
離開時,活動會進入「啟動」狀態,而使用者可以看到該活動。這個回呼包含活動至前景與互動而最終準備作業的最終準備量。
onResume()
系統會在活動開始與使用者互動之前叫用這個回呼。此時,活動位於活動堆疊頂端,並擷取所有使用者輸入內容。應用程式的核心功能大多是透過 onResume()
方法實作。
onPause()
回呼一律會遵循 onResume()
。
onPause()
當活動失去聚焦並進入暫停狀態時,系統會呼叫 onPause()
。舉例來說,當使用者輕觸「返回」或「最近使用」按鈕時,就會發生這個狀態。系統針對活動呼叫 onPause()
時,技術上表示活動仍部分可見,但通常是指使用者正在離開活動,而活動即將進入「已停止」或「已恢復」狀態。
如果使用者預期使用者介面會更新,處於「已暫停」狀態的活動可能會繼續更新使用者介面。這類活動包括顯示導航地圖畫面或媒體播放器正在播放的活動。即使這類活動失去聚焦,使用者還是希望 UI 繼續更新。
請勿使用 onPause()
儲存應用程式或使用者資料、發出網路呼叫或執行資料庫交易。如要瞭解如何儲存資料,請參閱「
儲存及還原活動狀態」。
onPause()
執行完畢後,根據活動進入已暫停狀態後發生的事件,下一個回呼會是 onStop()
或 onResume()
。
onStop()
當使用者不再看見活動時,系統會呼叫 onStop()
。這可能是因為活動遭到刪除、新活動正在開始,或現有活動正在進入已恢復狀態,且涵蓋了停止的活動。在這些情況下,已停止的活動一律不會再顯示。
系統呼叫的下一個回呼為 onRestart()
(如果活動是返回,以便與使用者互動);如果活動已完全終止,則為 onDestroy()
。
onRestart()
當處於「已停止」狀態的活動即將重新啟動時,系統會叫用這個回呼。onRestart()
會還原活動停止的時間狀態。
此回呼一律會後面加上 onStart()
。
onDestroy()
系統會在活動刪除前叫用這個回呼。
這個回呼是活動收到的最後一個回呼。通常會實作 onDestroy()
,以確保在活動或包含該活動的程序遭到刪除時,所有活動資源都會被釋出。
這個部分只提供這個主題的簡介。如要進一步瞭解活動生命週期及其回呼的處理方式,請參閱「活動生命週期」。