Android 10 (API 級別 29) 以上版本會限制應用程式在背景執行時啟動活動的時機。這些限制有助於盡量減少對使用者的干擾,並讓使用者進一步控管畫面上顯示的內容。
本指南將通知視為從背景啟動活動的替代方案。並列出不適用限制的特定情況。
改為顯示通知
在幾乎所有情況下,背景執行的應用程式都必須顯示具時效性的通知,向使用者提供緊急資訊,而不是直接啟動活動。這類通知包括處理來電或正在響鈴的鬧鐘。
這套以通知為基礎的快訊和提醒系統為使用者帶來多項優點:
- 使用裝置時,使用者會看到通知,可選擇回覆訊息。使用者可以維持目前的脈絡,並控管畫面上顯示的內容。
- 系統會根據使用者的「零打擾」規則,決定是否顯示緊急通知。舉例來說,使用者可以允許在啟用「請勿打擾」模式時,只接聽特定聯絡人或重複來電者的電話。
- 裝置螢幕關閉時,系統會立即啟動全螢幕意圖。
- 在裝置的「設定」畫面中,使用者可以查看最近傳送通知的應用程式,包括來自特定通知管道的通知。使用者可以在這個畫面控管通知偏好設定。
應用程式何時可以啟動活動
在 Android 10 以上版本中,應用程式可在符合下列一或多項條件時啟動活動:
- 應用程式有可見視窗,例如前景活動。
- 應用程式在前景工作的返回堆疊中具有活動。
應用程式在「最近使用」畫面的現有工作中,存在返回堆疊活動。
應用程式最近啟動了一項活動。
應用程式在最近的活動中呼叫
finish()
。只有在呼叫finish()
時,應用程式在前景有活動,或前景工作在返回堆疊中有活動時,才會套用這項設定。應用程式具有系統繫結的下列其中一項服務。這些服務可能需要啟動 UI。
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
TileService
(不適用於 Android 14 (API 級別 34) 以上版本)VoiceInteractionService
VrListenerService
。
應用程式的服務已綁定至其他可見應用程式。綁定至服務的應用程式必須保持可見,背景應用程式才能順利啟動活動。
應用程式會收到系統通知
PendingIntent
。如果是服務和廣播接收器的待處理意圖,應用程式可以在傳送待處理意圖後幾秒內啟動活動。應用程式收到從其他可見應用程式傳送的
PendingIntent
。應用程式會收到系統廣播,並預期啟動 UI。範例包括
ACTION_NEW_OUTGOING_CALL
和SECRET_CODE_ACTION
。應用程式可以在廣播傳送後幾秒內啟動活動。應用程式透過
CompanionDeviceManager
API 與隨附硬體裝置建立關聯。這個 API 可讓應用程式啟動活動,以回應使用者在配對裝置上執行的動作。使用者已授予應用程式
SYSTEM_ALERT_WINDOW
權限。
從 PendingIntent 啟動活動時,必須選擇啟用
為避免根據列出的條件意外啟動 Activity,Android 14 以上版本提供明確的 API,可供您選擇是否授予應用程式啟動 Activity 的權限。
如果應用程式指定 Android 15 以上版本,預設不會再隱含地將背景活動啟動 (BAL) 權限授予所建立的 PendingIntents
。您必須明確選擇加入,才能使用這項功能。視應用程式傳送或建立 PendingIntents
的方式而定,有以下幾種做法。
由 PendingIntent 的傳送者
指定 Android 14 以上版本的應用程式如要啟動 PendingIntent
,必須
- 符合所列條件 和
- 選擇允許系統根據這些例外狀況啟動背景活動
只有在應用程式開發人員知道應用程式即將啟動 Activity 時,才應該選擇加入。
如要選擇加入,應用程式應透過 setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
將 ActivityOptions
組合傳遞至 PendingIntent.send()
或類似方法。
由 PendingIntent 的建立者
如果應用程式指定 Android 15 以上版本,且會建立 PendingIntent
,則現在必須明確選擇加入,允許啟動背景活動,才能在列出的條件下啟動這些 PendingIntents
。
在大多數情況下,啟動 PendingIntent
的應用程式應選擇加入。
不過,如果建立應用程式需要授予這些權限:
- 只要建立應用程式可見,隨時都能啟動
PendingIntent
。 - 如果建立應用程式具有特殊權限,則隨時可以啟動
PendingIntent
。
如要選擇加入,應用程式應透過 setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
傳遞 ActivityOptions
組合至 PendingIntent.getActivity()
或類似方法。
詳情請參閱相關參考說明文件:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
嚴格模式
從 Android 16 開始,應用程式開發人員可以啟用「嚴格模式」,在活動啟動遭封鎖時收到通知 (或在應用程式的目標 SDK 提高時,收到活動啟動可能遭封鎖的通知)。
以下是範例程式碼,說明如何從應用程式、活動或其他應用程式元件的 Application.onCreate()
方法中啟用:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
詳情請參閱「嚴格模式」說明文件。