Android activity之间可以相互传递数据,从MainActivity传递数据到SecondActivity中,也可以由SecondActivity返回数据给回到MainActivity。
向下一个Activity传递数据Intent在启动Activity过程中可以传递数据。Intent中提供了putExtra方法进行重载,举例来讲:将字符串从一个Activity中传递至第二个Activity中。
button1.setOnClickListener {
val data = "Hello SecondActivity"
val intent = Intent(this, SecondActivity::class.java)
//putExtra接受的是键值对,第一个参数是键,用于后面取值;第二个是真正要传递的数据
intent.putExtra("extra_data", data)
startActivity(intent)
}
在第二个Activity中将传递的数据拿出,并将其打印出来。
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_second)
//intent调用的是getIntent方法,会获取用于启动SecondActivity的Intent,getStringExtra获取到传递的数据
//getIntExtra拿到的是整形;getBooleanExtra拿到的是布尔类型
val extradata = intent.getStringExtra("extra_data")
Log.d("SecondActivity", "extra data is $extradata")
}
}
返回数据给上一个Activity
既可以传递数据给下一个Activity,那么将数据返回给一个Activity也是可行的。
button1.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivityForResult(intent, 1)
}
startActivityForResult方法接受两个参数:第一个参数是Intent,第二个参数是请求码。用于在之后的回调中判断数据来源。
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_second)
button2.setOnClickListener {
//Intent传递数据,没有任何意图,只需要将数据存放进去
val intent = Intent()
intent.putExtra("data_return", "Hello FirstActivity")
//setResult接受两个参数:第一个是用于向上一个Activity返回处理结果,一般是RESULT_OK或者RESULT_CANCELED
//第二个是带有数据的intent传递过去。最后调用finish销毁。
setResult(Activity.RESULT_OK, intent)
finish()
}
}
}
最后需要在第一个Activity重写方法得到返回的数据。
//第一个参数requestCode是启动Activity时传入的请求码;第二个参数resultcode是返回数据传入的处理结果
//第三个参数是data数据,携带intent。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//requestcode是判断数据来源
when (requestCode) {
//resultcode是判断处理结果是否成功与否。
1 -> if (resultCode == Activity.RESULT_OK) {
val returnedData = data?.getStringExtra("data_return")
//将data值打印出来
Log.d("MainActivity", "returned data is $returnedData")
}
}
}
那么如果用户不是通过点击事件返回,而是点击Back键回到第一个Activity,如何处理?通过在第二个Activity中重写onBackPressed方法来解决这个问题。
override fun onBackPressed() {
val intent = Intent()
intent.putExtra("data_return", "Hello FirstActivity")
setResult(Activity.RESULT_OK, intent)
finish()
}