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 - 带有标志的待处理意图的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用小部件实例发送相同的待处理意图

多个意图打开错误活动的待处理意图

通知中的待处理意图不起作用

如何处理通知中的待处理意图

Android In-App Billing 失败,提示“您已经有此商品的待处理订单”。

在 Redux 应用程序中的页面转换时拒绝先前路由的待处理操作