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

MainActivity与RecActivity之间的双向数据传递详解

在这里插入图片描述

文章目录

  • MainActivity与RecActivity之间的双向数据传递详解
    • 1. 从MainActivity向RecActivity传递数据
      • 1.1 基本数据传递方式
      • 1.2 接收数据 - RecActivity.java
    • 2. 从RecActivity返回数据给MainActivity
      • 2.1 返回数据 - RecActivity.java
      • 2.2 接收返回数据 - MainActivity.java
    • 3. 完整流程说明
    • 4. 高级用法和注意事项
      • 4.1 使用Bundle传递复杂数据
      • 4.2 处理Activity被系统销毁的情况
      • 4.3 使用ViewModel共享数据(推荐)
    • 5. 常见问题解决方案
      • 5.1 数据未传递成功
      • 5.2 onActivityResult未被调用
      • 5.3 传递大对象导致性能问题
    • 6. 完整示例代码结构

MainActivity与RecActivity之间的双向数据传递详解

下面我将详细介绍如何从MainActivity向RecActivity传递数据,以及如何从RecActivity返回数据给MainActivity的完整流程。

1. 从MainActivity向RecActivity传递数据

在这里插入图片描述

1.1 基本数据传递方式

MainActivity.java

public class MainActivity extends AppCompatActivity {private static final int REQUEST_CODE = 1001; // 请求码,用于识别返回结果@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button sendButton = findViewById(R.id.send_button);sendButton.setOnClickListener(v -> {// 创建Intent并传递数据Intent intent = new Intent(MainActivity.this, RecActivity.class);// 传递基本数据类型intent.putExtra("message", "Hello from MainActivity");intent.putExtra("number", 42);// 传递Parcelable对象User user = new User("张三", 25);intent.putExtra("user", user);// 启动Activity并期待返回结果startActivityForResult(intent, REQUEST_CODE);});}
}

1.2 接收数据 - RecActivity.java

public class RecActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_rec);// 接收来自MainActivity的数据Intent intent = getIntent();String message = intent.getStringExtra("message");int number = intent.getIntExtra("number", 0);User user = intent.getParcelableExtra("user");// 显示接收到的数据TextView receivedDataView = findViewById(R.id.received_data);receivedDataView.setText(String.format("收到数据:\n消息: %s\n数字: %d\n用户: %s, %d岁",message, number, user != null ? user.getName() : "无", user != null ? user.getAge() : 0));}
}

2. 从RecActivity返回数据给MainActivity

2.1 返回数据 - RecActivity.java

public class RecActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_rec);Button returnButton = findViewById(R.id.return_button);returnButton.setOnClickListener(v -> {// 创建返回的IntentIntent resultIntent = new Intent();// 添加返回数据resultIntent.putExtra("result_message", "Hello back from RecActivity");resultIntent.putExtra("result_number", 100);// 添加Parcelable对象User modifiedUser = new User("李四", 30);resultIntent.putExtra("result_user", modifiedUser);// 设置结果并结束ActivitysetResult(RESULT_OK, resultIntent);finish(); // 关闭当前Activity,返回MainActivity});}
}

2.2 接收返回数据 - MainActivity.java

public class MainActivity extends AppCompatActivity {// ... 之前的代码 ...@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);// 检查请求码和结果码if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {// 获取返回的数据String resultMessage = data.getStringExtra("result_message");int resultNumber = data.getIntExtra("result_number", 0);User resultUser = data.getParcelableExtra("result_user");// 显示返回的数据TextView resultView = findViewById(R.id.result_view);resultView.setText(String.format("返回数据:\n消息: %s\n数字: %d\n用户: %s, %d岁",resultMessage, resultNumber,resultUser != null ? resultUser.getName() : "无",resultUser != null ? resultUser.getAge() : 0));} else if (resultCode == RESULT_CANCELED) {Toast.makeText(this, "用户取消了操作", Toast.LENGTH_SHORT).show();}}
}

3. 完整流程说明

  1. MainActivity启动RecActivity:

    • 使用startActivityForResult()方法启动
    • 通过Intent的putExtra()方法传递数据
  2. RecActivity接收数据:

    • 通过getIntent()获取Intent对象
    • 使用对应的getXxxExtra()方法获取数据
  3. RecActivity返回数据:

    • 创建新的Intent用于返回数据
    • 使用setResult()设置返回码和返回Intent
    • 调用finish()关闭Activity
  4. MainActivity接收返回数据:

    • 重写onActivityResult()方法
    • 检查requestCoderesultCode
    • 从返回的Intent中获取数据

4. 高级用法和注意事项

4.1 使用Bundle传递复杂数据

MainActivity发送:

Bundle bundle = new Bundle();
bundle.putString("key1", "value1");
bundle.putInt("key2", 123);
intent.putExtra("data_bundle", bundle);

RecActivity接收:

Bundle receivedBundle = getIntent().getBundleExtra("data_bundle");
if (receivedBundle != null) {String value1 = receivedBundle.getString("key1");int value2 = receivedBundle.getInt("key2");
}

4.2 处理Activity被系统销毁的情况

当系统可能销毁并重建Activity时,应使用onSaveInstanceState()保存状态:

MainActivity.java

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);// 保存必要数据outState.putString("saved_message", "临时保存的数据");
}

4.3 使用ViewModel共享数据(推荐)

对于更复杂的数据共享,可以考虑使用ViewModel:

  1. 添加ViewModel依赖:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.4.0"
  1. 创建共享ViewModel:
public class SharedViewModel extends ViewModel {private final MutableLiveData<String> sharedData = new MutableLiveData<>();public void setData(String data) {sharedData.setValue(data);}public LiveData<String> getData() {return sharedData;}
}
  1. 在Activity中使用:
// MainActivity中
SharedViewModel viewModel = new ViewModelProvider(this).get(SharedViewModel.class);
viewModel.setData("要共享的数据");// RecActivity中
SharedViewModel viewModel = new ViewModelProvider(this).get(SharedViewModel.class);
viewModel.getData().observe(this, data -> {// 使用数据更新UI
});

5. 常见问题解决方案

5.1 数据未传递成功

  • 检查键名是否一致
  • 确保数据类型匹配
  • 检查是否有拼写错误

5.2 onActivityResult未被调用

  • 确保使用startActivityForResult()而不是startActivity()
  • 检查请求码是否正确
  • 确保RecActivity调用了setResult()finish()

5.3 传递大对象导致性能问题

  • 避免直接传递大Bitmap
  • 考虑传递URI或文件路径
  • 使用全局变量或ViewModel替代

6. 完整示例代码结构

app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   ├── com.example.myapp/
│   │   │   │   ├── MainActivity.java
│   │   │   │   ├── RecActivity.java
│   │   │   │   ├── model/
│   │   │   │   │   ├── User.java (Parcelable)
│   │   │   │   │   └── SharedViewModel.java
│   │   ├── res/
│   │   │   ├── layout/
│   │   │   │   ├── activity_main.xml
│   │   │   │   └── activity_rec.xml

通过以上完整实现,你可以轻松地在MainActivity和RecActivity之间实现双向数据传递,满足大多数应用场景的需求。
在这里插入图片描述

http://www.xdnf.cn/news/29665.html

相关文章:

  • 从 0~1 保姆级 详细版 PostgreSQL 数据库安装教程
  • 数据库备份-docker配置主从数据库
  • k8s安装kubeadm
  • 探索大语言模型(LLM):Transformer 与 BERT从原理到实践
  • 回溯算法(2):全排列问题
  • 基于DeepSeek与Excel的动态图表构建:技术融合与实践应用
  • WebSocket介绍
  • 二级评论列表-Java实现
  • 从零搭建微服务项目Pro(第6-2章——微服务鉴权模块SpringSecurity+JWT)
  • OCR技术与视觉模型技术的区别、应用及展望
  • Python语法系列博客 · 第7期[特殊字符] 列表推导式与字典推导式:更优雅地处理数据结构
  • 使用Redis实现实时排行榜
  • 【Easylive】​​Gateway模块 bootstrap.yml 解析
  • 点云数据处理开源C++方案
  • elementUI中MessageBox.confirm()默认不聚焦问题处理
  • Qt UDP 通信的详细实现步骤和示例代码
  • spring boot应用部署IIS
  • matlab论文图一的地形区域图的球形展示Version_1
  • 基于springboot的老年医疗保健系统
  • 【Matlab】中国东海阴影立体感地图
  • 【蓝桥杯 2025 省 A 扫地机器人】题解
  • Graham Scan算法求解二维凸包
  • 通过Xshell上传文件到Linux
  • Python:使用web框架Flask搭建网站
  • JS案例-Promise/A+ 规范的手写实现
  • 【厦门大学】DeepSeek大模型赋能政府数字化转型
  • OSPF实验
  • React-memo (useMemo, useCallback)
  • PG数据库推进医疗AI向量搜索优化路径研究(2025年3月修订版)
  • 破解保险箱