Activity之间数据传递的核心方法与实战 在Android开发中Intent是Activity之间通信的“信使”而数据是其传递的“信件”。本文系统梳理了所有主流的数据传递方法涵盖基本类型、数组、集合、Bundle以及自定义对象并提供最佳实践和注意事项。一、核心方法总览四大传递路径Activity间数据传递可归纳为四大类开发者可根据数据类型和场景灵活选择。二、实战代码详解发送与接收全流程2.1 基本类型及Bundle传递发送端在启动Activity的Intent中通过putExtra方法发送数据。对于Bundle先封装数据再整体放入Intent。if (v.getId()R.id.btn14) { Intent intent new Intent(MainActivity.this,SecondActivity.class); intent.putExtra(boolean,true); intent.putExtra(byte,(byte) 1); intent.putExtra(char,a); intent.putExtra(short,(short) 1); intent.putExtra(int,1); intent.putExtra(long,1L); intent.putExtra(float,1.0f); intent.putExtra(double,1.0); Bundle bundle new Bundle(); bundle.putBoolean(boolean,true); bundle.putInt(int,11); intent.putExtra(bundle,bundle); startActivity(intent); }2.2 基本类型及Bundle接收接收端在目标Activity中通过getIntent()获取Intent并使用对应的getXXXExtra方法提取数据需提供默认值。接收Bundle时需先获取Bundle对象。Intent intent getIntent(); String sintent.getStringExtra(data); Log.e(test222,booleanintent.getBooleanExtra(boolean,false)); Log.e(test222,byteintent.getByteExtra(byte,(byte)0)); Log.e(test222,charintent.getCharExtra(char,0)); Log.e(test222,shortintent.getShortExtra(short, (short)0)); Log.e(test222,intintent.getIntExtra(int, 0)); Log.e(test222,longintent.getLongExtra(long, 0L)); Log.e(test222,floatintent.getFloatExtra(float, 0.1f)); Log.e(test222,doubleintent.getDoubleExtra(double, 0.1)); Bundle bundle intent.getBundleExtra(bundle); Log.e(test222,bundle booleanbundle.getBoolean(boolean,false)); Log.e(test222,bundle intbundle.getInt(int,0));2.3 数组、集合及自定义对象传递发送端核心前提自定义类必须实现序列化接口。以下展示Student类实现SerializableTeacher类实现Parcelable。package cc.youmupu.myapplication_activity.bean; import java.io.Serializable; public class Student implements Serializable { private String name; private int age; private int num; Override public String toString() { return Student{ name name \ , age age , num num }; } public String getName() { return name; } public void setName(String name) { this.name name; } public int getAge() { return age; } public void setAge(int age) { this.age age; } public int getNum() { return num; } public void setNum(int num) { this.num num; } }package cc.youmupu.myapplication_activity.bean; import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.NonNull; public class Teacher implements Parcelable { private String name; private int age; private int num; public Teacher() { } protected Teacher(Parcel in) { name in.readString(); age in.readInt(); num in.readInt(); } public static final CreatorTeacher CREATOR new CreatorTeacher() { Override public Teacher createFromParcel(Parcel in) { return new Teacher(in); } Override public Teacher[] newArray(int size) { return new Teacher[size]; } }; Override public String toString() { return Teacher{ name name \ , age age , num num }; } public String getName() { return name; } public void setName(String name) { this.name name; } public int getNum() { return num; } public void setNum(int num) { this.num num; } public int getAge() { return age; } public void setAge(int age) { this.age age; } Override public int describeContents() { return 0; } Override public void writeToParcel(NonNull Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); dest.writeInt(num); } }发送各种数据类型的代码示例int intArray[] new int[] {1,2,3,4}; intent.putExtra(array,intArray); ArrayListString list new ArrayList(); list.add(aaaa); list.add(bbbb); list.add(cccc); intent.putStringArrayListExtra(list,list); Student student new Student(); student.setName(youmupu); student.setAge(18); student.setNum(2023710); intent.putExtra(student,student); Teacher teacher new Teacher(); teacher.setName(Dragonli); teacher.setAge(28); teacher.setNum(2023410); intent.putExtra(teacher,teacher);2.4 数组、集合及自定义对象接收接收端使用对应的getIntArrayExtra、getStringArrayListExtra、getSerializableExtra、getParcelableExtra等方法提取数据。注意对象类型强制转换。int intArray[] intent.getIntArrayExtra(array); for (int i : intArray) { Log.e(test222,arrayi); } ArrayListString list intent.getStringArrayListExtra(list); for (String s1 : list) { Log.e(test222,lists1); } Student student (Student) intent.getSerializableExtra(student); Log.e(test222,studentstudent.toString()); Teacher teacher (Teacher) intent.getParcelableExtra(teacher); Log.e(test222,teacherteacher.toString());三、核心选择与最佳实践四、常见场景应用路径A直接传递最常用机制直接调用Intent的putExtra()方法传入键值对。适用所有基本数据类型int, boolean, String等。特点简单直接Intent内部会将数据存储在Bundle中。路径BBundle打包传递机制创建Bundle对象将数据打包后通过intent.putExtras(bundle)一次性发送。适用批量传递多种类型数据需要在多个Activity间接力传递的场景传递复杂数据结构需实现Serializable/Parcelable。特点灵活性高支持批量操作和数据接力。路径C数组与集合传递机制Intent提供了针对数组和常见集合如ArrayListString的专用方法如putExtra(array, intArray)或putStringArrayListExtra(list, list)。适用传递一组同类型数据。特点相比于手动序列化/反序列化更为高效和类型安全。路径D自定义对象传递机制对象必须实现序列化接口方可放入Intent或Bundle中传递。两种方案SerializableJava标准只需实现标记接口简单但效率较低。ParcelableAndroid特有需实现完整序列化方法代码稍多但性能显著优于Serializable是官方推荐方式。基础数据直接传简单的基本类型和String直接用intent.putExtra效率最高。批量传递用Bundle当需要传递多个不同类型数据或数据需要在多个Activity间“接力”时优先使用Bundle打包。它提供了更灵活的批量操作接口。对象传递选Parcelable对于自定义对象若非临时简单使用强烈推荐实现Parcelable接口。它在Android系统内的序列化效率远高于Serializable尤其是在数据量较大或频繁传递时。键名管理建议将Intent或Bundle中使用的键名定义为全局常量避免因拼写错误导致的数据获取失败。数据大小限制注意通过Intent/Bundle传递的数据不宜过大。虽然Binder的容量限制通常约1MB主要针对Binder事务但过大的数据如大图片、长列表仍可能导致TransactionTooLargeException。对于大数据应考虑使用文件、数据库或全局单例等方式共享。类型安全务必使用与数据类型严格匹配的get/set方法如getIntExtra对putExtra(key, intValue)否则可能导致运行时异常或错误数据。简单值传递如传递用户ID、开关状态、查询关键词直接使用putExtra。表单数据传递一个Activity收集多项用户信息如姓名、年龄、地址传递到下一个Activity预览或提交。推荐使用Bundle打包代码结构更清晰。列表项详情点击列表项跳转详情页传递列表项的ID或整个对象需序列化。通常直接传递ID详情页再根据ID查询数据是更解耦的做法。多步骤流程如注册流程分步填写信息每一步将数据存入Bundle并随着Intent传递给下一步最后在提交环节汇总所有Bundle中的数据。设置/配置传递将一组配置参数如主题、语言、网络设置打包传递到新的Activity或Fragment。