android - 这种隐式广播与通过显式广播进行相同操作的其他方式有什么区别?
问题描述
implicit
使用 Android 中的广播和广播两种类型explicit
- 对于隐式,我们将在其中声明广播,AndroidManifest.xml
并且当某些应用程序发送带有操作的广播时,所有在其清单中使用该操作声明广播的应用程序将被调用并执行工作。
由于 Android 从 O 施加的后台执行限制,我不允许仅发送包含action
. 我必须明确指定包名和接收类名。
现在通过这样做,我能够克服隐式广播限制
String action = "com.android.intent.CUSTOM";
Intent intent = new Intent();
intent.setAction(intent);
//Though this is a deprecated method
List<ResolveInfo> resolvedBroadcasts = List<ResolveInfo> queryBroadcastReceivers(intent, 0, current_user_id);
for (ResolveInfo info : resolvedBroadcasts) {
ServiceInfo serviceInfo = info.serviceInfo;
//Note: Now this is becoming explicit broadcast
intent.setAction(serviceInfo.packageName, serviceInfo.name);
context.sendBroadcast(intent);
}
我在这里错过了什么吗?在这一点上感到困惑,如果我能够这样做,那么为什么 Android 会给我施加这个后台执行限制?
解决方案
我在这里错过了什么吗?
谷歌工程师表示,如果太多应用程序这样做,这种方法将被禁止,不知何故。
FWIW,两年前我在博客上写过这种方法。
如果我能够做到这一点,那么为什么 Android 会给我施加这个后台执行限制?
谷歌希望很少有开发人员会采用这种解决方法,而是使用其他一些 IPC 机制。
问题是流程流失。假设您的隐式广播匹配 25 个应用程序的清单。当您的代码执行时,Android 需要将您传递Intent
给 25 个接收器。但是,只有其中几个会在内存中——许多应用程序不会有正在运行的进程。因此,Android 现在需要派生一大堆进程来交付您的Intent
. 这反过来可能会强制终止其他进程,以释放系统 RAM。最终结果是低端设备的性能不佳。
我认为,Android 不应该禁止隐式广播,而是应该实现存储转发机制,以限制进程流失的速度缓慢传递广播。我的建议被拒绝了。
推荐阅读
- ruby-on-rails - React uncaught reference error: exports is not defined
- java - 在这种情况下如何在 Spark 中进行数据预处理
- node.js - 用户提供的模板:使用 EJS 是否安全?
- c# - ScriptCS 0.17.01 错误意外的命名参数
- php - 使用cron的内存限制耗尽运行脚本
- django - 添加配置文件后,管理员 django 的 url 错误
- php - 如何防止通过消息系统发送电子邮件和联系电话
- android - 无法生成签名的apk?[发生重复平台类错误]
- c++ - MultiByteToWideChar 无法正常工作
- apache-spark - Spark 结构化流:如何合并新数据和结果