Android 14 突显的三大组件之谜:细思极恐的默认行为
2022-11-14 17:34:42
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 的情况下接收动态注册的广播。
常见问题解答
- 为什么 Android 14 中的默认行为会发生改变?
Android 14 中的默认行为改变是为了提高系统安全性。
- 我可以在清单文件中声明所有广播 action 吗?
可以,但是会让清单文件变得臃肿。
- 我可以用 BroadcastManager 接收所有动态注册的广播吗?
可以,但是 BroadcastManager 会增加额外的开销。
- 我可以用广播优先级来接收动态注册的广播吗?
不可以,在 Android 14 中,广播优先级不再影响广播的接收。
- 我还可以通过其他方式接收动态注册的广播吗?
目前还没有其他方式可以接收动态注册的广播。