这种隐式广播与通过显式广播进行广播的其他方式有什么区别?

时间:2019-07-13 14:25:58

标签: android android-8.0-oreo android-broadcast

在Android中使用广播implicitexplicit这两种广播-对于隐式,我们将在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会强加给我这个后台执行限制?

1 个答案:

答案 0 :(得分:3)

  

我在这里想念东西吗?

Google工程师表示,如果有太多的应用程序这样做,则将以某种方式禁止这种方法。

FWIW,我在博客中介绍了这种方法two years ago

  

如果我能够做到这一点,那么Android为什么要向我强加此后台执行限制?

Google希望很少有开发人员会采用这种解决方法,而会使用其他IPC机制。

问题是流程变更。假设您的隐式广播匹配25个应用程序的清单。执行代码时,Android需要将您的Intent传递给25个接收者。但是,其中只有几个内存中-许多应用程序将没有正在运行的进程。因此,Android现在需要派生一大堆流程来交付您的Intent。反过来,这很可能迫使其他进程终止,以释放系统RAM。最终结果是低端设备上的性能不佳。

我认为,Android应该禁止存储和转发机制,而不是禁止隐式广播,并以限制进程流失的速度缓慢交付广播。我的建议被拒绝了。