onActivityResult与启动模式的问题

本文解析了一个关于onActivityResult方法的异常现象,即当ActivityB被以SingleTask模式启动时,从ActivityA启动ActivityB并期望回调数据的过程中,onActivityResult方法提前执行的问题。通过调整启动模式为Standard,成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.onActivityResult方法的作用:

        当我们想要从Activity A启动到Activity B,并且B结束之后(finish),需要再返回给A一定的数据的时候,就会用到这个方法。今天在写项目中正好遇到这样的需求,于是想要利用这个方法做一下。结果在Debug的时候发现出了问题,在调用启动B的代码的时候,onActivityResult方法首先被执行了,而不是先执行B中的代码,经过长时间的检查代码,发现并没有什么问题,很是郁闷,直到最后才想起来,项目开始的时候我修改过B的启动模式为SingleTask,于是赶紧查阅资料,发现问题果然出在这里...

        下面是我的代码:

Activity A:

public class MainActivity extends Activity implements OnClickListener{


private ListView mLvContact;
private ImageButton mIBAdd;
private DaoConfig config;
private DbUtils mDbUtils;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initContact();
initView();
}


private void initContact() {
//创建数据库
config=new DaoConfig(this);
config.setDbName("ContactDemo");
config.setDbVersion(1);
if(mDbUtils==null){
mDbUtils=DbUtils.create(this);//db还有其他的一些构造方法,比如含有更新表版本的监听器的
mDbUtils.configAllowTransaction(true);
}
try {
mDbUtils.createTableIfNotExist(UserItem.class);
} catch (Exception e) {
e.printStackTrace();
}
}


private void initView() {
mLvContact=(ListView)findViewById(R.id.lv_contact);
mIBAdd=(ImageButton)findViewById(R.id.ib_add_contact);

mIBAdd.setOnClickListener(this);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ib_add_contact:
//添加联系人
Intent intent=new Intent(this,AddActivity.class);
startActivityForResult(intent, 1001);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1001&&resultCode==RESULT_OK){
//UserItem userItem=(UserItem) data.getSerializableExtra("user");
Toast.makeText(this, "hellow", 1).show();
try {
//保存联系人
// mDbUtils.save(userItem);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}



    Activity  B:

public class AddActivity extends Activity implements OnClickListener{
private EditText mEtName;
private ImageButton mBtSave;
private DbUtils mDbUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activty_add);
initViews();
}


private void initViews() {
mEtName=(EditText)findViewById(R.id.et_name);
mBtSave=(ImageButton)findViewById(R.id.ib_add_contact);

mBtSave.setOnClickListener(this);
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ib_add_contact:
//保存数据,将数据传回MainActivity
try {
String name=mEtName.getText().toString();
if(TextUtils.isEmpty(name)){
Toast.makeText(this, "姓名不能为空", 1).show();
}
//获得一个UserItem传给MainActivity
/*UserItem userItem=new UserItem();
userItem.setUserName(name);*/
Intent intent=new Intent();
// intent.putExtra("user", userItem);
setResult(RESULT_OK, intent);
finish();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}


启动模式修改为standard,发现运行正常,bug去除~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值