返回

Android 14 突显的三大组件之谜:细思极恐的默认行为

Android

Android 14 中三大组件的默认行为变更

在最近研究 Android 14 时,我遇到一个现象,一度以为是 bug,但经过仔细分析后,我意识到,这其实并不是 bug,而是 Android 系统中三大组件(Activity、Service 和 BroadcastReceiver)默认行为的一个体现。

现象

在我的项目中,有一个 Activity,它有一个 BroadcastReceiver 来接收一个自定义的广播。这个广播的 action 是动态注册的,也就是说,它不是在清单文件中声明的。

当我在 Android 13 上运行这个项目时,一切都正常,Activity 可以正常收到广播。但在 Android 14 上,Activity 却收不到广播了。

背后的原因

我一开始以为这是一个 bug,但是在与同事讨论后,我意识到,这其实是 Android 系统中三大组件默认行为的一个体现。

在 Android 14 中,如果一个 Activity 要接收一个动态注册的广播,那么它必须在清单文件中声明这个广播的 action。否则,Activity 将无法收到广播。

影响

这个默认行为的改变,给我们带来了很大的困扰。因为在我们的项目中,有很多动态注册的广播,如果我们要在清单文件中声明所有这些广播的 action,那么清单文件将变得非常臃肿。

可能的解决方案

  • 在清单文件中声明广播 action

这是最简单的解决方案,但缺点是会让清单文件变得臃肿。

  • 使用 BroadcastManager

BroadcastManager 可以让你在不声明广播 action 的情况下接收广播。以下是使用 BroadcastManager 的代码示例:

BroadcastManager broadcastManager = ContextCompat.getSystemService(context, BroadcastManager.class);
broadcastManager.registerReceiver(broadcastReceiver, new IntentFilter(BROADCAST_ACTION));

Android 14 中的默认行为

Android 系统中三大组件的默认行为,在 Android 14 中发生了以下变化:

  • Activity

如果一个 Activity 要接收一个动态注册的广播,那么它必须在清单文件中声明这个广播的 action。

  • Service

Service 可以在没有在清单文件中声明的情况下接收动态注册的广播。

  • BroadcastReceiver

BroadcastReceiver 可以在没有在清单文件中声明的情况下接收动态注册的广播。

结论

Android 14 中三大组件的默认行为变更,给我们带来了很大的困扰。我希望 Android 系统能够在 Android 14 中提供一个新的 API,让我们可以在不声明广播 action 的情况下接收动态注册的广播。

常见问题解答

  1. 为什么 Android 14 中的默认行为会发生改变?

Android 14 中的默认行为改变是为了提高系统安全性。

  1. 我可以在清单文件中声明所有广播 action 吗?

可以,但是会让清单文件变得臃肿。

  1. 我可以用 BroadcastManager 接收所有动态注册的广播吗?

可以,但是 BroadcastManager 会增加额外的开销。

  1. 我可以用广播优先级来接收动态注册的广播吗?

不可以,在 Android 14 中,广播优先级不再影响广播的接收。

  1. 我还可以通过其他方式接收动态注册的广播吗?

目前还没有其他方式可以接收动态注册的广播。