Activity数据交互

启动 Activity
传数据
获取返回值

创建 MyActivity2

在项目ActivitySample中模仿创建MyActivity1的步骤,创建一个新的 Activity名为 MyActivity2
aty2

创建布局文件 activity_my2.xml

<?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"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="30dp">

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=" button 2" />
</LinearLayout>

加载布局文件

Java 代码 MyActivity2

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my2);
    }

Kotlin 代码 MyActivity2

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my2)
    }

AndroidManifest.xml 清单文件中注册 MyActivity2

        <activity android:name=".MyActivity2" />

        <activity
            android:name=".MyActivity1"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
启动 MyActivity2

我们通过MyActivity1来启动MyActivity2

编辑布局文件 activity_my1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="30dp">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="close button"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/startBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start activity"
        android:textAllCaps="false" />
</LinearLayout>

增加了一个 idstartBtnButton.

启动 MyActivity2
编辑MyActivity1代码:

Java 代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my1);

        Button button = findViewById(R.id.btn1);
        button.setOnClickListener(view -> {
            Toast.makeText(this, "close activity", Toast.LENGTH_SHORT).show();
            finish();
        });

        Button start = findViewById(R.id.startBtn);
        start.setOnClickListener(view -> {
            Intent intent = new Intent(this, MyActivity2.class);
            startActivity(intent);
        });
    }

Kotlin 代码

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my1)

        val button: Button = findViewById(R.id.btn1)
        button.setOnClickListener{
            Toast.makeText(this, "close activity", Toast.LENGTH_SHORT).show()
            finish()
        }

        val start: Button = findViewById(R.id.startBtn)
        start.setOnClickListener{
            val intent = Intent(this, MyActivity2::class.java)
            startActivity(intent)
        }
    }

这里是为按钮 startBtn 设置了点击事件,点击按钮跳转到MyActivity2,通过调用 ActivitystartActivity()函数实现跳转功能;
startActivity()函数接收一个 Intent作为参数;
Intent的构造函数Intent(Context packageContext, Class<?> cls) 接收两个参数:第一个 Context作为启动 Activity 的上下文,第二个参数 Class 用于指定要启动的 Activity

运行效果
MyActivity1:
1

点击 按钮 跳转到MyActivity2
2

传递数据

Intent不但可以启动 Activity,还可以在启动 Activity的时候传递数据。

编辑布局文件 activity_my1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="30dp">

    .....

    <Button
        android:id="@+id/sendBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="send message"
        android:textAllCaps="false" />
</LinearLayout>

增加了一个 idsendBtnButton.

启动 MyActivity2
编辑MyActivity1代码:

Java 代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my1);

        ......

        Button send = findViewById(R.id.sendBtn);
        send.setOnClickListener(view -> {
            Intent intent = new Intent(this, MyActivity2.class);
            intent.putExtra("nick","guagua");
            intent.putExtra("age", 19);
            startActivity(intent);
        });
    }

Kotlin 代码

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my1)

        ......

        val send: Button = findViewById(R.id.sendBtn)
        send.setOnClickListener{
            val intent = Intent(this, MyActivity2::class.java)
            intent.putExtra("nick", "guagua")
            intent.putExtra("age", 19)
            startActivity(intent)
        }
    }

我们使用 IntentputExtra()函数进行数据的传递;
putExtra()函数有两个参数:第一个是数据的名称(键),是String 类型,第二个参数是要传递的数据。

编辑布局文件 activity_my2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="30dp">

    <TextView
        android:id="@+id/message_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="message"/>

    .....

</LinearLayout>

这里增加了一个 TextView 是用来展示传递的数据。

获取数据
编辑MyActivity2代码:

Java 代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my1);

        TextView tv = findViewById(R.id.message_tv);
        Intent intent = getIntent();
        if (intent.hasExtra("nick")) {
            String nick = intent.getStringExtra("nick");
            tv.setText("nick: "+nick);
        }
        if (intent.hasExtra("age")) {
            int age = intent.getIntExtra("age", 0);
            tv.append("\nage: "+age);
        }
    }

getIntent() 函数是 Activity类的函数,用于获取启动 MyActivity2Intent.

Kotlin 代码

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my1)

        val tv: TextView = findViewById(R.id.message_tv)
        if (intent.hasExtra("nick")) {
            val nick = intent.getStringExtra("nick")
            tv.text = "nick: $nick"
        }
        if (intent.hasExtra("age")) {
            val age = intent.getIntExtra("age", 0)
            tv.append("\nage: $age")
        }
    }

这里是获取传递过来的数据,用 TextView 展示出来。
intent是调用父类的getIntent() 函数,获取启动 MyActivity2Intent
使用IntenthasExtra()函数来判断是否有对应的数据传递过来;
IntentgetStringExtra()函数用于获取传递的 String类型的数据;
IntentgetIntExtra()函数用于获取传递的 int类型的数据;

运行项目
点击MyActivity1send message按钮,跳转至MyActivity2页面:
demo

向下一个 Activity 查询数据

可以传递数据给下一个 Activity ,还可以向下一个 Activity 查询数据。

编辑布局文件 activity_my1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="30dp">

    .....

    <Button
        android:id="@+id/requestBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="request message"
        android:textAllCaps="false" />
</LinearLayout>

增加了一个 idrequestBtnButton.

启动下一个 Activity
编辑MyActivity1代码:

Java 代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my1);

        ......

        Button req = findViewById(R.id.requestBtn);
        req.setOnClickListener(view -> {
            Intent intent = new Intent(this, MyActivity2.class);
            startActivityForResult(intent, 1010);
        });
    }

Kotlin 代码

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my1)

        ......

        val req: Button = findViewById(R.id.requestBtn)
        req.setOnClickListener{
            val intent = Intent(this, MyActivity2::class.java)
            startActivityForResult(intent, 1010)
        }
    }

这里调用 startActivityForResult()函数来启动 MyActivity2,该函数有两个参数:第一个是用于启动 ActivityIntent,第二个参数是请求码,用于标记请求的来源。

处理请求,返回数据给上一个 Activity
编辑MyActivity2代码:

Java 代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my1);

        ......

        Button button = findViewById(R.id.btn2);
        button.setOnClickListener(view -> {
            Intent result = new Intent();
            result.putExtra("data", " 🐸 shaguaAndroid!");
            setResult(RESULT_OK, result);
            finish();
        });
    }

Kotlin 代码

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my2)

        ......

        val button: Button = findViewById(R.id.btn2)
        button.setOnClickListener{
            val result = Intent()
            result.putExtra("data", " 🐸 shaguaAndroid!")
            setResult(RESULT_OK, result)
            finish()
        }
    }

这里是点击按钮,将数据返回,并关闭当前页面MyActivity2
构建了一个名为 resultIntent用于传递数据;
调用 setResult()函数向上一个 Activity 返回数据,该函数接受两个参数:第一个是处理结果,一般用 RESULT_OKRESULT_CANCELED表示,第二个参数是Intent用于携带返回数据;
函数 finish()关闭当前页面MyActivity2.

获取返回数据
回到MyActivity1中并编辑,覆写函数 onActivityResult(),

Java 代码

     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (RESULT_OK != resultCode) return;
        if (1010 == requestCode && null != data) {
            String value = data.getStringExtra("data");
            Log.i("MyActivity1", "onActivityResult(" + requestCode + "), result value: " + value);
        }
    }

Kotlin 代码

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (RESULT_OK != resultCode) return
        if (1010 == requestCode) {
            val value = data?.getStringExtra("data")
            Log.i("MyActivity1", "onActivityResult($requestCode), result value: $value")
        }
    }

这里是获取返回数据,并输出日志。
函数 onActivityResult()用于获取返回数据,它有三个参数:第一个是启动 Activity时传入的请求码,第二个参数是返回数据时传入的处理结果,第三个参数是携带返回数据的Intent

运行项目
点击按钮 request message启动MyActivity2,点击新页面中的按钮返回,查看Logcat日志台:
onActivityResult

项目代码地址

  • Java:
    https://github.com/BethelDEV/shaguaAndroid/tree/main/javaSource/ActivitySample

  • Kotlin:
    https://github.com/BethelDEV/shaguaAndroid/tree/main/kotlinSource/ActivitySample

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值