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 啟動活動時必須選擇採用
為避免根據列出的條件意外啟動活動,Android 14 以上版本提供明確的 API,可讓您選擇是否授予應用程式啟動活動的權限。
根據預設,指定 Android 15 以上版本的應用程式不再間接將背景活動啟動 (BAL) 權限授予其建立的 PendingIntents
。您必須明確選擇加入,才能執行這項操作。以下是應用程式傳送或建立 PendingIntents
的選項。
由 PendingIntent 的寄件者執行
指定 Android 14 以上版本為目標版本的應用程式如要啟動 PendingIntent
,必須
- 符合所列條件,「並且」
- 選擇允許根據這些例外狀況啟動背景活動
「只有」當應用程式開發人員知道應用程式正在啟動活動時,才會出現這種選擇加入行為。
如要選擇加入,應用程式應將含有 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