Intent intent1 = new Intent(this, ChooseShiperAndCargoActivity.class);
intent1.putExtra("titleStr","发货人");
intent1.putExtra("flag",1);
startActivityForResult(intent1,1003);
Intent in = new Intent();
in.putExtra("id",list.get(position).id);
in.putExtra("name",list.get(position).name);
setResult(RESULT_OK,in);
AppManager.getAppManager().finishActivity(ChooseShiperAndCargoActivity.this);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK){
if (requestCode == 1003){
fahuoId = data.getIntExtra("id",0);
tv_fahuo.setText(data.getStringExtra("name"));
}
}
}
代码完全没有任何问题,但是调试的时候发现我调用了startActivityForResult之后直接就进入了 onActivityForResult里面,这明显不对啊。正确的顺序应该是:startActivityForResult --》setResult--》onActivityForResult。
看到这里我真心无语了,代码没错,但是执行顺序不对。那么问题很可能就出在我的activity的launchMode,果不其然,在我的manifest文件里面,我对应的两个activity都是配置的singleTask,去掉之后就完全没有问题啦。
然后自己又去学习了下关于launchMode的相关东西,它有4种模式:
singleTop :对于singleTop模式的Activity,如果被调用的任务已经有一个这样的activity在堆栈的顶端,那么不会有新的实例创建,任务会使用当前顶端的activity实例来处理Intent对象。换句话说,如果被调用的任务包含一个不再堆栈顶端的singleTop Activity,或者堆栈顶端为singleTop 的activity的任务不是当前被调用的任务,那么,任然会有一个新的对象会被创建。
standard:standard模式的activity在被调用时会创建一个新的实例,所有的实例处理同一个Intent对象。
注:standard和singleTop属性的activity的实例可以属于任何Task,并且可以位于堆栈的任何位置。
singleInstance:对于singleInstance模式的activity,Task堆栈中如果有这样的activity,那么它将是堆栈中唯一的activity,当前任务收到的Intent都由它处理,由它开启的其他的activity将在其它任务被启动。
singleTask:对于singleTask模式的activity,它在堆栈的底端,其上方可以有其他的activity被创建,但是,如果发给该activity的Intent对象来时该Activity不再堆栈顶端,那么该Intent对象将被丢弃,但是界面还是会切换到当前的Activity。
注:singleTask和singleInstance仅可用于启动任务的情况,这两种模式下的activity会处在堆栈的最底端,并且一个任务只能被实例化一次。
本博客只用来记录自己学习的点点滴滴,同时也是将自己的心得体会分享给大家,不喜勿喷。一切为了学习!