在Android开发中时常需要用到跳转新页面获取结果回传数据。官方推荐使用Activity Result API。
registerForActivityResult 是 ComponentActivity 的 public 方法。它接收一个ActivityResultContract 和一个 ActivityResultCallback。
ActivityResultContract
ActivityResultContract 表示本次 Activity 启动的类型。
若启动一个需要返回结果的 Activity,可以使用ActivityResultContracts.StartActivityForResult()。
若启动一个权限 Activity,就可以使用 ActivityResultContracts.RequestPermission()。
若需要使用照片预览,可以使用 ActivityResultContracts.TakePicturePreview()。
ActivityResultCallback
ActivityResultCallback 表示上一个 Activity 回传的 ActivityResult 结果。
用法
首先使用 registerForActivityResult 得到 ActivityResultLauncher,在闭包中写上需要处理的ActivityResult。
//首先使用 registerForActivityResult 得到 ActivityResultLauncher,
//在闭包中写上需要处理的ActivityResult.
private val activityResultLauncher: ActivityResultLauncher<Intent> =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
activityResult: ActivityResult ->
if (activityResult.resultCode == Activity.RESULT_OK) {
// 收到 ActivityResult
}
}
如果要启动一个 Activity,使用 activityResultLauncher 的 launch 方法,替代原来的 startActivityForResult。
activityResultLauncher.launch(Intent(this, SecondActivity::class.java))
在需要返回结果的被启动 Activity 调用 setResult。
setResult(Activity.RESULT_OK, Intent().putExtra("key", "value"));
finish();
onActivityResult
一、startActivityForResult (Intent intent,int requestCode) 【A活动进入B活动使用】
如果requestCode> = 0,则当Activity退出时,将在onActivityResult()中返回此请求码。
二、setResult (int resultCode,Intent data) 【B活动返回A活动使用】
resultCode 结果码回传到起始的Activity,通常使用RESULT_OK或RESULT_CANCELED(官方文档推荐使用);data 通过Intent回传数据到起始的Activity中。
三、onActivityResult (int requestCode, int resultCode, Intent data) 【A活动重写此方法并通过Code处理功能落逻辑】
requestCode 最初提供给startActivityForResult()的整数请求代码,允许您识别此结果的来源 【A活动跳转到B活动的参数】;resultCode 子活动通过其setResult()返回的整数结果代码 【B活动返回的参数】。
示例代码
Activity.java查看resultCode
/** Standard activity result: operation canceled. */Activity的标准结果:取消操作
public static final int RESULT_CANCELED = 0;
/** Standard activity result: operation succeeded. */Activity的标准结果:操作成功
public static final int RESULT_OK = -1;
FirstActivity.java 【即A活动】
//自己定义的参数
public static final int FLAG = 100;
......
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.rl_intentSecond:
Intent Intent1 = new Intent(mContext, SecondActivity.class);
//携带的数据内容,需要传递给SecondActivity的
Intent1.putExtra("csdn", "彭老希");
startActivityForResult(Intent1,FLAG);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case FLAG:
//自己需要处理的内容
break;
}
}
}
SecondActivity.java 【即B活动】
Intent intent = new Intent();
intent.putExtra("name", "彭老希");
intent.putExtra("age", "19");
setResult(RESULT_OK, intent);