從背景啟動活動的限制

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 選擇是否要為「活動」啟動應用程式權限。

請參閱以下內容:

  • ActivityOptions.setPendingIntentBackgroundActivityStartMode
  • ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode

PendingIntent 的寄件者

如果應用程式指定 Android 14 以上版本,且想啟動 PendingIntent,則必須

  • 符合列出的競爭 以及
  • 選擇允許根據這些例外狀況啟動背景活動

只有在應用程式開發人員知道應用程式正在啟動活動時,系統才會執行這項選擇操作。

如要選擇加入,應用程式應將含有 setPendingIntentBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)ActivityOptions 組合傳遞至 PendingIntent.send(...) 或類似方法。

PendingIntent 的創作者

如果應用程式指定 Android 15 以上版本,且建立 PendingIntent,就必須

  • 符合列出的競爭 以及
  • 選擇允許根據這些例外狀況啟動背景活動

在大多數情況下,啟動 PendingIntent 的應用程式應該是選擇加入的應用程式。

如果建立 PendingIntent 的應用程式選擇加入,就會發生下列情況:

  • 建立應用程式顯示時,隨時可以啟動 PendingIntent
  • 如果建立的應用程式有特殊權限,您隨時可以啟動 PendingIntent

因此,建議您不要將這類 PendingIntent 傳遞至不受信任的應用程式,並在不應再使用時取消 PendingIntent

如要選擇加入,應用程式應將含有 setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)ActivityOptions 組合傳遞至 PendingIntent.getActivity(...) 或類似方法。