Android如何通过Intent在两个Activity间传递ArrayList集合
Activity间传递
ArrayList<User>集合实现方案 跨Activity传递自定义类型集合的核心是让集合内的元素类支持序列化,Android中可选两种序列化方案,按需选择即可:
- 推荐方案:自定义类实现
Parcelable接口,性能更高、内存占用更低,是Android官方推荐的跨组件传值方案,可通过Android Studio插件自动生成接口实现代码,无需手动编写 - 简易方案:自定义类实现
java.io.Serializable接口,无需编写额外实现代码,仅需声明接口即可,性能略低于Parcelable,小数据量场景下使用无感知
当前(发起跳转的)Activity代码
你已定义好目标集合:
public ArrayList<User> users = new ArrayList<User>();
跳转时根据你选择的序列化方案,将集合存入Intent即可:
// 构造跳转Intent,将CurrentActivity、TargetActivity替换为你项目中对应的Activity类名 Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); // 👉 如果User实现的是Serializable接口,用这行传值 intent.putExtra("user_list", users); // 👉 如果User实现的是Parcelable接口(推荐),注释掉上面那行,用这行传值 // intent.putParcelableArrayListExtra("user_list", users); // 发起跳转 startActivity(intent);
注意:两边传值取值的key必须完全一致,示例中统一用
user_list作为key,可自行修改但必须保证两端相同。
目标(接收数据的)Activity代码
在目标Activity的onCreate生命周期方法中,取出传递过来的集合即可直接复用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_target); // 👉 如果User实现的是Serializable接口,用这行取值 ArrayList<User> receivedUsers = (ArrayList<User>) getIntent().getSerializableExtra("user_list"); // 👉 如果User实现的是Parcelable接口(推荐),注释掉上面那行,用这行取值 // ArrayList<User> receivedUsers = getIntent().getParcelableArrayListExtra("user_list"); // 建议先做非空判断再使用集合,避免空指针 if (receivedUsers != null) { // 这里就可以正常操作receivedUsers集合,和原页面的集合数据完全一致 } }
注意事项
- Intent跨组件传递数据有大小限制(通常为1MB左右),不要用该方式传递数据量过大的集合,否则会出现TransactionTooLargeException崩溃,大数据量场景推荐使用ViewModel、全局单例、本地存储等方案共享数据
- 若使用Parcelable方案,不要混淆User类的代码,否则会出现取值失败问题
- 集合内的所有嵌套自定义属性类,也需要和User类一样实现对应的序列化接口,否则会出现序列化失败异常
内容的提问来源于stack exchange,提问作者RakibulB
相关产品推荐
相关产品推荐

