为什么PendingIntent不发送我的自定义附加设置的意图?

这个问题在某种程度上与我想要在startActivityForResult中获得额外资源的问题有关,但现在我面临另一个挑战。

我已经订阅接收ProximityAlerts,我已经明确地构build了包含一些额外的意图。 但是当我得到服务的时候,临时演员不在场。

在这里的答案是工作代码:

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

Solutions Collecting From Web of "为什么PendingIntent不发送我的自定义附加设置的意图?"

对于某些未指定的原因,只有在设置了某些操作(例如setAction(“foo”))后才会提供额外function。 CommonsWare引用的仅适用于获取PendingIntent实例时,如果您尚未设置FLAG_ONE_SHOT。 这可以通过PendingIntent.get …工厂方法中的requestCode参数来解决。 尽pipe文档说目前没有使用它,但在区分PendingIntents时实际上需要进行计数。

在你的情况下,你不需要设置任何东西比一些虚假的行动string。 LocationManagerService重复使用您已订阅接近警报的PendingIntent,并且仅在电话已进入或退出警报范围时才添加标志。

如果您有多个未完成的PendingIntents ,则需要确保基础Intents差异超过其额外值。 否则,Android将不断重复使用您为第一个Intent创build的第一个PendingIntent ,并使用第一个Intent的额外部分。

例如,你可以通过setAction()添加一个独特的动作 – 不会改变你的Intent路由(因为你正在指定组件),但是它会使你的Intents不同。

我有这个问题,我发现的解决scheme很简单,但我无法解释为什么它的工作。

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

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

当像这样创build意图时,单击通知时不会传递额外信息,接收活动中的额外地图将为空。 我对初始化notificationIntent的行进行了以下更改:

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

现在接收活动中已经有了额外的人员。 再次,我不能解释为什么这个工程,但它解决了我的问题。

关键是调用之前将额外和独特的行为设置为意图

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

没有答案为我工作。 将动作设置为特定的string是第一次工作,但是如果稍后使用相同的具有不同额外的通知,则不起作用。 我用随机生成的setAction方法replace了string,它没有任何问题:

 intent.setAction(new Random().nextInt(50) + "_action"); 
  • 如果你认为你可能会使用这个通知(比如下载不同的文件),那么把一个更大的数字传给nextInt()