從背景啟動活動的限制

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 啟動活動時,必須選擇啟用

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

如果應用程式指定 Android 15 以上版本,預設不會再隱含地將背景活動啟動 (BAL) 權限授予所建立的 PendingIntents。您必須明確選擇加入,才能使用這項功能。視應用程式傳送或建立 PendingIntents 的方式而定,有以下幾種做法。

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

由 PendingIntent 的傳送者

指定 Android 14 以上版本的應用程式如要啟動 PendingIntent,必須

  • 符合所列條件
  • 選擇允許系統根據這些例外狀況啟動背景活動

只有在應用程式開發人員知道應用程式即將啟動 Activity 時,才應該選擇加入。

如要選擇加入,應用程式應透過 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() 或類似方法。

詳情請參閱相關參考說明文件:

嚴格模式

從 Android 16 開始,應用程式開發人員可以啟用「嚴格模式」,在活動啟動遭封鎖時收到通知 (或在應用程式的目標 SDK 提高時,收到活動啟動可能遭封鎖的通知)。

以下是範例程式碼,說明如何從應用程式、活動或其他應用程式元件的 Application.onCreate() 方法中啟用:

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

詳情請參閱「嚴格模式」說明文件。