避免PendingIntent“对象有被破坏的危险”!Android 13 新增FLAG_IMMUTABLE或FLAG_MUTABLE
2024-01-08 19:07:38
Android 13 中 PendingIntent 的重大变革
背景
随着 Android 13 的发布,PendingIntent 发生了重大的变化,这影响了应用程序使用隐式 Intent 的方式。本文将深入探讨这些变化,解释使用 FLAG_IMMUTABLE 和 FLAG_MUTABLE 标志位的新要求,并提供迁移指南和常见问题解答。
隐式 Intent 的终结
在 Android 13 中,PendingIntent 不再支持隐式 Intent,这意味着您无法再在 PendingIntent 中使用不包含显式组件名称的 Intent。此举是为了增强系统的安全性和隐私性,防止恶意应用程序通过 PendingIntent 启动不可信组件。
FLAG_IMMUTABLE 和 FLAG_MUTABLE
为了应对隐式 Intent 的移除,开发者现在必须在目标 SDK 版本 31 及更高版本中使用 FLAG_IMMUTABLE 或 FLAG_MUTABLE 标志位来明确指定 PendingIntent 的行为。
-
FLAG_IMMUTABLE: 此标志表示 PendingIntent 是不可变的,这意味着 Intent 无法被修改。这适用于不需要修改 Intent 的场景,例如启动 Activity 或 Service。
-
FLAG_MUTABLE: 此标志表示 PendingIntent 是可变的,这意味着 Intent 可以被修改。这适用于需要修改 Intent 的场景,例如启动 BroadcastReceiver 或传递数据。
迁移指南
如果您当前的应用程序仍在使用隐式 Intent,则在迁移到 Android 13 之前需要对代码进行修改。以下是迁移指南:
- 确定使用隐式 Intent 的 PendingIntent。
- 将隐式 Intent 替换为显式 Intent。
- 在创建 PendingIntent 时,使用 FLAG_IMMUTABLE 或 FLAG_MUTABLE 标志。
- 确保所有 PendingIntent 使用正确的标志。
代码示例
// 使用隐式 Intent 创建 PendingIntent
Intent intent = new Intent(Intent.ACTION_VIEW);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// 使用 FLAG_IMMUTABLE 创建 PendingIntent
Intent intent = new Intent(context, MyActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
// 使用 FLAG_MUTABLE 创建 PendingIntent
Intent intent = new Intent(context, MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_MUTABLE);
常见问题解答
1. 为什么 Android 13 不再支持隐式 Intent?
为了提高系统的安全性和隐私性,防止恶意应用程序通过 PendingIntent 启动不可信组件。
2. 什么是 FLAG_IMMUTABLE 和 FLAG_MUTABLE 标志?
FLAG_IMMUTABLE 表示 PendingIntent 是不可变的,FLAG_MUTABLE 表示 PendingIntent 是可变的。
3. 如何知道我是否使用了隐式 Intent?
如果您在创建 PendingIntent 时没有指定组件名称,则您使用了隐式 Intent。
4. 如何将隐式 Intent 替换为显式 Intent?
您需要在 Intent 中明确指定组件名称。
5. 如何在创建 PendingIntent 时使用 FLAG_IMMUTABLE 或 FLAG_MUTABLE 标志?
您可以在 createPendingIntent() 方法中使用 PendingIntent.FLAG_IMMUTABLE 或 PendingIntent.FLAG_MUTABLE 常量。
结论
Android 13 中对 PendingIntent 的更改是增强系统安全性和隐私性的重要一步。通过使用 FLAG_IMMUTABLE 和 FLAG_MUTABLE 标志位,开发者可以控制 PendingIntent 的行为,并确保只有授权的组件才能被启动。通过遵循本指南中的步骤,您可以顺利迁移您的应用程序,并确保其符合 Android 13 的要求。