美文网首页Kotlin开发指南Android开发经验谈Android技术知识
48. (android开发) activity间传递数据(打开

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

作者: 厚土火焱 | 来源:发表于2017-12-21 17:38 被阅读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 的代码块中的代码。
    而且刚才点击的按钮文字也变成了返回值。

    相关文章

      网友评论

        本文标题:48. (android开发) activity间传递数据(打开

        本文链接:https://www.haomeiwen.com/subject/xdyawxtx.html