Android startActivityForResult和Intent Extras,似乎Extras没有被推回

Android startActivityForResult和Intent Extras,似乎Extras没有被推回,android,android-intent,extras,Android,Android Intent,Extras,我有以下代码: Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setData(ContactsContract.Contacts.CONTENT_URI); intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag()); startActivityForResult(intent, P

我有以下代码:

Intent intent = new Intent();
        intent.setAction(Intent.ACTION_PICK);
        intent.setData(ContactsContract.Contacts.CONTENT_URI);
        intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());
        startActivityForResult(intent, PICK_CONTACT);
然后在答复时:

public void onActivityResult(int reqCode, int resultCode, Intent data) {


        switch (reqCode) {
            case (PICK_CONTACT):
                if (resultCode == Activity.RESULT_OK) {
                    try {
                        Uri contactData = data.getData();
                        String onlineid = data.getStringExtra(EXTRA_ONLINE_ID);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
        super.onActivityResult(reqCode, resultCode, data);
    }
onlineid
变量为空。我如何传递一个值,然后将其接收回来

编辑

我甚至试过

Bundle extras = data.getExtras(); // returns null

确定检查您的活动android:launchMode是否配置为SingleTask或SingleInstance!这一定是问题所在:)

我在这方面也遇到了一些问题

而不是这条线

 intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());
试一试


必须在使用setResult启动的活动中设置额外的在线ID字段。如果它没有在返回的意图中设置该值(与您发送的不同),那么您将得到一个空值。

这是通过设计完成的;系统活动不会发回调用它们的额外数据,因此您必须在其他地方管理数据

幸运的是,
resultCode
参数完全由您自己控制,这意味着您可以使用它来索引数据

private final int PICK_CONTACT = 0;
private Bundle[] myDataTransfer = { null };

...

Bundle myData = new Bundle();
myData.putString(EXTRA_ONLINE_ID, (String) v.getTag());
myDataTransfer[PICK_CONTACT] = myData;
// create intent and all
startActivityForResult(intent, PICK_CONTACT);

...

public void onActivityResult(int reqCode, int resultCode, Intent data) {
    if (resultCode == PICK_CONTACT) {
        Bundle myData = myDataTransfer[resultCode];
        String onlineid = myData.getString(EXTRA_ONLINE_ID);
    }
}

我不是Java程序员,必须有更好的方法来实现捆绑包映射,但这是可行的:)

检查活动的结果代码必须是-1。结果_好的,如果是,则会进入该状态,但额外的是空的。嗨,奔腾10,你解决了这个问题吗?我认为您的代码中的一切都正常:SI未解决。我认为我们传递给其他活动的自定义附加内容没有保留。正如您所看到的,它使用的Contacts contract.Contacts.CONTENT\u URI不是我的代码库的一部分。我想这是情不自禁的。问题是,为什么要返回您已经拥有的数据。启动活动时,您的活动可能会被终止。因此,索引将消失。我认为您需要将捆绑包保存在应用程序内存之外的某个位置。若要通过@rumpel添加到注释中,您可以通过进入“设置”>“开发人员选项”并启用“不保留活动”来测试这一点。通过这种方式,您将能够测试此用例,并发现myDataTransfer中的数据将被删除,除非您在OnSaveInstanceState中手动保存/还原。这在最佳情况下甚至不起作用,因为在您混合了requestCode和resultCode。正确的签名是:onActivityResult(int requestCode,int resultCode,Intent data),请求代码将始终是PICK\u CONTACT,结果代码通常是Activity。RESULT\u OK==-1。@Gavriel我很久没有接触这个答案了;你可能是对的,在这种情况下,当你发现或编辑一个新的答案时,你可以考虑写一个新的答案:
private final int PICK_CONTACT = 0;
private Bundle[] myDataTransfer = { null };

...

Bundle myData = new Bundle();
myData.putString(EXTRA_ONLINE_ID, (String) v.getTag());
myDataTransfer[PICK_CONTACT] = myData;
// create intent and all
startActivityForResult(intent, PICK_CONTACT);

...

public void onActivityResult(int reqCode, int resultCode, Intent data) {
    if (resultCode == PICK_CONTACT) {
        Bundle myData = myDataTransfer[resultCode];
        String onlineid = myData.getString(EXTRA_ONLINE_ID);
    }
}