当前位置: 首页 > 知识库问答 >
问题:

如何解决android api 30中的“丢失PendingIntent可变性标志”lint警告?

颜志业
2023-03-14

当我将目标SDK更新到30(Android R或更高版本)时,我的PendingIntent上出现了lint警告Missing PendingIntent-mutability标志。当我想定义PendingIntent时,FLAG_UPDATE_CURRENTFLAG。

我应该如何在不影响应用程序功能的情况下处理这个lint?

共有3个答案

颜举
2023-03-14

如果您让您的应用程序在android 12中运行,则会有一个新的PendingIntent可变性标志。如果您不希望您的PendingIntent发生突变,请使用

PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

    }else {
        pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    }

如果您希望PendingIntent发生突变,请使用以下命令:

PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);

    }else {
        pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    }

在Google文档中说,强烈建议使用FLAG_IMMUTABLE,仅当某些功能依赖于“待定意图”是可变的时,才使用FLAG_MUTABLE。更改应该很简单。此外,如果您在应用中使用 AdMob 20.4.0 或更低版本,请确保添加以下工作管理器依赖项:

//Work Manager dependency
implementation 'androidx.work:work-runtime:2.7.1'

请注意,当前工作管理器依赖版本是2.7.1。如果需要,您可以将版本更新到最新版本。

端木淇
2023-03-14

如果您没有使用最新版本的WorkManager,您会看到此问题。它已在版本2.7.0-alpha02中修复:

明确“待定”的“无意”可变性,以修复定位 Android 12 时的崩溃问题

请记住,2.7.0-alpha02 仅与 Android 12 开发者预览版 1 SDK 兼容。因此,您可能需要等到它达到测试版或RC。

2021年4月21日更新——对于任何搜索该问题的人来说,添加到这个答案中,您可能遇到的错误可能如下所示:

java.lang.IllegalArgumentException: com.myapp.myapp: Targeting S+ (version 10000 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.PendingIntent.checkFlags(PendingIntent.java:386)
        at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:657)
        at android.app.PendingIntent.getBroadcast(PendingIntent.java:644)
        at androidx.work.impl.utils.ForceStopRunnable.getPendingIntent(ForceStopRunnable.java:174)
        at androidx.work.impl.utils.ForceStopRunnable.isForceStopped(ForceStopRunnable.java:108)
        at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:86)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:75)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:920)

您不必实际直接在应用程序中使用WorkManager来查看此崩溃。

如这里所述,解决方案是为Android 12版本的build.gradle文件添加一个依赖项:

 implementation 'androidx.work:work-runtime-ktx:2.7.0-alpha05'

请注意,无论您是仅使用 Java、柯特林协程、RxJava2、GCM 网络管理器等,此依赖关系都是不同的。因此,请务必检查上面的 dox。

显然,将上述版本号替换为最新版本。如前所述,它与Android-13之前的版本不兼容。

徐洛华
2023-03-14

您可以将待定意向设置为

val updatedPendingIntent = PendingIntent.getActivity(
   applicathtml" target="_blank">ionContext,
   NOTIFICATION_REQUEST_CODE,
   updatedIntent,
   PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT // setting the mutability flag 
)

根据这里的文档:https://developer.android.com/about/versions/12/behavior-changes-12#pending-意图可变性

强烈考虑使用FLAG_IMMUTABLE,只有当某些功能依赖于PendingIntent是可变的时才使用FLAG_MUTABLE,例如,如果它需要与内联回复或气泡一起使用。

相应地选择你的国旗。

如果你想阅读更多关于这一点,我建议你在这里阅读这篇很棒的文章:https://medium.com/androiddevelopers/all-about-pendingintents-748c8eb8619

 类似资料:
  • MissingMethodInvocationException:when()需要一个必须是“mock上的方法调用”的参数。例如:when(mock.getarticles()).ThenReturn(articles); 此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。2.内部when()

  • 本文向大家介绍js如何解决数字精度丢失的问题?相关面试题,主要包含被问及js如何解决数字精度丢失的问题?时的应答技巧和注意事项,需要的朋友参考一下 const verifyFunc = (left, right) => { return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2); }; console.log(verifyFu

  • 现在在编写一个脚本,希望在root用户下收集oracle用户下的一些信息,但是发现在脚本中切换用户执行命令会出现环境变量问题。 如上面的命令所示,ORACLE_HOME是个空。 oracle用户下确实设置了环境变量,但是使用su - oracle -c "echo $ORACLE_HOME"这种样子查看时却显示该变量为空。 要如何才能在切换oracle用户后正确使用$ORACLE_HOME变量呢?

  • 本文向大家介绍React中this丢失的四种解决方法,包括了React中this丢失的四种解决方法的使用技巧和注意事项,需要的朋友参考一下 发现问题 我们在给一个dom元素绑定方法的时候,例如: React组件中不能获取refs的值,页面报错提示:Uncaught TypeError: Cannot read property 'refs' of null or undefind 小栗子 Reac

  • 问题内容: 联接操作可以正常工作,但是当我重用df2时,我面临着无法解析的属性错误 错误:org.apache.spark.sql.AnalysisException:已解析的属性ID#426 问题答案: 正如我在评论中提及,它关系到https://issues.apache.org/jira/browse/SPARK-10925,更具体地说https://issues.apache.org/ji

  • 问题内容: DeprecationWarning:需要一个整数(got类型为float)。不建议使用隐式转换为整数,并且在将来的Python版本中可能会删除隐式转换。 DeprecationWarning:需要一个整数(got类型为float)。不建议使用隐式转换为整数,并且在将来的Python版本中可能会删除隐式转换。 问题答案: 警告与的坐标参数有关。浮点坐标将表示的原点位于窗口像素之间。那没