Java putExtra()不';行不通

Java putExtra()不';行不通,java,android,android-intent,android-activity,Java,Android,Android Intent,Android Activity,我的问题是在3个活动之间传递一个字符串。我解释了我是如何做到的 第一个活动叫做loginActiviy,我在这里做这件事 //OnCreate ecc before this @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { data.putExtra("Name", Name); super.onActivityResult(reque

我的问题是在3个活动之间传递一个字符串。我解释了我是如何做到的

第一个活动叫做loginActiviy,我在这里做这件事

  //OnCreate ecc before this
     @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
     data.putExtra("Name", Name);
     super.onActivityResult(requestCode, resultCode, data);
 }

 public void onResume()
 {
     super.onResume();
     finish();
 }
当活动结束时称为finish()(这可能是我不知道的问题),然后控制传递到第一个活动,我在那里执行此操作

    //OnCreate ecc before
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Bundle extras = data.getExtras();
    String name = null;
    if(extras != null) {
        name = extras.getString("Name");
    }
    super.onActivityResult(requestCode, resultCode, data);
    try
    {
        Intent people = new Intent(this, MainPeopleActivity2.class);
        people.putExtra("Name", name);
        startActivity(people);
        this.finish();
    }
    catch(Exception e)
    {
        Toast.makeText(getApplicationContext(), e, Toast.LENGTH_LONG).show();
    }
}
现在开始第三项活动,从何处获取这样做的意图

        String name;
    if (savedInstanceState == null) {
        Bundle extras = getIntent().getExtras();
        if(extras == null) {
            name= null;
        } else {
            name= extras.getString("Name");
        }
    } else {
        name = (String) savedInstanceState.getSerializable("Name");
    }
但正如您可以想象的那样,情况并非如此,字符串是空的

我错在哪里?提前谢谢

这是完整的登录类

                public void onSuccess(LoginResult loginResult) {
                GraphRequest.newMeRequest(
                        loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject user, GraphResponse response) {
                                if (response.getError() != null) {
                                } else {
                                    id = user.optString("id");
                                    firstName = user.optString("first_name");
                                    lastName = user.optString("last_name");
                                    email = user.optString("email");
                                    Log.i(TAG,"User ID "+ id);
                                    Log.i(TAG,"Email "+ email);
                                }
                                Name = firstName + " " + lastName;
                                Toast.makeText(getApplicationContext(), "Log in with " + Name, Toast.LENGTH_LONG).show();
                            }
                        }).executeAsync();
        }

下面是您可以修复问题并使代码正常工作的方式

在ActivityResult()上,您需要的唯一位置是活动A(第一个活动)

该过程的第一步是使用
startActivityForResult()
,可能从
onCreate()
启动您的LoginActivity:

然后,在此类中设置
onActivityResult()
方法,该方法将处理LoginActivity的结果,并将名称发送给MainPeopleActivity2:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //check request code and result code:
    if (requestCode == 999 && resultCode == RESULT_OK) {
        //get the extras:
        Bundle extras = data.getExtras();
        String name = null;
        if (extras != null) {
            name = extras.getString("Name");
            try {
                Intent people = new Intent(this, MainPeopleActivity2.class);
                people.putExtra("Name", name);
                startActivity(people);
                //this.finish();
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
            }
        }
    }
}
然后,LoginActivity中的
onSuccess()
方法需要在此处添加一些代码。通过调用
setResult()
,将名称发送回第一个活动:

然后,您将能够在
onCreate()
中的MainPeopleActivity2活动中成功获取名称:


将结果从被调用的活动传递回调用活动的正确方法是在被调用的活动中使用Activity.setResult(int,Intent:,android.content.Intent)


调用活动必须调用startActivityForResult(),而不是startActivity(),才能返回结果。

在第一个活动中,为什么要从
onResume()调用
finish()
?您到底在做什么还不清楚。您在哪里调用startActivityForResult()
?为什么不自动停止@TDGI从未调用startActivityForResult()方法@DanielNugent@MicheleLacorte如果从未调用startActivityForResult(),则onActivityResult()方法不会执行任何操作。这意味着您对
data.putExtra(“Name”,Name)的调用
永远不会执行,因此在另一个活动中,您永远不会获得
name
变量中的数据。我用重要的位给出了简短的答案,他给出了长的答案。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //check request code and result code:
    if (requestCode == 999 && resultCode == RESULT_OK) {
        //get the extras:
        Bundle extras = data.getExtras();
        String name = null;
        if (extras != null) {
            name = extras.getString("Name");
            try {
                Intent people = new Intent(this, MainPeopleActivity2.class);
                people.putExtra("Name", name);
                startActivity(people);
                //this.finish();
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
            }
        }
    }
}
public void onSuccess(LoginResult loginResult) {
    GraphRequest.newMeRequest(
            loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject user, GraphResponse response) {
                    if (response.getError() != null) {
                        //process error
                    } else {
                        id = user.optString("id");
                        firstName = user.optString("first_name");
                        lastName = user.optString("last_name");
                        email = user.optString("email");
                        Log.i(TAG,"User ID "+ id);
                        Log.i(TAG, "Email " + email);

                        Name = firstName + " " + lastName;
                        Toast.makeText(getApplicationContext(), "Log in with " + Name, Toast.LENGTH_LONG).show();

                        //adding this:
                        Intent i = new Intent();
                        i.putExtra("Name", Name);
                        LoginActivity.this.setResult(RESULT_OK, i);
                        LoginActivity.this.finish();
                    }


                }
            }).executeAsync();
}
public class MainPeopleActivity2 extends ActionBarActivity {

    String name;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_MainPeopleActivity2);

        if (savedInstanceState == null) {
            Bundle extras = getIntent().getExtras();
            if(extras == null) {
                name= null;
            } else {
                name= extras.getString("Name");
            }
        } else {
            name = (String) savedInstanceState.getSerializable("Name");
        }

    }

  //...... rest of the code in this class