在Android中使用广播implicit
和explicit
这两种广播-对于隐式,我们将在AndroidManifest.xml
中声明广播,并且当某个应用发送带有操作的广播时,所有在清单中声明广播并执行该操作的应用将被调用并完成工作。
在Android由O强制实施的background execution limits中,不允许我仅出于包含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会强加给我这个后台执行限制?
答案 0 :(得分:3)
我在这里想念东西吗?
Google工程师表示,如果有太多的应用程序这样做,则将以某种方式禁止这种方法。
FWIW,我在博客中介绍了这种方法two years ago。
如果我能够做到这一点,那么Android为什么要向我强加此后台执行限制?
Google希望很少有开发人员会采用这种解决方法,而会使用其他IPC机制。
问题是流程变更。假设您的隐式广播匹配25个应用程序的清单。执行代码时,Android需要将您的Intent
传递给25个接收者。但是,其中只有几个内存中-许多应用程序将没有正在运行的进程。因此,Android现在需要派生一大堆流程来交付您的Intent
。反过来,这很可能迫使其他进程终止,以释放系统RAM。最终结果是低端设备上的性能不佳。
我认为,Android应该禁止存储和转发机制,而不是禁止隐式广播,并以限制进程流失的速度缓慢交付广播。我的建议被拒绝了。