最近我更新了我的 Android 应用程序:
在此之前,我的 linter 工作正常,没有显示任何代码问题。但是升级后它开始显示错误:
<Path to file>:<line> Error: Missing PendingIntent mutability flag [UnspecifiedImmutableFlag]
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
我知道从 API 31 开始,需要为所有挂起的意图提供可变性标志,因此这就是它被视为错误的原因,但这行来自片段:
if(Build.VERSION.SDK_INT >= VERSION_CODES.M){
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
} else {
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
}
如果我是正确的,FLAG_IMMUTABLE 是在 API 23 中引入的,所以如果我想也支持 API 21 和 22,我需要有“if 语句”。如果它是在 API 23 中引入的,为什么 linter 要求我将该标志放入旧 API 的代码中?
我遗漏了什么还是明显误报?
目前我用注释抑制了这个错误,但我觉得这不是正确的方法。
我在 AGP linter 中查看了该规则的单元测试源代码。他们正在以各种方式对其进行测试,但他们不会使用像我这样的代码进行测试。因此,基于Android代码搜索我能够使用如下代码解决我的问题:
PendingIntent pendingIntent = null;
int pendingIntentFlags;
if(Build.VERSION.SDK_INT >= VERSION_CODES.M){
pendingIntentFlags = PendingIntent.FLAG_IMMUTABLE;
} else {
pendingIntentFlags = 0;
}
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, pendingIntentFlags);
现在 linter 对该代码没有任何问题。
我仍然不知道为什么我之前的代码在 linter 上失败,所以如果有人有任何想法,请在评论中分享你的想法,因为我想知道。