为什么 PendingIntent 不发回我的 Intent 自定义 Extras 设置?
这个问题在某种程度上与我寻找
我已订阅接收 ProximityAlerts,并且已明确构建意图以包含一些额外内容。但当我获得服务时,附加服务不存在。
在答案之后是工作代码:
Intent intent = new Intent(this, PlacesProximityHandlerService.class);
intent.setAction("PlacesProximityHandlerService");
intent.putExtra("lat", objPlace.getLat());
intent.putExtra("lon", objPlace.getLon());
intent.putExtra("error_m", objPlace.getError()+ALERT_RANGE_IN_METERS);
PendingIntent sender=PendingIntent.getService(this, 0, intent, 0);
LocationUtils.addProximity(this, objPlace.getLat(), objPlace.getLon(),objPlace.getError()+ALERT_RANGE_IN_METERS, -1, sender);
文档说参数为每个位置更新发送的PendingIntent
This questions somehow relates to the question when I was looking to get the extras back in startActivityForResult but now I face another challenge.
I have subscribed to receive ProximityAlerts and I have explicitly constructed the Intent to include some Extras. But when I got the service the extras are not there.
After the answers here is the working code:
Intent intent = new Intent(this, PlacesProximityHandlerService.class);
intent.setAction("PlacesProximityHandlerService");
intent.putExtra("lat", objPlace.getLat());
intent.putExtra("lon", objPlace.getLon());
intent.putExtra("error_m", objPlace.getError()+ALERT_RANGE_IN_METERS);
PendingIntent sender=PendingIntent.getService(this, 0, intent, 0);
LocationUtils.addProximity(this, objPlace.getLat(), objPlace.getLon(),objPlace.getError()+ALERT_RANGE_IN_METERS, -1, sender);
The documentation says param PendingIntent to be sent for each location update
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
由于某些未指定的原因,仅当您设置了某些操作(例如 setAction("foo"))时才会传递额外内容。如果您尚未设置 FLAG_ONE_SHOT,CommonsWare 所指的内容仅在获取 PendingIntent 实例时适用。这可以通过 PendingIntent.get... 工厂方法中的 requestCode 参数来修复。虽然文档说它目前还没有使用,但实际上在区分 PendingIntents 时它会被考虑在内。
就您而言,除了一些虚拟操作字符串之外,您不需要设置任何其他内容。 LocationManagerService 重用您为接近警报订阅的 PendingIntent,并且仅在手机进入或退出警报范围时添加标记。
For some unspecified reason, extras will be delivered only if you've set some action, for example setAction("foo"). What CommonsWare refers to applies only when obtaining PendingIntent instances, if you haven't set FLAG_ONE_SHOT. That can be fixed by the requestCode argument in PendingIntent.get... factory methods. Although documentation says it's currently not used, it actually takes into count when distinguishing PendingIntents.
In your case, you don't need to set anything else than some dummy action string. LocationManagerService reuses the PendingIntent you have subscribed for proximity alerts, and only adds a flag if phone has entered or exited the alarm range.
如果您有多个未完成的
PendingIntents
,则需要确保基础Intents
的差异不仅仅是其额外内容。否则,Android 将继续重用您为第一个Intent
创建的第一个PendingIntent
,并始终使用第一个Intent
的额外内容。例如,您可以通过
setAction()
添加一个独特的操作——这不会改变您的Intent
路由(因为您正在指定组件),但它会使您的意图
不同。If you have multiple outstanding
PendingIntents
, you need to make sure that the underlyingIntents
differ on more than their extras. Otherwise, Android will keep reusing the firstPendingIntent
you created for your firstIntent
, using that firstIntent
's extras all of the time.For example, you could add a unique action via
setAction()
-- that will not change yourIntent
routing (since you are specifying the component), but it will make yourIntents
different.我遇到了这个问题,我发现的解决方案非常简单,尽管我无法解释它为什么有效。
最初,我的待处理意图如下所示:
当创建这样的意图时,单击通知时不会传递额外内容,接收活动中的额外映射将为空。我对初始化 notificationIntent 的行进行了以下更改:
现在,额外内容已填充到接收活动中。再说一遍,我无法解释为什么它有效,但它解决了我的问题。
I had this problem and the solution I found was quite simple, though I can't explain why it worked.
Initially my pending intent looked like this:
When creating the intent like this, no extras would be passed when the notification was clicked, the extras map would be empty in the receiving activity. I made the following change to the line initializing the notificationIntent:
Now the extras are populated in the receiving activity. Again, I can't explain why this works but it fixed my problem.
没有一个答案对我有用。将操作设置为特定字符串第一次有效,但如果稍后使用具有不同附加功能的相同通知,则它将不起作用。我用随机生成的字符串替换了
setAction
方法的字符串,并且它的工作没有任何问题:None of the answers worked for me. Setting action to a specific string works for the first time but if you use the same notification with different extras at a later time, it would not work. I replaced the string for the
setAction
method with a randomly generated one and it works without any issues:nextInt()
关键是在调用之前之前将额外内容和唯一操作设置到意图中,
如果在调用上述内容之后之后将额外内容和操作设置到意图中,则不会起作用。
这将不起作用:
The key is to set the extras and the unique action into the intent before calling
if you set the extras and action into the intent after calling the above, it won't work.
This will not work: