《android第一行代码》里面的第二章2.3.5
Activity中有一个startActivityForResult()方法也是用于启动活动(Activity)的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
startActivityForResult()方法接收两个参数,第一个参数是Intent,第二个参数是请求码requestCode,用于在之后的回调中判断数据的来源。
比如 A 活动(Activity)里面其中一个按钮
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(A.this, B.class);
//1 其实就是 requestCode 请求码 传入了唯一值 1
startActivityForResult(intent, 1);
}
});
由以上我们跳转到 B 活动(Activity)
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("data_string", "hello titleColor");
//RESULT_OK 这个值相当于 onActivityResult方法里面的resultCode
setResult(RESULT_OK, intent);
finish();
}
});
我们看到 B 活动(Activity) 点击该按钮之后,我们还是构建了一个Intent ,只不过Intent只是用于传递数据而已,它没有任何的‘意图’。紧接着把要传递的数据存放在Intent中,然后调用setResult()方法。是专门用于向上一个活动(Activity)返回数据的。setResult方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一半只用RESULT_OK或者 RESULT_CANCELED这两个值,第二个参数则是把带有数据的Intent传递回去,然后调用finish()方法来销毁当前的活动。
由于我们使用startActivityForResult()方法来启动 B 活动 (Activity)的 ,再 B 活动(Activity)被销毁之后会回调上一个 A 活动 (Activity)的onActivityResult()方法,因此我们要在 A 活动
(Activity)中重写这个方法来得到返回的数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String dataString = data.getStringExtra("data_string");
System.out.println("resultCode" + dataString);
Toast.makeText(this, dataString, Toast.LENGTH_SHORT).show();
}
break;
}
}
onActivityResult()方法有三个参数,第一个参数requestCode,即我们在启动活动时传入的请求码,第二个参数resultCode,即我们在返回数据时传入的处理结果。第三个参数data,即携带着返回数据的Intent。由于在一个活动中有可能调用satarActivityResult()这个方法中,因此我们首先要做的就是通过检查requestCode的值来判断数据来源。确定数据是从B活动返回的之后,我们再通过resuletCode的值来判断处理结果是否成功。最后从data中取值,这样就完成了向上一个活动返回数据的工作。