Oreo(api 26)无法接收来自其他模块的广播

时间:2018-01-18 10:48:26

标签: android broadcastreceiver android-8.0-oreo

我有一个用于下载的模块,一旦下载文件,我就会发送一个隐式的brodcast。 在我的app模块中,我让广播接收器在下载完成后进行一些更改设置。 在android 8中我无法接收这个广播,检查文档,据说使用显式意图新的Intent(context,MyBroadcastReceiver.class); 但我的问题是我的MyBroadcastReceiver.class在我的app模块中而不在我的下载模块中,所以我不能做这样的事情。

还有什么其他可能性?我坚持这个新的广播实施......

2 个答案:

答案 0 :(得分:1)

首先,如果你真的是指"模块" - 并且所有这些代码都在一个应用程序和一个进程中 - 请停止使用系统广播。使用进程内解决方案:

  • LocalBroadcastManager,正如Balu建议的
  • greenrobot' EventBus
  • LiveData
  • RxJava

使用系统广播具有隐私,安全和性能方面的影响。

但是,让我们假装通过" module"你的意思是" app",或者代码将在不同的进程中,因此进程内的解决方案将不起作用。

  

但我的问题是我的MyBroadcastReceiver.class在我的app模块中而不在我的下载模块中,所以我不能做这样的事情。

如果接收者已在清单中注册,您当然可以使用PackageManagerqueryBroadcastReceivers()来获取接收者的详细信息。然后,您可以在setComponentName()上拨打Intent以使其明确,然后再发送广播:

private static void sendImplicitBroadcast(Context ctxt, Intent i) {
  PackageManager pm=ctxt.getPackageManager();
  List<ResolveInfo> matches=pm.queryBroadcastReceivers(i, 0);

  for (ResolveInfo resolveInfo : matches) {
    Intent explicit=new Intent(i);
    ComponentName cn=
      new ComponentName(resolveInfo.activityInfo.applicationInfo.packageName,
        resolveInfo.activityInfo.name);

    explicit.setComponent(cn);
    ctxt.sendBroadcast(explicit);
  }
}

有关详情,请参阅my blog post on the implicit broadcast ban

答案 1 :(得分:0)