Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android Activity 数据传输

Android Activity进行数据传输的方法

作者:三三是该溜子

文章讲解了Android中Activity间的数据传输与回传方法,包括使用Intent的putExtra传递数据、startActivityForResult获取返回结果(已过时),以及新方式registerForActivityResult替代传统机制,实现数据交互与结果回调,感兴趣的朋友跟随小编一起看看吧

Android 应用开发中,Activity之间的数据传递是常见的需求。核心方法包括使用Intent、Bundle、使用全局变量存储、SharedPreferences以及通过数据库进行数据传递。其中,使用Intent和Bundle进行数据传递是最常见且高效的方法。Intent不仅可以启动不同的Activity,还能够携带各种数据。通过putExtra()方法添加数据,在新的Activity中通过getIntent()方法接收数据,实现不同Activity间的数据传递。

一:Activity之间的数据传输

问题:不同的Activity之间怎么进行数据传输呢?

比如第一个页面中有一些字符串数据之类的要通过数据传输,传递给第二个页面进行显示的

1:MainActivity做处理

在定义一个按钮,和一个文本输入框

<Button
        android:id="@+id/btn_second3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="携带数据,跳转到Second页面"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/btn_second2"/>
    <EditText
        android:id="@+id/et_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入一些数据"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/btn_second3"/>
        findViewById(R.id.btn_second3).setOnClickListener(this);
        etData = findViewById(R.id.et_data);

继续在onClick方法中写一个else if()

else if (id == R.id.btn_second3) {
            Intent intent = new Intent(this, SecondActivity.class);
            String string = etData.getText().toString();
            if(string != null && string.length() > 0){
                intent.putExtra("key_data",string);               
            }
            startActivity(intent);
        }

(1)putExtra

Extra翻译为额外;它的作用是在通过 Intent 启动另一个组件(如 Activity)时,携带一些额外的数据

有点Cookie和Session会话的味道了,记住这里的key值一定要匹配

(2)逻辑梳理

从输入框中获取string字符串

2:SecondActivity做处理

xml布局自己定义一个TextView,此处略

Intent intent = getIntent();
        String keyData = intent.getStringExtra("key_data");
        TextView textView = findViewById(R.id.text_view);
        if(keyData != null && keyData.length() > 0){
            textView.setText(keyData);
        }

这边呢接收数据,并让string显示在页面上

看一下两者联系

3:效果

效果就这样,第二个页面(右图)接受到了,就显示出来

二:Activity之间的数据回传

问题:MainActivity怎么接收SecondActivity回传的数据

1:MainActivity做处理

(1)startActivityForResult

<Button
        android:id="@+id/btn_second4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="跳转到Second页面,等待Second返回数据"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/et_data"/>
findViewById(R.id.btn_second4).setOnClickListener(this);
else if (id == R.id.btn_second4) {
            //老方式
            startActivityForResult(new Intent(this, SecondActivity.class),9);
        }

(2)onActivityResult

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 9 && resultCode == 8){
            int keyComeBackNum = data.getIntExtra("key_comeBackNum", 0);
            String keyComeBackString = data.getStringExtra("key_comeBackString");
            Log.i(TAG, "onActivityResult: num = " + keyComeBackNum);
            Log.i(TAG, "onActivityResult: string = " + keyComeBackString);
            etData.setText(keyComeBackNum + keyComeBackString);
        }
    }

2:SecondActivity做处理

在SecondActivity的xml中在定义一个Button控件

<Button
        android:id="@+id/btn_back"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="往MainActivity回传数据"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

(1)setResult

findViewById(R.id.btn_back).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int comeBack = 798;
                String string = "surprise ma da faker";
                Intent backIntent = new Intent();
                backIntent.putExtra("key_comeBackNum",comeBack);
                backIntent.putExtra("key_comeBackString",string);
                setResult(8,backIntent);
                finish();
            }
        });

3:逻辑梳理

4:finish问题延伸

提问:在第二个页面做了一些数据后,不马上finish,而是手动关闭,这个时候回传的数据还能收到吗

最后一句代码finish删掉;finish的作用就是,点击btn_bakc2这个按钮后activity_second这个页面就退出了

这里我们点击返回按钮,同样MainActivity能接收到传回来的数据,并不受影响

三:Activity数据回传的新方式

1:.launch

用于启动目标 Activity 并等待其返回结果的核心方法。它的作用类似于传统的 startActivityForResult()

创建点击事情的准备工作

//跳转到第二个页面,等待回传数据
		else if (id == R.id.btn_second5) {
            activityResultLancher.launch(new Intent(this, SecondActivity.class));
        }

2:registerForActivityResult

可以理解一个接收Activity结果的注册器,负责 “结果回调”,能在当前 Activity中优雅接收、处理返回的数据。

是传统的startActivityForResult + onActivityResult 机制的平替

private ActivityResultLauncher<Intent> activityResultLancher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult o) {
                    int resultCode = o.getResultCode();//返回的结果码
                    Intent data = o.getData();//返回的数据
                    if (resultCode == 8) {
                        int keyComeBackNum = data.getIntExtra("key_comeBackNum", 0);
                        String keyComeBackString = data.getStringExtra("key_comeBackString");
                        Log.i(TAG, "onActivityResult: key_comeBackNum = " + keyComeBackNum);
                        Log.i(TAG, "onActivityResult: key_comeBackString" + keyComeBackString);
                        etData.setText("接受到的数据是" + keyComeBackString + keyComeBackNum);
                    }
                }
            }
    );

(1)new ActivityResultContracts.StartActivityForResult()

作用:启动一个 Activity 并获取其返回结果

ActivityResultContracts 是一个包含多种预定义合约(Contract)的工具类,StartActivityForResult 是其中一个静态内部类

(2)new ActivityResultCallback()

作用:回调接口,当被启动的 Activity 关闭并返回结果时触发

重写onActivityResult方法,((20250808114147-zw40xjr “前面我们已经使用过这个方法,但是两者形参不同,”))ActivityResult中包括结果码(resultCode)返回的数据(data)

(3)o.getResultCode()

(4)o.getdata()

3:结果

到此这篇关于Android Activity 如何进行数据传输的文章就介绍到这了,更多相关Android Activity 数据传输内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文