36

这个问题在某种程度上与我希望在 startActivityForResult 中获得额外内容时的问题有关,但现在我面临另一个挑战。

我已订阅接收 ProximityAlerts,并且我已明确构建 Intent 以包含一些 Extras。但是当我得到服务时,额外的东西不在那里。

这里的答案是工作代码:

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 to be sent for each location update

4

5 回答 5

43

由于某些未指定的原因,仅当您设置了某些操作(例如 setAction("foo"))时才会提供附加功能。CommonsWare 所指的内容仅适用于获取 PendingIntent 实例时,如果您尚未设置 FLAG_ONE_SHOT。这可以通过 PendingIntent.get... 工厂方法中的 requestCode 参数来解决。虽然文档说它目前没有被使用,但在区分 PendingIntents 时它实际上会考虑在内。

在您的情况下,除了一些虚拟操作字符串之外,您不需要设置任何其他内容。LocationManagerService 重用您为接近警报订阅的 PendingIntent,并且仅在手机进入或退出警报范围时添加标志。

于 2010-06-27T18:38:31.183 回答
26

如果您有多个优秀PendingIntents的,您需要确保底层证券的Intents差异超过了它们的附加值。否则,Android 将继续重用PendingIntent您为 first 创建的 first Intent,并一直使用该 firstIntent的 extras。

例如,您可以通过setAction()-- 添加一个独特的操作,这不会改变您的Intent路由(因为您正在指定组件),但它会让您Intents与众不同。

于 2010-06-27T17:58:46.077 回答
8

我遇到了这个问题,我找到的解决方案非常简单,但我无法解释它为什么会起作用。

最初我的未决意图如下所示:

     notificationIntent = new Intent(ctx, FragmentTabsPager.class);
     notificationIntent.setData(Uri.parse("content://com.sbs.mobile.workorder.WorkOrder/notes/"));
     notificationIntent.putExtra("NOTIFICATION", true);   
     notificationIntent.putExtra(WorkOrder.WorkOrderColumns.WORKORDERID, submessage);

当像这样创建意图时,单击通知时不会传递任何附加信息,附加信息映射在接收活动中将为空。我对初始化notificationIntent的行进行了以下更改:

     notificationIntent = new Intent().setClass(ctx, FragmentTabsPager.class);

现在,额外内容填充在接收活动中。同样,我无法解释为什么这有效,但它解决了我的问题。

于 2013-06-12T13:49:44.773 回答
2

关键是在调用 之前将附加项和唯一操作设置为意图

PendingIntent sender=PendingIntent.getService(this, 0, intent, 0);

如果您在调用上述内容后将附加功能和操作设置为意图,则它将不起作用。这将不起作用

Intent intent;  
PendingIntent sender=PendingIntent.getService(this, 0,   
   intent=new Intent(this, PlacesProximityHandlerService.class), 0);  

intent.setAction("PlacesProximityHandlerService");  
intent.putExtra("lat", objPlace.getLat());  
于 2011-04-20T14:19:30.580 回答
2

没有一个答案对我有用。第一次将操作设置为特定字符串有效,但如果您稍后使用具有不同附加功能的相同通知,它将不起作用。我用setAction随机生成的字符串替换了该方法的字符串,它可以正常工作:

intent.setAction(new Random().nextInt(50) + "_action");
  • 如果您认为您可能会经常使用通知(例如下载不同的文件),则将更大的数字传递给nextInt()
于 2017-01-28T08:06:27.003 回答