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 開始,您可以透過 Android 14 開始,使用明確的 API 選擇是否要為 Activity 啟動授予應用程式權限。
根據預設,指定 Android 15 以上版本的應用程式不會再間接授予自身建立的 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