当前位置: 首页 > news >正文

【Android】Activity 如何进行数据传输

在这里插入图片描述

三三要成为安卓糕手

一:Activity之间的数据传输

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

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

1:MainActivity做处理

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

	<Buttonandroid: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"/><EditTextandroid: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

<Buttonandroid: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);}
  • startActivityForResult方法在安卓API30以后已经过时了,但是很多商业中也会用到这个玩意,也得学bro

    • 参数一:Intent 对象,“要启动哪个页面”,也可以在 Intent 里用 putExtra 携带数据传给目标页面。
    • 参数二:requestCode(请求码),给这次跳转打个 “标记 9”,等目标页面返回数据时,能通过这个标记识别 “这是 btn_start_second4 按钮跳转的返回”。

(2)onActivityResult

@Overrideprotected 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);}}
  • requestCode:“请求码”,自己定义的一个整数标记,这里是9; 区分 “是哪一次启动 Activity 的请求”

    • 比如:一个页面有多个按钮,都用 startActivityForResult 跳转到不同页面,靠 requestCode 就知道 “这次返回的数据,对应之前哪个按钮的跳转” 。
  • resultCode:“结果码”,是目标 Activity 返回的状态标记

  • data:一个 Intent 对象,是目标 Activity 返回的 “数据载体”; 记得判空

    • getInExtra取到的值如果为空,默认为0

2:SecondActivity做处理

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

<Buttonandroid: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() {@Overridepublic 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();}});
  • setResult(8,backIntent),这里我们的结果码就是8

3:逻辑梳理

  • 启动时

    • 通过 startActivityForResult(intent, 9) 启动 SecondActivity,这里的 9 就是 requestCode(请求码)。
  • 目标页面返回时
    SecondActivity 中,需要通过 setResult(8, data) 来设置返回结果:

    • 第一个参数 8 就是 resultCode(结果码,自定义的标记)
    • 第二个参数 dataIntent 对象,通过 putExtra 存入数据(key_comeBackNumkey_comeBackString
  • 接收返回时:回到当前页面的 onActivityResult 方法:

    • 通过 requestCode == 9 判断:“这是之前用请求码 9 启动的页面返回的结果”
    • 通过 resultCode == 8 判断:“目标页面返回了结果码 8 的状态”
    • data 中取出携带的 key_comeBackNumkey_comeBackString,并更新到 etData 输入框中

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>() {@Overridepublic 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:结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.dtcms.com/a/341040.html

相关文章:

  • java17学习笔记-switch总结
  • 使用 GraalVM Native Image 将 Spring Boot 应用编译为跨平台原生镜像:完整指南
  • linux 内核 - 内存管理单元(MMU)与地址翻译(一)
  • yolo_RK3588系列(三)
  • mac电脑软件左上角的关闭/最小化/最大化按钮菜单的宽度和高度是多少像素
  • ijkplayer Android 编译
  • strncpy 函数使用及其模拟实现
  • AI重塑软件测试:质量保障的下一站
  • 成本管控:餐饮利润的隐形守护者
  • Zemax光学设计输出3D
  • 4位量化:常规的线性层被替换成了4位线性层(48)
  • 酶 EC number 预测工具CLEAN的安装和使用
  • QT官方库头文件找不到(添加模块方法)
  • C++模板元编程:从SFINAE到Concepts的进化史
  • mac 搭建docker-compose,部署docker应用
  • AI on Mac, Your Way!全本地化智能代理,隐私与性能兼得
  • pcl求平面点云的边界凸包点
  • Frida Hook Android Activity生命周期全方法监控方案
  • 哈希:字母异位词分组
  • RHCA07-Linux跟踪工具及CPU调优
  • Linux I/O 多路复用实战:深入剖析 Select 与 Poll
  • capsh 命令详解
  • 【机器学习深度学习】Ollama、vLLM、LMDeploy对比:选择适合你的 LLM 推理框架
  • Objective-C 版本的 LiveEventBus 效果
  • vue+openlayers示例:适配arcgis矢量瓦片服务以及样式(附源码下载)
  • 英伟达Blackwell架构下的中国特供版AI芯片:B30A与RTX 6000D,是技术妥协还是市场新策略?
  • 基于单片机太阳能充电器/太阳能转换电能
  • C端高并发项目都有哪些
  • Angular由一个bug说起之十八:伴随框架升级而升级ESLint遇到的问题与思考
  • C++围绕音视频相关的资料都有哪些?如何进行学习