Oreo (api 26) 无法接收来自其他模块的广播
Oreo (api 26) not able to receive broadcast from other module
我有一个用于下载的模块,下载文件后我会发送隐式广播。
在我的应用程序模块中,我有广播接收器,可以在下载完成后进行一些更改设置。
在 android 8 中,我无法接收此广播,检查文档,据说使用显式意图 new Intent(context, MyBroadcastReceiver.class);
但是我的问题是我的 MyBroadcastReceiver.class 在我的应用程序模块中而不是在我的下载模块中,所以我不能做这样的事情。
还有哪些可能性?我坚持使用这个新的广播实现...
首先,如果您的意思是 "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中注册了,你当然可以通过PackageManager
和queryBroadcastReceivers()
获取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。
我有一个用于下载的模块,下载文件后我会发送隐式广播。 在我的应用程序模块中,我有广播接收器,可以在下载完成后进行一些更改设置。 在 android 8 中,我无法接收此广播,检查文档,据说使用显式意图 new Intent(context, MyBroadcastReceiver.class); 但是我的问题是我的 MyBroadcastReceiver.class 在我的应用程序模块中而不是在我的下载模块中,所以我不能做这样的事情。
还有哪些可能性?我坚持使用这个新的广播实现...
首先,如果您的意思是 "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中注册了,你当然可以通过PackageManager
和queryBroadcastReceivers()
获取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。