【问题标题】:Why the PendingIntent doesn't send back my custom Extras setup for the Intent?为什么 PendingIntent 不发回我的 Intent 自定义 Extras 设置?
【发布时间】:2011-03-08 20:43:09
【问题描述】:

这个问题在某种程度上与我寻找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);

文档说参数PendingIntent to be sent for each location update

【问题讨论】:

    标签: android android-intent extras


    【解决方案1】:

    如果您有多个未完成的PendingIntents,您需要确保底层Intents 的不同之处不仅仅是它们的附加值。否则,Android 将继续重复使用您为第一个 Intent 创建的第一个 PendingIntent,并始终使用第一个 Intent 的附加内容。

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

    【讨论】:

    • 我也能够让它与 setAction 一起工作。在我的例子中,我为每个 setAction 调用创建了一个唯一的字符串。
    • PendingIntent.FLAG_ONE_SHOT 怎么样?我认为这解决了问题。
    • @Sotti: FLAG_ONE_SHOT 表示PendingIntent 只能执行一次。现在,理想情况下,这意味着尝试在等效的Intent 上创建一个新的PendingIntent 将返回一个不同的PendingIntent...而且它可能会返回。但是,这不是记录在案的行为,因此我不愿推荐FLAG_ONE_SHOT。现在,关于这个问题的公认答案说它有效,并且得到了相当多的支持,所以也许它是安全的。就个人而言,鉴于 Google 的往绩记录,我倾向于在这种边缘情况下有点保守。
    【解决方案2】:

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

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

    【讨论】:

    • 我试过了,但没有用。我首先对我的意图设置了一个操作,然后是附加功能,然后我创建了一个挂起的意图,该意图触发一个广播接收器,该接收器使用警报管理器触发它
    【解决方案3】:

    关键是在调用前调用

    的意图中设置额外的和唯一的动作
    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());  
    

    【讨论】:

      【解决方案4】:

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

      最初我的待处理意图如下所示:

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

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

      【讨论】:

      • 我绝望地尝试了这个,令人惊讶的是它起作用了......查看代码,似乎没有任何理由这样做会有所不同。叹息。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-31
        • 2014-11-16
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        相关资源
        最近更新 更多