在第一行代码第三版里面,使用startActivityForResult来在Activity销毁的时候能够返回一个结果给上 一个Activity,但是现在这个方法已经被废弃了,推荐使用registerForActivityResult
简易写法如下
FirstActivity里面的,SecondActivity里面和使用startActivityForResult一样
然后我这里还是用的findViewById,因为第一行代码那个kotlin库又被废弃了,但是又有个viewbinding出来了好像,可以去看郭霖老师的csdn博客,里面详细介绍了,我还是老老实实用findViewById吧
// FirstActivity
val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
Log.d(it.resultCode.toString(), "111")
Log.d(it.data.toString(), "222")
if(it.resultCode==RESULT_OK){
val resultData= it.data?.getStringExtra("data")
Toast.makeText(this,"data $resultData",Toast.LENGTH_LONG).show()
}
}
val button1:Button=findViewById(R.id.button1)
button1.setOnClickListener {
launcher.launch(Intent(this,SecondActivity::class.java))
}
// SecondActivity
val button2: Button = findViewById(R.id.button2)
button2.setOnClickListener {
val intent=Intent()
intent.putExtra("data","成功返回了")
setResult(RESULT_OK,intent)
finish()
}
注意这个registerForActivityResult写的位置,有可能会出现bug
registerForActivityResult 报错:
FirstActivity@3fe998a is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.
这个意思就是当前你这个生命周期已经是在运行了,你必须要在它开始之前注册这个register,我写的这个位置就不对,写在button的监听器里面,也就是写在了启动之后,所以必须得写在创建之前,也就是onCreate下面(反正创建之前就行了,我不是很熟悉生命周期),而不是写在回调函数里面(肯定都已经创建好了)
over!