从onActivityResult intent中检索putExtra值

时间:2014-01-13 18:48:17

标签: android android-intent android-activity

我正在尝试将某些数据附加到intent上,然后再使用StartActivityForResult。

当意图在OnActivityForResult中返回时,我想访问我在意图中附加的数据。因此,我可以将意图中检索到的数据与数据库条目,容器ID等相关联。

不幸的是,返回的意图似乎与我开始的意图不同。我尝试在测试用例中比较(==)旧的和新的意图,结果失败,并且毫不奇怪,我尝试追加的数据不存在。是否有任何关于原始意图的链接?

我尝试过的基本想法:

psuedo代码中的StartActivityForResult代码:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
i.putExtra([-Key-], [int]);
i.putExtra([-Key-], [int]);
....
getParentFragment().startActivityForResult(i, requestCode); 

OnActivityResult的伪代码

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {

....        

    switch(requestcode){

    case RESULT_LOAD_IMAGE :

    //These always evaluate to default.  The intent returns with the picture,
    //and I process it fine (with default values), but any extra data i try to append 
    //to the intent is lost.  

    int rowId = intent.getIntExtra([-Key-], [-def_value-]);

            ....
            ....

    break;
    default:
        throw new RuntimeException();
    }
}

1 个答案:

答案 0 :(得分:5)

使用隐式Intent解析启动Activity时,执行此操作时正在执行此操作:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
....
getParentFragment().startActivityForResult(i, requestCode);

您无法保证实际选择哪种活动来执行操作。因此,您的Activity和Activity之间没有任何“契约”将用于执行所需的操作。不幸的是,这是使用隐式意图解析的一种不利之处。由于两个活动之间没有合同,因此您无法确定在onActivityResult()返回给您的结果中您将得到什么。

如果查看documentation for ACTION_PICK,它至少表明“应该”发生什么(如果所选活动实际上与文档读取的方式相同):

  

输入:getData()是包含数据目录的URI   (vnd.android.cursor.dir / *)从中选择一个项目。

     

输出:已挑选项目的URI。

这表示您应该提供一个包含数据目录的URI,并且您将返回一个Intent,其中包含所选项目的URI。而已。这就是你所能得到的一切。您可以在Intent中添加许多其他“额外内容”,并使用ACTION_PICK传递给活动,但该活动并不关心这些附加内容,只会忽略它们。执行ACTION_PICK的活动将创建一个新的Intent,其中包含所选项目的URI并将其传回给您。它没有通过原来的Intent。 “输入Intent”和“输出Intent”完全不同,彼此之间没有任何关系。

要解决您的问题,我建议您创建一个唯一的整数requestCode,并将您的“额外内容”保存在与Activity相关联的requestCode的表格或地图中。然后,您可以使用ACTION_PICK启动requestCode活动。在onActivityResult()中,您可以使用返回的requestCode参数来查找您保存的“额外内容”,并且您可以将返回的URI与它们相关联。

注意:还有一件事:当您致电startActivityForResult()时,您的活动将暂停,启动的活动将会启动。在调用onActivityResult()之前,您的活动将不会恢复。这意味着您在任何给定时间只能有一个ACTION_PICK待定。因此,您可能不需要将特定PICK操作与任何给定数据相关联。