当我将目标SDK更新到30+ (Android R或更高版本)时,我的PendingIntent上出现了一个lint警告Missing PendingIntent可变性标志。当我想定义PendingIntent时,FLAG_UPDATE_CURRENT标志。

我应该如何处理这个绒线没有对应用程序功能的影响?


当前回答

您可以将您的未决意图设置为

val updatedPendingIntent = PendingIntent.getActivity(
   applicationContext,
   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-intent-mutability

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

相应地选择你的旗帜。

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

其他回答

下面是我在KOTLIN中从30移动到33的用例。

1. 添加媒体依赖

implementation "androidx.media:media:1.4.1"

2. 更新工作管理器

 implementation "androidx.work:work-runtime-ktx:2.7.0"

3.更新不变的

fun getImmutableFlag() = if(isAndroidAPI31())  PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT else 0

fun isAndroidAPI31() = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S

private fun createOpenAppIntent(context: Context): PendingIntent {
        val intent = Intent(context, MainActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
        }
        return PendingIntent.getActivity(context, 0, intent, getImmutableFlag())
    }

4. 如果在所有活动、服务、提供者、接收者中未添加,则在清单中添加导出标签

android:exported="true"

希望这能起作用,祝你愉快。

由于我的代码中有四个不同的PendingIntents,我首先将FLAG_IMMUTABLE添加到它们中。然而问题仍然存在。 在花了大量时间分析我的4个意图后,我意识到问题可能来自我的一个库。

在构建。gradle,库通常在旧的时候高亮显示,但Firebase的BOM不是这样的。

我有:

implementation platform('com.google.firebase:firebase-bom:26.1.1')

事实证明这是非常古老的。更新到

implementation platform('com.google.firebase:firebase-bom:29.0.4')

一切都很好。没有更多的FLAG_IMMUTABLE错误

在我的例子中,它也是由使用旧WorkManager版本的第三方库强制所有依赖的新Android Work版本在你的根构建中使用这个。gradle文件:

allproject {
  project.configurations.all {
    resolutionStrategy {
      force 'androidx.work:work-runtime:2.7.0'
    }
  }
}

如果你使用Java和ADMOB,你会在SDK S或Android 12上遇到PendingIntent错误。这里有一个修复,使ADMOB使用正确的工作-运行时。

implementation 'com.google.android.gms:play-services-ads:19.5.0'
    constraints {
        implementation('androidx.work:work-runtime:2.7.0-alpha05') {
            because 'previous versions have a bug impacting this application'
        }
    }

您可以将您的未决意图设置为

val updatedPendingIntent = PendingIntent.getActivity(
   applicationContext,
   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-intent-mutability

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

相应地选择你的旗帜。

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