如何在 Android Studio 中实现扫码后跳转到新 Activity

本文介绍在 android 应用中使用 ml kit 或 zxing 等扫码库完成扫描后,如何通过 intent 启动新 activity,并安全传递扫描结果,避免空指针与上下文失效问题。

在 Android 开发中,扫码(如 QR Code)通常借助 ActivityResultLauncher 配合 ScanContract(常见于 ZXing Android Embedded 或自定义封装)实现异步扫描回调。你当前的代码已成功捕获扫描结果并弹出 AlertDialog,下一步只需将该回调逻辑替换为标准的 Activity 跳转流程。

✅ 正确跳转方式(推荐写法)

ActivityResultLauncher barLauncher = registerForActivityResult(
    new ScanContract(),
    result -> {
        if (result != null && result.getContents() != null) {
            // 创建 Intent,启动目标 Activity
            Intent intent = new Intent(QRScanActivity.this, NextTargetActivity.class);
            // 可选:将扫描内容作为参数传递
            intent.putExtra("scanned_data", result.getContents());
            // 使用显式 Intent 启动(确保目标 Activity 已在 AndroidManifest.xml 中声明)
            startActivity(intent);
            // 可选:关闭当前扫码页(防止用户返回重复扫描)
            finish();
        } else {
            // 处理空结果(如用户取消扫描、光线不足识别失败等)
            Toa

st.makeText(QRScanActivity.this, "No valid code scanned", Toast.LENGTH_SHORT).show(); } } );

⚠️ 注意事项

  • QRScanActivity.this 必须是有效的 Activity 实例:确保 barLauncher 在 Activity 的 onCreate() 或生命周期早期初始化,避免在 Fragment 或已销毁 Activity 中调用。
  • 目标 Activity 必须在 AndroidManifest.xml 中注册
  • 传递数据建议使用 Intent.putExtra():接收方在 NextTargetActivity 中通过 getIntent().getStringExtra("scanned_data") 获取。
  • 避免内存泄漏:若需在跳转前执行耗时操作(如网络校验),建议结合 ViewModel 或协程处理,而非直接在回调中阻塞主线程。
  • 兼容性提示:若使用的是较新版本 ZXing Android Embedded(v4.0+),请确认 ScanContract 已正确引入;旧版可能需改用 IntentIntegrator,其回调方式略有不同。

? 进阶建议

如需在跳转时携带更多上下文(如扫描时间、原始图像缩略图或格式类型),可扩展 Intent 参数:

intent.putExtra("scanned_format", result.getFormatName()); // 如 "QR_CODE"
intent.putExtra("scan_timestamp", System.currentTimeMillis());

最终,一次成功的扫码不应仅止于展示结果——合理利用扫描数据驱动页面流转,是构建流畅用户体验的关键一步。