在 android 中多个 activity 中互相访问是常见的一种操作,比如:打开系统浏览器、显示系统拨号盘等等。
做这些操作的时候,自然是需要传递一些数据过去,比如:要打开的网址、要拨打的电话号码等等。
先来看最简单的打开新的 activity 界面
var intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
这端代码会打开一个 SecondActivity 的界面。
如果要打开 android 系统浏览器,就需要写成这样
var intent = Intent(Intent.ACTION_VIEW)
intent.setData(Uri.parse("http://www.baidu.com"))
startActivity(intent)
Intent.ACTION_VIEW 是一个常量,对应系统的浏览器。
执行这端代码,就会在系统浏览器中打开 www.baidu.com 网站。
当然,你不能忘记了需要在 AndroidManifest.xml 中设置网络访问权限
<uses-permission android:name="android.permission.INTERNET" />
而打开系统拨号盘也是类似的做法
var intent = Intent(Intent.ACTION_DIAL)
intent.setData(Uri.parse("tel:13912335677"))
startActivity(intent)
只不过,打开拨号盘对应的常量是 Intent.ACTION_DIAL
数据的设置是 tel: 13912335677,这个就是电话号码了。
以上是跳出我们自己的 app ,访问系统中其他应用的例子。在我们自己的 app 中,也是可以一样实现数据传递的。
从当前 activity 传递到另一个 activity 内数据,可以使用 intent.putExtra
下面先看代码
首先是 MainActivity 相应界面动作
//向新界面传递数据并获得返回值
btnSendDataForResult.setOnClickListener {
var intent = Intent(this, SecondActivity::class.java)
startActivityForResult(intent, 1)
}
这里注意打开新的 activity 的方法是 startActivityForResult,这个是可以获取返回值的。参数中的第二个参数,是请求码,用来识别是哪个请求的返回。
当然,在界面文件内(activity_main.xml),有一个对应的控件按钮
<Button
android:id="@+id/btnSendData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:text="向新界面传递数据"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnOpenActivity" />
在 SecondActivity 中,有一个实现了关闭当前 activity 的方法。把返回值的方法写在这里。
button.setOnClickListener {
//创建 Intent 对象,该对象会被 SecondActivity 返回
var intent = Intent()
//设置要返回的数据
intent.putExtra("Who", "Love Me")
setResult(Activity.RESULT_OK, intent)
finish()
}
要返回的数据值是 "Love Me",数据的识别名称是"Who"。Activity.RESULT_OK是响应码。
MainActivity就是凭借响应码来确定这个传来的参数是给它使用的。
finish()就是关闭当前的 activity 了,也就是 SecondActivity。
在MainActivity接收返回结果,需要 override onActivityResult
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when(requestCode){
1 -> //接收请求码为 1 的数据
{
Toast.makeText(this, "haha", Toast.LENGTH_LONG).show()
if (resultCode == Activity.RESULT_OK){
var returnedData = data?.getStringExtra("Who")
btnSendDataForResult.text = returnedData?:"没返回值"
Log.d("MainActivity", returnedData)
}
}
}
}
点击“向新界面传递数据并接收返回值”
点击“返回”
接收到返回值
我们可以注意到,弹出的提示框是接收到请求码为 1 的代码块中的代码。
而且刚才点击的按钮文字也变成了返回值。
网友评论