我有一个匿名的班级广播接收器:
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
(这是父类中唯一的匿名类)。警报触发,但接收者没有收到意图。我在这里做错了什么?
答案 0 :(得分:1)
评论是正确的!
Intent intent = new Intent(context, mMyReceiver.getClass());
在这一行中你使用的是隐式意图,只需将其替换为:
Intent intent = new Intent();
它会正常工作。
答案 1 :(得分:1)
您必须在清单文件中声明接收者,以及"动作"过滤器,或者您必须在" IntentFilter"中包含该操作。您在动态注册接收器时创建的。如图所示,您的代码会创建一个与任何意图都不匹配的空IntentFilter。
然后,在为闹钟创建PendingIntent时,您必须设置Intent的动作以匹配您在过滤器中放置的动作。
这不是关于隐式/显式意图,正如其他一些答案似乎暗示的那样。仅当您不知道目标类/包应该是什么时,才应使用隐式意图。在这种情况下,您知道目标类,因此您应该使用显式意图。
答案 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));
为我工作。