在 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)及以上版本中,部分方法的行为可能受隐私政策限制,需查阅官方文档确认兼容性。