簡體   English   中英

自 Android SDK 31 以來未考慮小部件的意圖

[英]Intent from widget not taken into account since Android SDK 31

我的應用程序提供了通過用戶想要的任意數量的小部件啟動它的可能性。 為了確定哪個小部件觸發了啟動,我在與小部件關聯的 Intent 中使用了一個額外的參數。 此參數是我的AppWidgetProviderupdate function 提供的小部件 id。 只要我目標 SDK 版本達到 30,一切都很好。 如果我嘗試定位到 Android SDK 31 或 32,當我添加新小部件時,我會收到以下錯誤:

java.lang.IllegalArgumentException:vd63.utilitaires.memo:定位 S+(版本 31 及更高版本)要求在創建 PendingIntent 時指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。 強烈考慮使用 FLAG_IMMUTABLE,僅當某些功能依賴於 PendingIntent 是可變的時才使用 FLAG_MUTABLE,例如,如果它需要與內聯回復或氣泡一起使用。

我試圖聲明我的 Intent 是可變的,因為到目前為止,據我所知,Intents 在默認情況下是可變的。 但是當我單擊小部件時,應用程序會重新出現,但沒有考慮傳遞給小部件的 Intent。 我試圖將 Intent 更改為不可變,但沒有改進。

有誰知道 Android SDK 31 和它的前輩之間行為變化的起源,以及如何應對?

Edit: targetting SDK 30 doesn't remove the problem when the app is running on a device whose OS is Android 12. Targetting SDK 32 is neither a problem when running on an Android 8 device.

這個問題是因為 sdk 31 目前我在我的項目中處理這種情況。

Kotlin 解決方案

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT else PendingIntent.FLAG_UPDATE_CURRENT

如果您的應用程序以 Android 12 或更高版本為目標,則您必須指定您的應用程序創建的每個 PendingIntent object 的可變性。 要聲明給定的 PendingIntent object 是可變的或不可變的,請分別使用 PendingIntent.FLAG_MUTABLE 或 PendingIntent.FLAG_IMMUTABLE 標志。

在大多數情況下(以及您的情況),您的應用程序應該創建不可變的 PendingIntent 對象:

val pendingIntent = PendingIntent.getActivity(applicationContext,
        REQUEST_CODE, intent,
        /* flags */ PendingIntent.FLAG_IMMUTABLE)

如果一個 PendingIntent object 是不可變的,那么其他應用程序不能修改意圖來調整調用意圖的結果。 在以下情況下需要可變 PendingIntent:

  1. 支持通知中的直接回復操作。
  2. 使用 CarAppExtender 實例將通知與 Android Auto 框架相關聯。
  3. 使用 PendingIntent 實例將對話置於氣泡中。
  4. 通過調用 requestLocationUpdates() 或類似 API 請求設備位置信息。
  5. 使用 AlarmManager 安排警報。

了解更多信息文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM