我正在尝试将某些数据附加到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();
}
}
答案 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操作与任何给定数据相关联。