首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清单声明的BroadcastReceiver在应用程序不运行时不接收显式广播。

清单声明的BroadcastReceiver在应用程序不运行时不接收显式广播。
EN

Stack Overflow用户
提问于 2018-06-24 18:01:08
回答 1查看 1.4K关注 0票数 5

我正试图通过广播获得两个应用程序来进行通信。第一个应用程序使用如下代码发送广播:

代码语言:javascript
复制
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

代码语言:javascript
复制
<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--评论并不是很具体,我也没有找到任何支持这一说法的东西。

这就是这里发生的事吗?如果是这样的话,我如何确保接收应用程序被广播唤醒(至少如果它是导演的话)?如果没有,这里有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-24 18:51:34

为了做一个显式的Intent,我通常使用setComponent(),因为它保证工作(与任何事情一样多):

代码语言:javascript
复制
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标准。显然在这种情况下,它没有。¯\_(ツ)_/¯

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51012588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档