從背景啟動活動的限制

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 以上版本的應用程式不再間接將背景活動啟動 (BAL) 權限授予其建立的 PendingIntents。您必須明確選擇加入,才能執行這項操作。以下是應用程式傳送或建立 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() 或類似方法。

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