Android实例:使用Intent在多个Activity之间传递数据

众所周知,intent可以用于启动Activity。其实在启动的时候,还能通过intent来传递数据,下面就来看一个实例。

向下一个Activity传递数据

第一个activity的布局文件
这里仅仅放置了一个按钮,用于启动第二个Activity。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动"/>

</LinearLayout>

第一个activity的代码文件
button的监听事件里启动Activity,并传递数据

package com.example.intenttest

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btn.setOnClickListener{
            //使用显示Activity启动下一个Activity
            val intent = Intent(this, MainActivity2::class.java)
            //传递数据:一个键值对
            intent.putExtra("data", "这是传递的数据")
            startActivity(intent)
        }
    }
}

第二个Activity的代码文件
接收数据,并在Toast中显示出来。

package com.example.intenttest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast

class MainActivity2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)

        //获得上一个Activity传来的数据
        val data = intent.getStringExtra("data")
        Toast.makeText(this, data, Toast.LENGTH_SHORT).show()
    }
}

向上一个Activity传递数据

使用startActivityForResult启动第二个Activity。
在第二个Activity中使用setResult给前一个Activity传递数据。
当第二个Activity销毁时,就会自动调用第一个Activity的OnActivityResult()方法。因此我们需要重写此方法,处理返回的数据。

package com.example.intenttest

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btn.setOnClickListener{
            //使用显示Activity启动下一个Activity
            val intent = Intent(this, MainActivity2::class.java)
            //传递数据:一个键值对
            intent.putExtra("data", "这是传递的数据")

            //两个形参分别是intent和请求码(保证唯一即可)
            startActivityForResult(intent, 1)
        }
    }

    //重写此党发用于处理返回的数据
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when(requestCode){
            1 -> {
                val return_data = data?.getStringExtra("data_return")
                Toast.makeText(this, return_data, Toast.LENGTH_SHORT).show()
            }
        }
    }
}
package com.example.intenttest

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast

class MainActivity2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)

        //获得上一个Activity传来的数据
        val data = intent.getStringExtra("data")
        Toast.makeText(this, data, Toast.LENGTH_SHORT).show()
    }

    //
    override fun finish() {
        //使用没有参数的构造函数
        val intent1 = Intent()
        intent1.putExtra("data_return", "这是返回的数据")
        //专门用于处理返回的数据,接收两个参数。分别是请求码(一般传入RESULT_OK或者RESULT_CANCELED即可)
        setResult(Activity.RESULT_CANCELED, intent1)
        super.finish()
    }
}
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页