首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何用ActivityResultLauncher替换startActivityForResult,但仍然包含选项捆绑包?

ActivityResultLauncher 是 Android Jetpack 中的一个组件,用于替代传统的 startActivityForResult 方法。它提供了一种更简洁的方式来处理 Activity 的结果,并且与生命周期组件(如 ViewModel)更好地集成。以下是如何使用 ActivityResultLauncher 替换 startActivityForResult 并包含选项捆绑包的步骤:

基础概念

ActivityResultLauncher 是一个用于启动 Activity 并处理其结果的接口。它允许你在启动 Activity 时传递请求码、选项捆绑包,并在 Activity 返回结果时处理这些结果。

优势

  1. 生命周期感知:与 ViewModel 和 Lifecycle 组件更好地集成,避免内存泄漏。
  2. 简化代码:代码更简洁,易于维护。
  3. 更好的类型安全:使用泛型来处理不同类型的结果。

类型

ActivityResultLauncher 有两种主要类型:

  1. 单个请求:用于启动单个 Activity 并处理其结果。
  2. 多个请求:用于管理多个 Activity 请求及其结果。

应用场景

适用于需要启动 Activity 并处理其结果的场景,例如图片选择、权限请求等。

示例代码

以下是一个使用 ActivityResultLauncher 替换 startActivityForResult 并包含选项捆绑包的示例:

代码语言:txt
复制
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

    private ActivityResultLauncher<Intent> imagePickerLauncher;
    private static final int REQUEST_CODE_IMAGE_PICKER = 1001;
    private static final int REQUEST_CODE_PERMISSION = 1002;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imagePickerLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                new ActivityResultCallback<ActivityResult>() {
                    @Override
                    public void onActivityResult(ActivityResult result) {
                        if (result.getResultCode() == RESULT_OK) {
                            Intent data = result.getData();
                            if (data != null) {
                                Uri imageUri = data.getData();
                                // 处理图片 Uri
                            }
                        }
                    }
                });

        findViewById(R.id.btn_pick_image).setOnClickListener(v -> {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION);
            } else {
                openImagePicker();
            }
        });
    }

    private void openImagePicker() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        imagePickerLauncher.launch(intent);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_PERMISSION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openImagePicker();
            } else {
                // 处理权限被拒绝的情况
            }
        }
    }
}

参考链接

Android 官方文档 - Activity Result API

通过这种方式,你可以使用 ActivityResultLauncher 替换 startActivityForResult,并且仍然可以传递选项捆绑包来启动 Activity。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券