有没有遇见过一个页面点击后进入下一个页面,然后在下一个,再下一个。到最后的时候返回上一个界面,但上一个界面已经被finish了,以前就索性把这个界面的初始传到下一个界面,返回时,再重新传入。这样做虽然可以恢复上一个页面的数据,但并不符合我们的要求。使用startActivityForResult,前一个Activity便会有一个等待后一个Activity的返回,根据返回的数据进行下一步操作,而不影响前一个Activity(如用户当前输入等)
实现过程:
1、在Intent中设置要跳转到的Activity,并通过Bundle把需要处理的数据放到Intent中
intent.setClass(MainActivity.this, OtherActivity.class);
bundle = new Bundle();
bundle.putString("Test", "good");
intent.putExtras(bundle);
startActivityForResult(intent, 1);
2、将startActivity(intent)跳转改成使用startActivityForResult(intent, 1);跳转,并重写onActivityResult(int requestCode, int resultCode, Intent data)方法
小注: a、startActivityForResult(intent, 1)方法中的1是下一个Activity要返回值的依据,这个值必须要大于0,否则Activity中的onActivityResult不会响应
b、onActivityResult方法是用来处理并接收次Activity返回的数据,接收后可更新ui
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case 1:
Toast.makeText(MainActivity.this,
data.getExtras().getString("Test").toString(), 2000).show();
break;
case 2:
Toast.makeText(MainActivity.this,
data.getExtras().getString("Test").toString(), 2000).show();
break;
}
}
3、在次Activity中接收并处理消息,然后将处理的消息通过bundle绑定intent的方式返回给第一个Activity
Intent intent = OtherActivity.this.getIntent();
Bundle bundle = intent.getExtras();
intent.putExtra("Test", bundle.getString("Test") + " boy");
OtherActivity.this.setResult(1, intent);
OtherActivity.this.finish();
注:1、一个主Activity中可跳转到多个次Activity,做对应处理时,在次Activity的setResult(1,intent)中设置好标识符(这里设置为1),然后在主Activity中的onActivityResult方法中根据resultCode做相应的处理
2、项目中出现问题,报错“WARN/ActivityManager(67): Activity is launching as a new task, so cancelling activity result.”,解决:原来是把次Activity的launchmode设置成了singleTask,去掉次Activity的launchmode就可以了
源码:定义了4个Activity,主activity跳转到其他2个时附带String good,第二个在接收到数据后将String +"boy"后返回给主Activity并Toast;第三个在接收到数据后将String +"boy&girl"后返回给主Activity并Toast。第4个采用intent跳转+finish当前Activity的方式进行Activity之间的跳转