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

Oreo (api 26) not able to receive broadcast from other module

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

还有哪些可能性?我坚持使用这个新的广播实现...

请使用LocalBroadcastManager

首先,如果您的意思是 "module"——并且所有这些代码都在一个应用程序和一个进程中——请停止使用系统广播。使用进程内解决方案:

  • LocalBroadcastManager,正如 Balu 建议的那样
  • greenrobot 的 EventBus
  • LiveData
  • RxJava
  • 等等

使用系统广播会影响隐私、安全和性能。

但是,我们假设 "module" 是指 "app",否则代码将处于不同的进程中,因此进程内解决方案将不起作用。

But my problem is that my MyBroadcastReceiver.class is in my app module and not in my downloading module, so I cannot do something like this.

如果receiver在manifest中注册了,你当然可以通过PackageManagerqueryBroadcastReceivers()获取receiver的详细信息。然后,您可以在 Intent 上调用 setComponentName() 使其显式化,然后再发送广播:

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