从活动中传递一个意图

Pass an intent from Activities

我正在实施 LoginActivity 在线注册新帐户。登录或注册后,我开始一个新的意图并尝试将新帐户数据传回 MainActivity:

Toast.makeText(context,"SUCCESS",Toast.LENGTH_LONG).show();
    finish();
    Intent myIntent = new Intent(LoginActivity.this, MainActivity.class);
        myIntent.putExtra("username",mUsername);
        myIntent.putExtra("email",mEmail);                  
    LoginActivity.this.startActivity(myIntent);

我的想法是我想在 MainActivity 中接收数据,以便我可以在导航抽屉的 header 中添加用户名和电子邮件。在 MainActivity 里面我有字段:

public class MainActivity extends ActionBarActivity{
    String NAME = "Sign in";
    String EMAIL = "";

  //... ... ...  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  //... ... ...  

    Intent intent = getIntent();
    if(intent.getStringExtra("username")!=null){
        setAccount(intent);
    }
    firstTime();
  }
  public void setAccount(Intent intent){
        NAME = intent.getStringExtra("username");
        EMAIL = intent.getStringExtra("email");
  }   
}    

}

但在我 login/register 之后,意图不会将我的数据返回到 MainActivity...

有什么问题?

* ***编辑* ***

我实现了这个:

Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, PICK_ACCOUNT_REQUEST);

而不是

startActivity(new Intent(this, LoginActivity.class));
finish();

In LoginActivity inside onPostExecute() (我用的是AsyncTask):

Intent myIntent = new Intent(LoginActivity.this, MainActivity.class);
finish();
myIntent.putExtra("username",mUsername);
myIntent.putExtra("email",mEmail)
setResult(1, myIntent);
LoginActivity.this.startActivity(myIntent);

再次在 MainActivity 中我实现了 onActivityResult() 方法,但是当它执行时 Intent data 收到的结果为空。我的代码有什么问题?

* EDIT2 *

我按照@lqbal 的建议通过删除 LoginActivity.this.startActivity(myIntent) 解决了这个问题:

Intent returnIntent = new Intent();
 returnIntent.putExtra("username",mUsername);
 returnIntent.putExtra("email",mEmail);
 setResult(RESULT_OK,returnIntent);
 finish();

但是还有一个问题:onActivityResult() 方法中,我尝试将接收到的数据分配给 class' 字段,但没有成功。下面有更多详细信息。

MainActivity开头class我赋值了两个变量:

String NAME = "Sign in", EMAIL = "";

这两个值已插入我的导航抽屉中。因此,在收到 LoginActivity 的结果后,我想更新导航抽屉中的这两个字段并向用户显示其用户名和密码,我尝试这样做:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    // Check which request we're responding to
    if (requestCode == PICK_ACCOUNT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            String usr = data.getStringExtra("username");
            String mal = data.getStringExtra("email");
            this.NAME = usr;this.EMAIL=mal;
        }
    }
}

没有成功,实际上在 LoginActivity 完成后我仍然想象旧值。为什么?

finish();放在startActivity()

之后

使用 startActivityForResult(); 启动 activity 以获取从启动 activity 返回到启动 activity 的结果。

编辑: 按照这个,它会解决你的问题

Intent returnIntent = new Intent();
returnIntent.putExtra("username",mUsername); 
returnIntent.putExtra("email",mEmail); 
setResult(RESULT_OK,returnIntent);
finish();

您正在启动 activity 以获得结果,因此只需创建一个意图、设置结果并完成 activity,无需再次启动 activity。