一手遮天 Android - Activity: Activity 之间的跳转和数据传递

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 Android - Activity: Activity 之间的跳转和数据传递

示例如下:

/activity/ActivityDemo3.java

/**
 * Activity 之间的跳转和数据传递(本例用于演示父 activity)
 *
 * 通过 intent 打开其他 activity,通过 bundle 传递数据(bundle 的大小有限制,大概是不到 1 MB)
 * startActivity() 用于打开其他 activity
 * startActivityForResult() 用于打开其他 activity 并通过当前 activity 的 @Override onActivityResult() 接收返回结果
 */

package com.webabcd.androiddemo.activity;

import android.content.Intent;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.webabcd.androiddemo.R;

public class ActivityDemo3 extends AppCompatActivity {

    private TextView mTextView1;
    private Button mButton1;
    private Button mButton2;

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

        mTextView1 = findViewById(R.id.textView1);
        mButton1 = findViewById(R.id.button1);
        mButton2 = findViewById(R.id.button2);

        sample();
    }

    private void sample() {
        // 启动另一个 activity 并传递数据,不接收返回结果
        mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 实例化 intent(需要指定当前上下文,以及需要跳转到的 activity)
                Intent intent = new Intent(ActivityDemo3.this, ActivityDemo3_2.class);
                // intent.setClass(ActivityDemo3.this, ActivityDemo3_2.class);

                // 设置需要传递的数据,此为简便写法,实际上是通过 bundle 对象来传递数据的(参见后面的注释部分)
                intent.putExtra("param1", "webabcd");
                intent.putExtra("param2", 100);

                /*
                // 构造 intent 的 bundle 对象,用于传递数据(与上面的两行代码所做的工作是一样的)
                Bundle bundle = new Bundle();
                bundle.putString("param1", "webabcd");
                bundle.putInt("param2", 100);
                intent.putExtras(bundle);
                */

                // startActivity() - 通过 intent 打开指定的 activity 并传递数据
                startActivity(intent);
            }
        });

        // 启动另一个 activity 并传递数据,并接收返回结果
        mButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ActivityDemo3.this, ActivityDemo3_2.class);
                intent.putExtra("param1", "webabcd");
                intent.putExtra("param2", 100);

                // startActivityForResult() - 通过 intent 打开指定的 activity 并传递数据,让后通过当前 activity 的 @Override onActivityResult() 接收返回结果
                //     第二个参数是整型的,会通过 @Override onActivityResult() 传递回来,用于区分当前结果是通过哪个 startActivityForResult() 返回的
                startActivityForResult(intent, 123);
            }
        });
    }

    // 接收 startActivityForResult() 打开的 activity 返回的结果
    //     requestCode - 就是 startActivityForResult() 的第二个参数,用于区分当前结果是通过哪个 startActivityForResult() 返回的
    //     resultCode - 返回的结果代码
    //     data - 返回的结果数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        mTextView1.setText(String.format("requestCode:%d, resultCode:%d", requestCode, resultCode));

        if (data != null) {
            String p1 = data.getStringExtra("param1");
            int p2 = data.getIntExtra("param2", 0);

            mTextView1.append(String.format("\n接收到的返回数据 param1:%s, param2:%d", p1, p2));
        }
    }
}

\activity\ActivityDemo3_2.java

/**
 * Activity 之间的跳转和数据传递(本例用于演示子 activity)
 *
 * 通过 intent 打开其他 activity,通过 bundle 传递数据(bundle 的大小有限制,大概是不到 1 MB)
 * 通过 finish() 结束当前的 activity,如果需要返回结果则在 finish() 之前调用 setResult()
 */

package com.webabcd.androiddemo.activity;

import android.content.Intent;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.webabcd.androiddemo.R;

public class ActivityDemo3_2 extends AppCompatActivity {

    private TextView mTextView1;
    private Button mButton1;
    private Button mButton2;

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

        mTextView1 = findViewById(R.id.textView1);
        mButton1 = findViewById(R.id.button1);
        mButton2 = findViewById(R.id.button2);

        sample();
    }

    private void sample() {
        // 获取父 activity 传递过来的数据,此为简便写法,实际上是通过 bundle 对象来接收数据的(参见后面的注释部分)
        Intent intent = this.getIntent();
        String p1 = intent.getStringExtra("param1");
        int p2 = intent.getIntExtra("param2", 0);
        /*
        // 获取 intent 的 bundle 对象,用于接收数据(与上面的两行代码所做的工作是一样的)
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            String p1 = bundle.getString("param1");
            int p2 = bundle.getInt("param2", 0);
        }
        */
        mTextView1.setText(String.format("接收到的数据 param1:%s, param2:%d", p1, p2));

        // 关闭,不返回结果
        mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // isFinishing() - 判断当前 activity 是否在结束中
                // finish() - 结束当前 activity
                finish();
            }
        });

        // 关闭,并返回数据
        mButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("param1", "wanglei");
                intent.putExtra("param2", 999);

                // 返回数据给 activity
                //     第 1 个参数 - 返回的结果代码
                //     第 2 个参数 - 返回的结果数据
                setResult(456, intent);

                // isFinishing() - 判断当前 activity 是否在结束中
                // finish() - 结束当前 activity
                finish();
            }
        });
    }
}

/layout/activity_activity_activitydemo3.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:orientation="vertical">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="启动另一个 activity 并传递数据,不接收返回结果"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="启动另一个 activity 并传递数据,并接收返回结果"/>

</LinearLayout>

/layout/activity_activity_activitydemo3_2.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:orientation="vertical">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="关闭,不返回结果"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="关闭,并返回数据"/>

</LinearLayout>

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

posted @ 2021-06-02 09:22  webabcd  阅读(135)  评论(0编辑  收藏  举报