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 以上版本為目標版本的應用程式,預設不會再隱含授予所建立 PendingIntents
背景活動啟動 (BAL) 權限。您必須明確選擇加入,才能執行這項操作。以下是應用程式傳送或建立 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