ActivityResultLauncher
是 Android Jetpack 中的一个组件,用于替代传统的 startActivityForResult
方法。它提供了一种更简洁的方式来处理 Activity 的结果,并且与生命周期组件(如 ViewModel)更好地集成。以下是如何使用 ActivityResultLauncher
替换 startActivityForResult
并包含选项捆绑包的步骤:
ActivityResultLauncher
是一个用于启动 Activity 并处理其结果的接口。它允许你在启动 Activity 时传递请求码、选项捆绑包,并在 Activity 返回结果时处理这些结果。
ActivityResultLauncher
有两种主要类型:
适用于需要启动 Activity 并处理其结果的场景,例如图片选择、权限请求等。
以下是一个使用 ActivityResultLauncher
替换 startActivityForResult
并包含选项捆绑包的示例:
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。
领取专属 10元无门槛券
手把手带您无忧上云