使用ActivityResultLauncher获取结果
使用ActivityResultLauncher获取结果
在AndroidX中推荐使用ActivityResultLauncher获取结果,在AndroidX组件中的类ComponentActivity和Fragment都提供了方法registerForActivityResult,专门用来来注册和生成一个ActivityResultLauncher。
registerForActivityResult
方法registerForActivityResult有两个重载,定义都在在接口ActivityResultCaller中:
<I, O> ActivityResultLauncher<I> registerForActivityResult(ActivityResultContract<I, O> contract,ActivityResultCallback<O> callback);
<I, O> ActivityResultLauncher<I> registerForActivityResult(ActivityResultContract<I, O> contract,ActivityResultRegistry registry,ActivityResultCallback<O> callback);
常用第一个
ActivityResultContract
ActivityResultContract可以自己实现,也可以使用ActivityResultContracts里面的一些预定义的类。比如:StartActivityForResult、RequestPermission、RequestMultiplePermissions等。
下面的代码就是自己写了一个空实现
ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContract<Intent, String>() {
@Override
public Intent createIntent(@NonNull Context context, Intent input) {
return null;
}
@Override
public String parseResult(int resultCode, @Nullable Intent intent) {
return null;
}
}, new ActivityResultCallback<String>() {
@Override
public void onActivityResult(String result) {
}
});
或者系统预定义的类StartActivityForResult(主要代码)
public static final class StartActivityForResult extends ActivityResultContract<Intent, ActivityResult> {
@Override
public Intent createIntent(@NonNull Context context, @NonNull Intent input) {
return input;
}
@NonNull
@Override
public ActivityResult parseResult( int resultCode, @Nullable Intent intent) {
return new ActivityResult(resultCode, intent);
}
}
用法
在ComponentActivity或Fragment创建之前(onCreate)调用方法registerForActivityResult,并在创建之后(生命周期)才能调用ActivityResultLauncher的launch方法,通常可以直接在字段那里直接定义并赋值。
import android.content.Intent;
public class ActivityDefault extends AppCompatActivity {
//直接定义为字段并赋值
private final ActivityResultLauncher<Intent> mLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), it -> {
if (it.getResultCode() == Activity.RESULT_OK && it.getData() != null) {
//处理结果
}
});
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate: ");
//调用
findViewById(R.id.bt_test).setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_VIEW);
mLauncher.launch(intent);
});
}
}

浙公网安备 33010602011771号