startActivityForResult弃用

之前在启动新页面并且需要获取新页面的返回值时,需要使用startActivityForResult配合onActivityResult方法来使用,但看到最近官方弃用了startActivityForResult方法,更推荐使用registerForActivityResult,如图:

那么就按照官方推荐修改代码看看

registerForActivityResult(ActivityResultContracts.StartActivityForResult())
    {
        if (it.resultCode == RESULT_OK){
            // 获取返回数据
            var resultData = it.data
        }
    }.launch(Intent(this, BluetoothDeviceListActivity::class.java))

LifecycleOwners must call register before they are STARTED解决

看起来确实是更加明了,不需要在onActivityResult方法里判断requestCode了,毕竟一个页面可能有多个reqeust,但是运行后闪退,报错如图:

后查询后,在stackoverflow上找到方法解决,点这里看官方文档,如果是在fragment里使用,看这个,我这里的解决方案是

// 懒加载申明
private lateinit var searchDeviceLauncher: ActivityResultLauncher<Intent>

// 在onCreate方法里初始化
searchDeviceLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
       if (it.resultCode == RESULT_OK){
          // 获取返回数据
          var resultData = it.data
       }
   }

// 在需要跳转地方调用
searchDeviceLauncher.launch(Intent(this,BluetoothDeviceListActivity::class.java))

经过上面的步骤后,运行无异常了.

文章目录