Android - 带有标志的待处理意图
Posted
技术标签:
【中文标题】Android - 带有标志的待处理意图【英文标题】:Android - Pending Intent with flags 【发布时间】:2021-12-15 12:06:29 【问题描述】:所以我有一个带有小部件的应用程序,它在更新小部件或打开应用程序时使用 PendingIntent。将 targetSdkVersion 设置为 31 后,它开始崩溃说
“定位 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。强烈考虑使用 FLAG_IMMUTABLE,仅当某些功能依赖于 PendingIntent 是可变的时才使用 FLAG_MUTABLE,例如,如果它需要与内联回复或气泡一起使用“
所以我在使用 PendingIntent 的任何地方都这样做了
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S)
pendingIntent = PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_IMMUTABLE
)
else
pendingIntent = PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
但是,这似乎不起作用,并且对于某些用户来说它一直在崩溃并显示在 Firebase Crashlytics 中。有谁知道如何解决这个问题?
【问题讨论】:
“对于某些用户来说它一直在崩溃”——它是因为同样的错误还是因为一些新的错误而崩溃? 总是我发布的错误以“Targeting S+...”开头。 也许PendingIntent
不是来自您的代码,而是来自库。错误或堆栈跟踪是否为您提供了 PendingIntent
来自何处的任何指示?
这很好。可能。它说它在打开应用程序后 1 秒内发生,这就是为什么我认为它来自我的小部件,但我想它也可能来自推送通知,所以在这种情况下是 Firebase
API 31+ 的新 PendingIntent 缺少原始标志 PendingIntent.FLAG_UPDATE_CURRENT
。如果您的 'pre API 31'-PendingIntent 有这个标志,那么除了 IMMUTABLE 标志之外,你的 'API 31+'-PendingIntent 应该有这个标志:PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
- 但是,我不确定这是否是在你的情况下崩溃。
【参考方案1】:
如果您的应用程序minSdkVersion
是below SDK 23,您只需对Build.VERSION.SDK_INT
执行运行时检查。
否则只需组合标志:
pendingIntent = PendingIntent.getActivity(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
【讨论】:
我不太明白什么时候使用FLAG_IMMUTABLE或FLAG_MUTABLE 看起来 Navgraph 的东西有 NavDeepLinkBuilder 可能可以在没有这些标志的情况下构建一个 Intent。可能是为什么我的应用程序很好,但在使用 12 的真手机上构建的 androidTest 上失败,模拟器测试以优异的成绩通过。以上是关于Android - 带有标志的待处理意图的主要内容,如果未能解决你的问题,请参考以下文章