情景: Activity 1 启动Activity 2, 想要获取Activity2中的值返回给Activity1.
也就是三个步骤:
- Activity 1 启动Activity 2
- Activity 2 中给 Activity 1传值
- Activity 1 用onActivityResult获取返回值。
onActivityResult获取返回值有两种情况:
- Intent是显式(同一个应用内部的Activity之间切换)
- Intent是隐式(调取应用之外的活动等,比如发短信/打电话/发邮件等)
可以参考之前的笔记:https://www.jianshu.com/p/74441a115b42
对于显式Intent
我们知道,通常Activity A启动Activity B使用以下方法(不要返回值):
(Activity A中)
public void toSecond(View view) {
Intent intent=new Intent(this,SecondActivity.class);
startActivityForResult(intent);
}
那么要想得到SecondActivity的返回值应该怎么做呢?
(Activity A中):
final int RESULT_CODE=101;
final int REQUEST_CODE=1;
public void toSecond(View view) {
Intent intent=new Intent(this,SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
然后需要重写onActivityResult(int requestCode, int resultCode, Intent data) 方法, 其中:
- requestCode 是用于标识所启动的Activity的唯一标识符,和上面的REQUEST_CODE是同一个值,在onActivityResult方法中要与REQUEST_CODE进行比较以判断返回的是不是该Activity;
- resultCode是结果编号,Activity B 返回的键 (在显式Intent中,该值= REQUEST_CODE);
- data 就是所接受到的返回的值:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==REQUEST_CODE) {
if(resultCode==RESULT_CODE) {
String result=data.getStringExtra("second");
textView.setText(result);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
(Activity B中)
这个里面的RESULT_CODE、intent分别跟上段代码中onActivityResult()方法中的第二个、第三个参数相对应。
- RESULT_CODE 用户告诉对方自己的唯一标识符
- intent 用于发送内容
final int RESULT_CODE=101;
public void sendToFirstActivty(View view) {
Intent intent=new Intent();
intent.putExtra("second", "I am second!");
setResult(RESULT_CODE, intent);
finish();
}
对于隐式Intent
对于隐式Intent来说,调用的不是自己内部指定的Activity,处理方法中,只有一个区别: requestCode还有系统自带的一些参数:表示成功获得。也就是说,如果我们启动的intent是隐式意图,那么可以用Activity类中RESULT_OK来表示操作已经顺利结束。 (此处,requestCode = RESULT_OK)
借用网上例子:
final int CROP_PIC_REQUESTCODE = 23;
final int SELECT_PICTURE = 21;
if ( requestCode == SELECT_PICTURE && resultCode == RESULT_OK) {
System.out.println("调用图库返回,关闭activity");
Intent intent1 = new Intent("com.android.camera.action.CROP");
intent1.setDataAndType(data.getData(), "image/*");
intent1.putExtra("crop", "true");
intent1.putExtra("aspectX", 1);
intent1.putExtra("aspectY", 1);
intent1.putExtra("outputX", 80);
intent1.putExtra("outputY", 80);
intent1.putExtra("return-data", true);
startActivityForResult(intent1, CROP_PIC_REQUESTCODE);
}
其他判断操作状态的标识符还有:
/** Standard activity result: operation canceled. */
public static final int RESULT_CANCELED = 0;
/** Standard activity result: operation succeeded. */
public static final int RESULT_OK = -1;
/** Start of user-defined activity results. */
public static final int RESULT_FIRST_USER = 1;
参考:https://blog.csdn.net/qq_29134495/article/details/51505278