從背景啟動活動的限制

Android 10 (API 級別 29) 以上版本會限制應用程式在背景執行時,可啟動活動的時間。這些限制可盡量減少對使用者的干擾,並讓使用者更能掌控螢幕上顯示的內容。

本指南將通知列為從背景啟動活動的替代方案。並列出不適用限制的特定情況。

改為顯示通知

在大多數情況下,背景中的應用程式必須顯示具時效性的通知,才能向使用者提供緊急資訊,而非直接啟動活動。這類通知包括處理來電或鬧鐘。

這種以通知為基礎的快訊和提醒系統可為使用者帶來多項優勢:

  • 使用裝置時,使用者會看到快訊通知,讓他們做出回應。使用者可維持目前情境,並控管螢幕上顯示的內容。
  • 有時效性的通知會遵循使用者的「零打擾」規則。舉例來說,使用者可能會在啟用「請勿打擾」模式時,只允許特定聯絡人或重複來電者撥打電話。
  • 當裝置螢幕關閉時,全螢幕意圖會立即啟動。
  • 使用者可以在裝置的「設定」畫面中,查看哪些應用程式最近傳送通知,包括特定通知管道。使用者可透過這個畫面控制通知偏好設定。

應用程式可啟動活動的時機

在 Android 10 以上版本上執行的應用程式,只要符合下列一或多項條件,即可啟動活動:

  • 應用程式有可見的視窗,例如前景中的活動。
  • 應用程式在前景工作中的返回堆疊中具有活動。
  • 應用程式在「近期活動」畫面上,在現有工作中返回堆疊的活動。

  • 應用程式有最近才啟動的活動。

  • 應用程式最近在活動中稱為 finish()。只有在呼叫 finish() 時,應用程式在前景有活動,或前景任務的後置堆疊中有活動時,這項做法才適用。

  • 應用程式使用下列其中一種服務,且該服務受系統限制。這些服務可能需要啟動 UI。

  • 應用程式具有由其他開放瀏覽權限的應用程式所綁定的服務。如果應用程式已綁定服務,則該應用程式必須在背景中保持可見,才能成功啟動活動。

  • 應用程式會收到系統傳送的通知 PendingIntent。如果是服務和廣播接收器的待處理意圖,應用程式可以在待處理意圖傳送後的幾秒內啟動活動。

  • 應用程式會接收來自其他可見應用程式的 PendingIntent

  • 應用程式會收到系統廣播,應用程式應會在此時啟動 UI。例如 ACTION_NEW_OUTGOING_CALLSECRET_CODE_ACTION。應用程式可以在廣播傳送後的幾秒內啟動活動。

  • 應用程式會透過 CompanionDeviceManager API 與隨附硬體裝置建立關聯。此 API 可讓應用程式啟動活動,以回應使用者在配對裝置上執行的動作。

  • 應用程式是裝置政策控制器,執行模式為裝置擁有者模式。使用範例包括完全受管理的企業裝置,以及專用裝置,例如數位電子看板和資訊站。

  • 使用者已授予應用程式 SYSTEM_ALERT_WINDOW 權限。

從 PendingIntent 啟動活動時,必須選擇加入

為避免根據列出的條件意外啟動活動,Android 14 以上版本提供明確的 API,可讓您選擇是否授予應用程式啟動活動的權限。

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

待處理意圖表
圖 1:背景活動啟動作業的決策流程。

由 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() 或類似方法。

如需進一步瞭解詳情,請參閱相關參考說明文件: