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

androidx中已弃用的OnActivityResult()

OnActivityResult() 方法在 AndroidX 中已经被弃用,取而代之的是 registerForActivityResult() 方法。这个变化是为了简化 Activity 和 Fragment 之间的交互,并提高代码的可读性和可维护性。

基础概念

OnActivityResult() 是一个回调方法,用于处理从启动的 Activity 返回的结果。当从一个 Activity 启动另一个 Activity 并期望在该 Activity 完成后返回结果时,可以使用 OnActivityResult() 来接收这些结果。

相关优势

  1. 生命周期感知registerForActivityResult() 是生命周期感知的,这意味着它会在正确的时机自动处理结果,而不需要手动管理生命周期。
  2. 更简洁的代码:使用 registerForActivityResult() 可以减少样板代码,使代码更加简洁和易于理解。
  3. 更好的类型安全:通过使用泛型,registerForActivityResult() 提供了更好的类型安全性。

类型

registerForActivityResult() 返回一个 ActivityResultContract 对象,该对象定义了如何启动 Activity 并处理结果。常见的 ActivityResultContract 包括:

  • ActivityResultContracts.StartActivityForResult:用于一般的 Activity 结果。
  • ActivityResultContracts.TakePicturePreview:用于拍照并预览图片。
  • ActivityResultContracts.TakePicture:用于拍照并保存图片。
  • ActivityResultContracts.PickContact:用于选择联系人。

应用场景

  • 拍照和选择图片:用户可以从相册中选择图片或使用相机拍照。
  • 获取用户输入:例如,从另一个 Activity 获取用户填写的表单数据。
  • 选择文件:允许用户从设备中选择一个文件。

示例代码

以下是一个使用 registerForActivityResult() 的示例:

代码语言:txt
复制
class MainActivity : AppCompatActivity() {

    private val requestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
            if (isGranted) {
                // Permission is granted. Continue the action or workflow in your app.
            } else {
                // Explain to the user that the feature is unavailable because the
                // features requires a permission that the user has denied.
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val requestPermissionButton = findViewById<Button>(R.id.request_permission_button)
        requestPermissionButton.setOnClickListener {
            // Request camera permission
            requestPermissionLauncher.launch(Manifest.permission.CAMERA)
        }
    }
}

遇到的问题及解决方法

问题:为什么 OnActivityResult() 被弃用?

原因OnActivityResult() 存在一些问题,例如它不是生命周期感知的,容易导致内存泄漏和崩溃。此外,它的使用方式较为繁琐,需要手动管理请求码和处理结果。

解决方法:迁移到 registerForActivityResult()。以下是迁移步骤:

  1. 移除 OnActivityResult() 方法:从你的 Activity 或 Fragment 中移除 OnActivityResult() 方法。
  2. 注册结果回调:使用 registerForActivityResult() 注册一个新的结果回调。
  3. 启动 Activity 并获取结果:使用注册的结果回调启动 Activity 并处理返回的结果。

例如,将以下旧的 OnActivityResult() 代码迁移到新的方式:

代码语言:txt
复制
// 旧的 OnActivityResult() 方法
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        val resultData = data?.getStringExtra("result_key")
        // 处理结果
    }
}

迁移到新的方式:

代码语言:txt
复制
// 新的 registerForActivityResult() 方法
private val resultLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val data: Intent? = result.data
            val resultData = data?.getStringExtra("result_key")
            // 处理结果
        }
    }

// 启动 Activity 并获取结果
fun startAnotherActivityForResult() {
    val intent = Intent(this, AnotherActivity::class.java)
    resultLauncher.launch(intent)
}

通过这种方式,你可以更简洁、更安全地处理 Activity 结果。

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

相关·内容

领券