我正试图通过广播获得两个应用程序来进行通信。第一个应用程序使用如下代码发送广播:
Intent outIntent = new Intent("org.example.WHATEVER");
PackageManager pm = this.getPackageManager();
List<ResolveInfo> receivers = pm.queryBroadcastReceivers(outIntent, 0);
if (receivers != null)
for (ResolveInfo receiver : receivers) {
Log.d("Sender", String.format("Polling %s", receiver.activityInfo.packageName));
outIntent = new Intent("org.example.WHATEVER");
outIntent.setPackage(receiver.activityInfo.packageName);
sendBroadcast(outIntent);
}接收端在其清单中注册BroadcastReceiver:
<receiver android:name="org.example.receiverapp.WhateverReceiver" >
<intent-filter>
<action android:name="org.example.WHATEVER" />
</intent-filter>
</receiver>onReceive()方法在调用时写入日志条目。
当接收应用程序运行时(即我在屏幕上有它的主要活动,然后从它旁边导航),它会处理广播。但是,如果接收程序没有运行(我通过长按住回键,在Developer Settings中激活了“Long-press Back to kill app”),它就不会被广播唤醒。
我故意为这个意图设置一个包名,以避免从Android8开始使用清单-声明的接收者不再接收隐式广播的问题。此外,我运行的是Android 7,这两个应用程序都针对API 23,因此Android 8中的任何限制在这个设置中都不重要。
我遇到过一个评论,它的作者建议,某些类型的安卓系统可能不会唤醒广播应用程序,这似乎就是我在这里体验到的(运行LineageOS 14.1的)-though--评论并不是很具体,我也没有找到任何支持这一说法的东西。
这就是这里发生的事吗?如果是这样的话,我如何确保接收应用程序被广播唤醒(至少如果它是导演的话)?如果没有,这里有什么问题吗?
发布于 2018-06-24 18:51:34
为了做一个显式的Intent,我通常使用setComponent(),因为它保证工作(与任何事情一样多):
Intent outIntent = new Intent("org.example.WHATEVER");
PackageManager pm = this.getPackageManager();
List<ResolveInfo> receivers = pm.queryBroadcastReceivers(outIntent, 0);
if (receivers != null)
for (ResolveInfo receiver : receivers) {
Log.d("Sender", String.format("Polling %s/%s",
receiver.activityInfo.applicationInfo.packageName,
receiver.activityInfo.name));
ComponentName cn = new ComponentName(
receiver.activityInfo.applicationInfo.packageName,
receiver.activityInfo.name);
outIntent = new Intent("org.example.WHATEVER");
outIntent.setComponent(cn);
sendBroadcast(outIntent);
}在某些情况下,setPackage()使Intent“足够明确”以满足某些Android标准。显然在这种情况下,它没有。¯\_(ツ)_/¯
https://stackoverflow.com/questions/51012588
复制相似问题