使用ActivityResultLauncher获取结果

使用ActivityResultLauncher获取结果

AndroidX中推荐使用ActivityResultLauncher获取结果,在AndroidX组件中的类ComponentActivityFragment都提供了方法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里面的一些预定义的类。比如:StartActivityForResultRequestPermissionRequestMultiplePermissions等。

下面的代码就是自己写了一个空实现

    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);
        }
    }

用法

ComponentActivityFragment创建之前(onCreate)调用方法registerForActivityResult,并在创建之后(生命周期)才能调用ActivityResultLauncherlaunch方法,通常可以直接在字段那里直接定义并赋值。

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);
        });
    }
}

posted @ 2025-06-04 20:20  枫叶孤星  阅读(223)  评论(0)    收藏  举报