Android Activity数据传递6种方案详解
1. Activity数据传递基础认知作为Android开发的核心组件Activity间的数据传递是每个开发者必须掌握的技能。记得我刚入门时面对不同界面间的数据交互需求常常手忙脚乱直到系统梳理了各种传递方式的适用场景才豁然开朗。本文将结合我五年来的实战经验带大家全面掌握六种主流数据传递方案。Activity作为Android四大组件之一承担着用户界面展示和交互的重要职责。在实际应用中很少有APP只包含单个Activity当需要从一个界面跳转到另一个界面时数据传递就成为了必然需求。比如电商APP从商品列表跳转到详情页需要传递商品ID社交APP从消息列表跳转到聊天窗口需要传递会话信息等。2. 基础数据传递方案2.1 Intent的putExtra方法这是最基础也是最常用的数据传递方式适合传递简单数据类型。其核心原理是通过Intent的附加数据(bundle)实现临时存储。// 发送方Activity Intent intent new Intent(this, TargetActivity.class); intent.putExtra(username, JohnDoe); intent.putExtra(user_age, 25); startActivity(intent); // 接收方Activity String username getIntent().getStringExtra(username); int age getIntent().getIntExtra(user_age, 0);参数类型支持基本类型boolean、byte、char、short、int、long、float、double引用类型String、CharSequence集合类型ArrayList仅限特定类型序列化对象Parcelable、Serializable注意传递大量数据时如超过1MB不建议使用此方式可能导致TransactionTooLargeException异常。2.2 Bundle对象封装当需要传递多个关联参数时使用Bundle对象可以提高代码可读性和维护性。// 发送方 Bundle bundle new Bundle(); bundle.putString(product_id, P10086); bundle.putDouble(price, 2999.99); bundle.putBoolean(in_stock, true); Intent intent new Intent(this, ProductActivity.class); intent.putExtras(bundle); startActivity(intent); // 接收方 Bundle receivedBundle getIntent().getExtras(); if(receivedBundle ! null){ String productId receivedBundle.getString(product_id); // 其他数据获取... }优势对比方式可读性适用场景性能影响直接putExtra较低简单参数无Bundle封装高复杂参数组轻微3. 复杂对象传递方案3.1 Parcelable接口实现Android专有的高效序列化方案适合传递自定义对象。以User对象为例public class User implements Parcelable { private String name; private int age; // 构造方法等... protected User(Parcel in) { name in.readString(); age in.readInt(); } Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } Override public int describeContents() { return 0; } public static final CreatorUser CREATOR new CreatorUser() { Override public User createFromParcel(Parcel in) { return new User(in); } Override public User[] newArray(int size) { return new User[size]; } }; }使用示例// 传递 User user new User(Alice, 28); intent.putExtra(user_data, user); // 接收 User receivedUser getIntent().getParcelableExtra(user_data);3.2 Serializable接口实现Java标准的序列化方案实现简单但性能较低public class Product implements Serializable { private static final long serialVersionUID 1L; private String id; private String name; // getters/setters... }性能对比测试传递1000次相同对象Parcelable平均耗时120msSerializable平均耗时450ms实际开发建议优先使用Parcelable除非需要兼容非Android环境。4. 高级数据共享方案4.1 全局Application类适合需要跨多个Activity共享的数据public class MyApp extends Application { private static SharedData sharedData; Override public void onCreate() { super.onCreate(); sharedData new SharedData(); } public static SharedData getSharedData() { return sharedData; } } // 使用处 SharedData data ((MyApp)getApplicationContext()).getSharedData();内存管理要点避免存储大对象注意生命周期导致的空指针多线程访问需要同步控制4.2 单例模式封装更灵活的数据管理中心方案public class DataManager { private static volatile DataManager instance; private MapString, Object dataMap new ConcurrentHashMap(); private DataManager() {} public static DataManager getInstance() { if (instance null) { synchronized (DataManager.class) { if (instance null) { instance new DataManager(); } } } return instance; } public void putData(String key, Object value) { dataMap.put(key, value); } public T T getData(String key) { return (T) dataMap.get(key); } }5. 跨进程数据传递5.1 文件/SharedPreferences共享适合持久化数据的共享// 写入 SharedPreferences prefs getSharedPreferences(app_data, MODE_PRIVATE); prefs.edit().putString(session_token, abc123).apply(); // 读取其他进程 SharedPreferences prefs getSharedPreferences(app_data, MODE_PRIVATE); String token prefs.getString(session_token, null);文件权限说明MODE_PRIVATE仅当前应用可访问MODE_WORLD_READABLE已废弃MODE_MULTI_PROCESS已废弃5.2 ContentProvider方案安全可控的跨进程数据共享public class MyProvider extends ContentProvider { // 实现query/insert/update/delete等方法 } // 使用示例 Uri uri Uri.parse(content://com.example.provider/data); Cursor cursor getContentResolver().query(uri, null, null, null, null);6. 新型数据传递技术6.1 ViewModel共享Android Architecture Components提供的方案// 共享ViewModel public class SharedViewModel extends ViewModel { private final MutableLiveDataString selectedItem new MutableLiveData(); public void selectItem(String item) { selectedItem.setValue(item); } public LiveDataString getSelectedItem() { return selectedItem; } } // Activity中使用 SharedViewModel model new ViewModelProvider(this).get(SharedViewModel.class); model.selectItem(data_to_share);6.2 Result APIAndroidX Activity 1.2.0更优雅的结果回调机制// 注册结果回调 registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result - { if (result.getResultCode() RESULT_OK) { Intent data result.getData(); // 处理返回数据 } }); // 启动目标Activity Intent intent new Intent(this, TargetActivity.class); startActivity(intent); // 目标Activity返回数据 Intent resultData new Intent(); resultData.putExtra(result_key, return_value); setResult(RESULT_OK, resultData); finish();7. 实战问题排查指南常见问题1数据传递后为null检查key是否完全一致区分大小写确认发送方确实put了数据接收方是否在onCreate中获取getIntent()只在首次创建时有效常见问题2传递自定义对象崩溃确认实现了Parcelable/SerializableParcelable的CREATOR字段必须为public static final检查对象中所有字段是否都实现了序列化性能优化建议大数据集考虑使用临时数据库频繁传递的小数据可使用全局缓存跨进程通信优先考虑ContentProvider使用ViewModel减少序列化开销我在实际项目中最推荐的是组合使用ViewModel和Parcelable方案既保证了类型安全又兼顾了性能。特别是在Fragment和Activity间共享数据时ViewModel的生命周期感知特性可以避免很多内存泄漏问题。

相关新闻

ASP.NET社区站点外观加载机制与主题定制实战

ASP.NET社区站点外观加载机制与主题定制实战

1. Community Starter Kit外观加载机制解析Community Starter Kit(CSK)作为ASP.NET生态中的经典社区站点解决方案,其外观系统采用了典型的三层架构设计。这套机制的精妙之处在于将界面表现、业务逻辑和数据存储彻底分离,使得开发者…

2026/7/21 16:00:04 阅读更多 →
JDK17环境搭建与多版本管理实战指南

JDK17环境搭建与多版本管理实战指南

1. JDK17环境搭建全景指南作为Java生态中最重要的长期支持版本,JDK17自发布以来就受到开发者广泛关注。我在实际企业级项目迁移过程中发现,虽然官方文档提供了基础安装说明,但许多关键细节(如多版本共存配置、环境变量优化等&…

2026/7/22 20:34:51 阅读更多 →
Surface Pro 7打造移动渗透测试平台:Hyper-V虚拟机部署Kali Linux全攻略

Surface Pro 7打造移动渗透测试平台:Hyper-V虚拟机部署Kali Linux全攻略

1. 项目概述与核心思路看到这个标题,很多朋友可能会想,不就是给Surface Pro 7装个Kali Linux吗?这有什么好说的。但如果你真的这么想,可能就错过了这个项目的精髓。我折腾过不少设备,从厚重的游戏本到各种NUC小主机&am…

2026/7/21 14:53:27 阅读更多 →

最新新闻

LaCo: Large Language Model Pruning via Layer Collapse 解读

LaCo: Large Language Model Pruning via Layer Collapse 解读

一、论文基本信息 论文题目:LaCo: Large Language Model Pruning via Layer Collapse 作者:Yifei Yang、Zouying Cao、Hai Zhao 发表:Findings of EMNLP 2024 方法名称:LaCo,Layer Collapse 论文代码:…

2026/7/23 22:41:29 阅读更多 →
ESC框架知识点

ESC框架知识点

安装ECS在PackageManager中搜索并安装Entities Graphics烘焙Entitypublic class FallingCubeSpawnerAuthoring : MonoBehaviour{public class Baker : Baker<FallingCubeSpawnerAuthoring>{public override void Bake(FallingCubeSpawnerAuthoring authoring){Entity spa…

2026/7/23 22:41:29 阅读更多 →
Pulsar 消息同步机制

Pulsar 消息同步机制

Pulsar 就是一个消息中间件&#xff08;消息队列&#xff09;&#xff0c;和 RabbitMQ、Kafka 是同一类东西。它解决的核心问题就一个&#xff1a;让两个服务之间不用直接互相调用&#xff0c;而是通过一个"信箱"传话。放在你的项目里&#xff0c;场景特别具体&#…

2026/7/23 22:41:29 阅读更多 →
具身智能重构高墙透明治理:视频孪生+无感空间感知,打造司法监所全域穿透防线

具身智能重构高墙透明治理:视频孪生+无感空间感知,打造司法监所全域穿透防线

具身智能重构高墙透明治理&#xff1a;视频孪生无感空间感知&#xff0c;打造司法监所全域穿透防线技术出品&#xff1a;镜像视界&#xff08;浙江&#xff09;科技有限公司一、行业现状与高墙管控核心桎梏随着数字法治、智慧司法建设纵深推进&#xff0c;看守所、监狱、留置场…

2026/7/23 22:40:28 阅读更多 →
一位直博生的 AI 编程困境,会语法,却写不出项目?|AI悦创VibeCoding/Python一对一辅导分享

一位直博生的 AI 编程困境,会语法,却写不出项目?|AI悦创VibeCoding/Python一对一辅导分享

你好&#xff0c;我是悦创。 会 C、Python 语法&#xff0c;为什么一遇到真实项目&#xff0c;还是不知道从哪里下手&#xff1f; 这场会议里&#xff0c;一位 985 大三、已直博清华的同学也遇到了同样的问题&#xff1a;局部代码能看懂&#xff0c;自己写却一片空白&#xff1…

2026/7/23 22:40:28 阅读更多 →
ShortGPT: Layers in Large Language Models are More Redundant Than You Expect 解读

ShortGPT: Layers in Large Language Models are More Redundant Than You Expect 解读

一、论文基本信息 论文题目&#xff1a;ShortGPT: Layers in Large Language Models are More Redundant Than You Expect 核心方法&#xff1a; ShortGPT&#xff1a;面向选择题、困惑度评估等场景的静态层剪枝&#xff1b; ShortGPT-gen&#xff1a;面向自回归生成任务的动…

2026/7/23 22:40:28 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从单点好评到指数级传播&#xff1a;AI副业主理人必须掌握的4层口碑渗透模型&#xff08;含ROI测算表&#xff09; 当AI副业主理人不再仅满足于单次服务交付&#xff0c;而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI写作开头钩子设计&#xff1a;为什么你的AI文案完读率不足18%&#xff1f;——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后&#xff0c;我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南&#xff1a;免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻