Kotlin开发指南Android开发经验谈Android技术知识

48. (android开发) activity间传递数据(打开

2017-12-21  本文已影响79人  厚土火焱

在 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 的代码块中的代码。
而且刚才点击的按钮文字也变成了返回值。

上一篇下一篇

猜你喜欢

热点阅读