将警报广播发送到动态注册的接收器

时间:2015-02-25 00:49:06

标签: android broadcastreceiver alarmmanager

我有一个匿名的班级广播接收器:

private BroadcastReceiver mMyReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateStuff();
    }
};

我注册并创建待定意图:

创建待定意图并注册接收器

context.registerReceiver(mMyReceiver, new IntentFilter());
Intent intent = new Intent(context, mMyReceiver.getClass());
mMyIntent = PendingIntent.getBroadcast(context, 0,
        intent, PendingIntent.FLAG_UPDATE_CURRENT);

并设置闹钟(update stuff'):

mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, next, mMyIntent);

意图永远不会传递给接收者。警报已设置并定位接收器MyClass$1(这是父类中唯一的匿名类)。警报触发,但接收者没有收到意图。我在这里做错了什么?

4 个答案:

答案 0 :(得分:1)

评论是正确的!

Intent intent = new Intent(context, mMyReceiver.getClass());

在这一行中你使用的是隐式意图,只需将其替换为:

Intent intent = new Intent();

它会正常工作。

答案 1 :(得分:1)

您必须在清单文件中声明接收者,以及"动作"过滤器,或者您必须在" IntentFilter"中包含该操作。您在动态注册接收器时创建的。如图所示,您的代码会创建一个与任何意图都不匹配的空IntentFilter。

然后,在为闹钟创建PendingIntent时,您必须设置Intent的动作以匹配您在过滤器中放置的动作。

这不是关于隐式/显式意图,正如其他一些答案似乎暗示的那样。仅当您不知道目标类/包应该是什么时,才应使用隐式意图。在这种情况下,您知道目标类,因此您应该使用显式意图。

请参阅此答案:https://stackoverflow.com/a/3184182

答案 2 :(得分:0)

你走了: http://onemikro2nd.blogspot.com/2013/09/darker-corners-of-android.html

我认为这是不可能的。我自己没有尝试过,而是环顾四周,看看是否有可能并找到上面的链接。

答案 3 :(得分:0)

我可能迟到了,但最近我尝试做同样的事情并且它使用了意图行动。

Intent broadcastIntent = new Intent();
broadcastIntent.setAction(Action_here);

所以在注册意图时使用: -

registerReceiver(mMyReceiver, new IntentFilter(Action_here));

为我工作。