代码之家  ›  专栏  ›  技术社区  ›  Chol

Oreo(api 26)无法从其他模块接收广播

  •  1
  • Chol  · 技术社区  · 8 年前

    我有一个模块,将用于下载,一旦文件被下载,我用来发送一个隐式brodcast。 在我的应用程序模块中,一旦下载完成,广播接收器可以进行一些更改设置。 在android 8中,我无法接收此广播,检查文档,据说使用显式意图new intent(上下文,MyBroadcastReceiver.class); 但我的问题是我的广播接收器。类位于我的应用程序模块中,而不在下载模块中,因此我无法执行类似操作。

    还有什么其他可能性?我一直在使用这个新的广播实现。。。

    2 回复  |  直到 8 年前
        1
  •  3
  •   CommonsWare    8 年前

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

    • LocalBroadcastManager ,正如巴鲁所建议的
    • greenrobot的EventBus
    • LiveData
    • RxJava
    • 等

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

    但是,让我们假设“模块”是指“应用程序”,否则代码将在单独的进程中,因此进程内解决方案将无法工作。

    但我的问题是我的广播接收器。类位于我的应用程序模块中,而不在下载模块中,因此我无法执行类似操作。

    如果接收者在清单中注册,您当然可以使用 PackageManager 和 queryBroadcastReceivers() 获取接收器的详细信息。然后你可以打电话 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 更多信息。

        2
  •  0
  •   Balu Sangem    8 年前