为什么PendingIntent不会为Intent发回我的自定义Extras设置?

时间:2010-06-27 16:23:10

标签: android android-intent extras

当我期待get the extras back in 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);

文档说param PendingIntent to be sent for each location update

5 个答案:

答案 0 :(得分:42)

由于某些未指明的原因,只有在您设置了某些操作时才会传递额外内容,例如setAction(“foo”)。只有在未设置FLAG_ONE_SHOT时,CommonsWare引用的内容仅在获取PendingIntent实例时适用。这可以通过PendingIntent.get ... factory方法中的requestCode参数来修复。虽然文档说它当前没有使用,但在区分PendingIntents时它实际上需要计算。

在您的情况下,除了一些虚拟动作字符串之外,您不需要设置任何其他内容。 LocationManagerService重新使用您已预订接近警报的PendingIntent,并且仅在电话进入或退出警报范围时才添加标记。

答案 1 :(得分:23)

如果您有多个未完成的PendingIntents,则需要确保基础Intents的内容不同于其他内容。否则,Android将继续重复使用您为第一个PendingIntent创建的第一个Intent,并始终使用该Intent个附加内容。

例如,您可以通过setAction()添加一项独特的操作 - 这不会改变您的Intent路由(因为您指定了该组件),但它会使您的Intents不同。

答案 2 :(得分:7)

我遇到了这个问题,我发现的解决方案非常简单,但我无法解释它为何有效。

最初我的未决意图看起来像这样:

     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);

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

答案 3 :(得分:2)

这些答案都不适合我。将操作设置为特定字符串是第一次使用,但如果您稍后使用相同的通知和不同的附加功能,则它将无效。我用随机生成的方法替换了setAction方法的字符串,它没有任何问题:

intent.setAction(new Random().nextInt(50) + "_action");
  • 如果您认为可能会经常使用该通知(例如下载不同的文件),请将较大的数字传递给nextInt()

答案 4 :(得分:1)

关键是将额外内容和独特操作设置为意图 调用之前

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());