要触发onActivityResult有几种方法

在 Android 开发中,触发 onActivityResult 回调主要有以下几种方式:

1. 使用 startActivityForResult 启动 Activity

这是最常见的方式,通过 startActivityForResult(Intent, int) 启动一个 Activity,并在目标 Activity 结束时返回结果。

// 启动 Activity 并请求结果
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);

// 在目标 Activity 中设置结果并结束
Intent resultIntent = new Intent();
resultIntent.putExtra("data", "返回的数据");
setResult(Activity.RESULT_OK, resultIntent);
finish();

2. 使用 startIntentSenderForResult 启动 IntentSender

通过 IntentSender 间接启动 Activity,适用于安全传递操作(如 Google Play 服务、权限请求等)。

// 示例:处理 Google 登录的 IntentSender
Task<GoogleSignInAccount> task = GoogleSignIn.getClient(this, gso).silentSignIn();
task.addOnFailureListener(e -> {
    if (e instanceof ApiException) {
        IntentSender intentSender = ((ApiException) e).getResolution().getIntentSender();
        startIntentSenderForResult(intentSender, RC_SIGN_IN, null, 0, 0, 0, null);
    }
});

3. 使用 startActivityForResultAsUser 在多用户环境下启动 Activity

在多用户设备中,以指定用户身份启动 Activity 并获取结果(需特殊权限)。

// 示例:以其他用户身份启动设置页面
UserHandle userHandle = UserHandle.of(targetUserId);
Intent intent = new Intent(Settings.ACTION_SETTINGS);
startActivityForResultAsUser(intent, REQUEST_CODE, userHandle, null);

4. 在 Fragment 中直接调用 startActivityForResult

Fragment 可以独立接收结果,无需通过宿主 Activity。

// 在 Fragment 中启动 Activity
Intent intent = new Intent(getActivity(), SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);

// 在 Fragment 中重写 onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 处理结果
}

5. 使用 ActivityResultContracts(推荐方式,AndroidX)

AndroidX 提供的新 API,替代传统的 startActivityForResult,更安全且类型更明确。

// 注册 ActivityResultLauncher
private ActivityResultLauncher<Intent> launcher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            Intent data = result.getData();
            // 处理结果
        }
    }
);

// 启动 Activity
Intent intent = new Intent(this, SecondActivity.class);
launcher.launch(intent);

6. 系统级操作(如相机、文件选择器等)

调用系统组件并获取返回结果。

// 示例:调用系统相机
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}

7. 第三方 SDK 回调(如 Facebook/Google 登录)

许多第三方 SDK 使用 onActivityResult 处理授权结果。

// 示例:Google 登录
GoogleSignInClient client = GoogleSignIn.getClient(this, gso);
Intent signInIntent = client.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);

总结

触发方式 适用场景 权限要求
startActivityForResult 普通 Activity 交互
startIntentSenderForResult 安全传递操作(如 Google 服务) 视具体场景而定
startActivityForResultAsUser 多用户环境下的跨用户操作 INTERACT_ACROSS_USERS
ActivityResultContracts AndroidX 推荐的现代方式
系统组件调用(相机、文件选择器) 系统功能集成 对应权限(如相机、存储)
第三方 SDK 回调 社交登录、支付等 SDK 要求的权限

注意:在 Android 10(API 29)及以上版本中,部分方法的行为可能受隐私政策限制,需查阅官方文档确认兼容性。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容