Administrator
发布于 2024-07-11 / 30 阅读
0
0

startActivityForResult弃用及LifecycleOwners-must-call-register-before-they-are-STARTED解决

startActivityForResult弃用

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

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

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

看起来确实是更加明了,不需要在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))

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


评论