Android中返回数据给上一个Activity

第一种方式:startActivityForResult

创建两个Activity:MainActivity、SecondActivity

MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        val mainButton = binding.mainButton
        mainButton.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java);
            this.startActivityForResult(intent, 10)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            10 -> if (resultCode == RESULT_OK) {
                val name = data?.getStringExtra("name")
                Log.d("MainActivity", "name: $name")
            }
        }//when
    }

}

startActivityForResult方法接收两个参数,第一个参数是Intent;第二个参数是请求码,用于在之后的回调函数onActivityResult中判断数据来源。这里我们使用了startActivityForResult方法启动了SecondActivity,请求码只要是一个唯一值即可,这里传入了10。

onActivityResult方法中带有3个参数:第一个参数requestCode,即我们在启动SecodeActivity时传入的请求码;第二个参数resultCode,即SecondActivity在返回数据时的处理结果;第三个参数data,即携带着返回数据的Intent。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/mainButton"
        android:text="to_second_activity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

SecondActivity.kt

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivitySecondBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.secondButton.setOnClickListener {
            val intent = Intent()
            intent.putExtra("name", "Bin Shi")
            setResult(RESULT_OK, intent)
            finish()
        }
    }

}

可以看到在SecondActivity类里,按钮点击事件中我们构建了一个Intent,只不过这个Intent仅仅用于传递数据而已,它没有指定任何的意图。其中关键代码是调用了setResult方法,该方法用于向上一个Activity返回数据。setResult方法接收两个参数,第一个参数用于向上一个Activity返回处理结果,一般只是用RESULT_OK或者RESULT_CANCELED这两个值;第二个参数则把有数据的Intent传递回去。最后调用了finish方法来销毁当前Activity。

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">
    <Button
        android:id="@+id/secondButton"
        android:text="to_main_activity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

由于在一个Activity中有可能调用startActivityForResult方法启动多个不同的Activity,每一个Activity返回的数据都会调用到onActivityResult这个方法,因此我们首先要做的就是通过检查requestCode的值来判断数据来源,然后做对应的业务处理。

注:startActivityForResult和onActivityResult在较新版本中已经被标记为Deprecated(废弃;不建议使用),接下来介绍谷歌推荐使用的新方案。

 第二种方式:registerForActivityResult

只需要修改MainActivity中的代码即可

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val mainButton = binding.mainButton
val register = registerForActivityResult(
ActivityResultContracts.StartActivityForResult(),
ActivityResultCallback {
if (it.resultCode == RESULT_OK) {
Log.d("MainActivity", "resultCode: ${it.resultCode}")
Log.d("MainActivity", "name: ${it.data?.getStringExtra("name")}")
}
}
)
mainButton.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java);
register.launch(intent)
}
}

}

这里只是展示了registerForActivityResult最简单的用法,registerForActivityResult方法会返回一个ActivityResultLauncher对象,该对象必须在Activity started之前调用,不然会报错,然后调用launch方法就可以实现Activity跳转,这里SecondActivity不要做任何改动。

OK,这篇就到这里!更多registerForActivityResult的用法可以参考:https://blog.csdn.net/Ikulm/article/details/119798336 或者官网等其他文章。

 

posted on 2023-05-21 20:55  Devil'soul  阅读(809)  评论(0编辑  收藏  举报

导航