You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何用Intent传递数组?求助数据接收失败问题

如何通过Intent传递数组/ArrayList?

我来帮你搞定这两个问题,先从基础的传递方法说起,再针对你的ArrayList传递失败的情况排查可能的原因。

一、不同类型数组/ArrayList的传递方式

1. 基本类型数组(比如int[]、String[])

这种最简单,Intent本身就提供了对应的重载方法:
传递代码(第一个Activity):

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
// 传递int数组
int[] numArray = {10, 20, 30};
intent.putExtra("KEY_INT_ARRAY", numArray);
// 传递String数组同理
String[] strArray = {"苹果", "香蕉", "橙子"};
intent.putExtra("KEY_STRING_ARRAY", strArray);
startActivity(intent);

接收代码(第二个Activity):

// 接收int数组
int[] receivedNums = getIntent().getIntArrayExtra("KEY_INT_ARRAY");
// 接收String数组
String[] receivedStrs = getIntent().getStringArrayExtra("KEY_STRING_ARRAY");

2. ArrayList的传递(重点)

ArrayList的传递要看元素类型,必须是可序列化(Serializable)或者可Parcelable的类型(比如String、Integer默认就实现了Serializable,自定义类需要自己实现接口)。

情况1:元素是Serializable类型

比如传递ArrayList或者自定义Serializable类的列表:
传递代码:

ArrayList<String> fruitList = new ArrayList<>();
fruitList.add("草莓");
fruitList.add("芒果");

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("KEY_FRUIT_LIST", fruitList);
startActivity(intent);

如果是自定义类,先让类实现Serializable:

public class User implements Serializable {
    private String username;
    private int age;
    // 正常编写构造方法、getter/setter即可
}

传递ArrayList的方式和上面完全一致。

接收代码:

// 注意强转成对应的ArrayList类型
ArrayList<String> receivedFruits = (ArrayList<String>) getIntent().getSerializableExtra("KEY_FRUIT_LIST");

情况2:元素是Parcelable类型(推荐,效率更高)

如果你的自定义类比较复杂,或者追求更好的性能,推荐用Parcelable:
先编写自定义Parcelable类:

public class User implements Parcelable {
    private String username;
    private int age;

    public User(String username, int age) {
        this.username = username;
        this.age = age;
    }

    // 从Parcel中读取数据的构造方法
    protected User(Parcel in) {
        username = in.readString();
        age = in.readInt();
    }

    // 必须实现的Creator
    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(username);
        dest.writeInt(age);
    }

    // getter/setter
    public String getUsername() { return username; }
    public int getAge() { return age; }
}

传递代码:

ArrayList<User> userList = new ArrayList<>();
userList.add(new User("张三", 28));
userList.add(new User("李四", 30));

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putParcelableArrayListExtra("KEY_USER_LIST", userList);
startActivity(intent);

接收代码:

ArrayList<User> receivedUsers = getIntent().getParcelableArrayListExtra("KEY_USER_LIST");

二、你的ArrayList传递失败的排查方向

你说传了两个ArrayList但接收不到数据,大概率是下面几个问题之一,你可以逐一检查:

  1. 传递和接收的Key不一致:Intent的Key是大小写敏感的!比如你传递用的是"LIST_1",接收写成"list_1"就会拿到null,一定要完全对应。
  2. ArrayList的元素没实现Serializable/Parcelable:如果你的列表里是自定义类,没实现这两个接口的话,数据根本传不出去,甚至会抛出运行时异常。
  3. 接收时用错了方法:比如你用putParcelableArrayListExtra传的,接收却用getSerializableExtra,肯定拿不到数据,要对应起来。
  4. Intent对象错误:比如你新建Intent的时候没指定正确的目标Activity,或者传递前忘记把ArrayList put进去了。

给你一个传递两个ArrayList的正确示例,你可以对照自己的代码看看:

第一个Activity正确代码:

// 初始化两个列表
ArrayList<String> todoList = new ArrayList<>();
todoList.add("买菜");
todoList.add("打扫卫生");

ArrayList<String> shopList = new ArrayList<>();
shopList.add("牛奶");
shopList.add("面包");

// 创建Intent并传递
Intent intent = new Intent(MainActivity.this, NextActivity.class);
intent.putExtra("KEY_TODO", todoList);
intent.putExtra("KEY_SHOP", shopList);
startActivity(intent);

第二个Activity正确代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next);

    // 接收两个列表
    ArrayList<String> receivedTodo = (ArrayList<String>) getIntent().getSerializableExtra("KEY_TODO");
    ArrayList<String> receivedShop = (ArrayList<String>) getIntent().getSerializableExtra("KEY_SHOP");

    // 打印验证
    if (receivedTodo != null) {
        Log.d("NextActivity", "待办列表:" + receivedTodo.toString());
    } else {
        Log.d("NextActivity", "待办列表为空!");
    }
    if (receivedShop != null) {
        Log.d("NextActivity", "购物列表:" + receivedShop.toString());
    } else {
        Log.d("NextActivity", "购物列表为空!");
    }
}

如果你的列表元素是自定义类,记得给类加上Serializable或Parcelable实现,然后调整接收方法就行。

内容的提问来源于stack exchange,提问作者selva s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:42:56