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

Android开发:如何实现跨Activity访问自定义类数组

跨Activity访问自定义类数组的实现方案

你在Activity2中直接定义ArrayList变量无法直接获取MainActivity内的数组实例,原因是不同Activity拥有独立的上下文实例,无法直接互相访问非静态成员变量。可通过以下几种方式实现需求:

方案1:通过Intent传递(官方推荐,适合数据量不大的场景)

Android官方推荐使用Intent传递跨页面数据,自定义类需要实现Parcelable接口完成序列化,性能远高于Java原生的Serializable。

  1. 修改MyAreas类实现Parcelable接口
import android.os.Parcel;
import android.os.Parcelable;

public class MyAreas implements Parcelable {
    public double val;
    public double val2;
    public String name;
    public String status;

    public MyAreas(double val, double val2, String name, String status) {
        this.val = val;
        this.val2 = val2;
        this.name = name;
        this.status = status;
    }

    // Parcelable实现逻辑
    protected MyAreas(Parcel in) {
        val = in.readDouble();
        val2 = in.readDouble();
        name = in.readString();
        status = in.readString();
    }

    public static final Creator<MyAreas> CREATOR = new Creator<MyAreas>() {
        @Override
        public MyAreas createFromParcel(Parcel in) {
            return new MyAreas(in);
        }

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeDouble(val);
        dest.writeDouble(val2);
        dest.writeString(name);
        dest.writeString(status);
    }
}
  1. MainActivity跳转时传递数组
// 跳转Activity2的逻辑中添加
Intent intent = new Intent(MainActivity.this, Activity2.class);
intent.putExtra("myAreaData", myArea);
startActivity(intent);
  1. Activity2中接收数据
// onCreate方法中获取
MyAreas[] receivedArray = getIntent().getParcelableArrayExtra("myAreaData");
// 如需转成ArrayList可以用下面的代码
// ArrayList<MyAreas> mMyAreasList = new ArrayList<>(Arrays.asList(receivedArray));

方案2:全局Application存储(适合全应用生命周期复用的数据)

  1. 自定义Application类
public class MyApp extends Application {
    private MyAreas[] myAreaArray;

    public MyAreas[] getMyAreaArray() {
        return myAreaArray;
    }

    public void setMyAreaArray(MyAreas[] myAreaArray) {
        this.myAreaArray = myAreaArray;
    }
}
  1. 在AndroidManifest.xml中声明自定义Application
<application
    android:name=".MyApp"
    其余原有属性不变>
    <!-- 原有Activity等组件声明 -->
</application>
  1. MainActivity初始化数组后存入Application
((MyApp) getApplication()).setMyAreaArray(myArea);
  1. Activity2中直接取值
MyAreas[] receivedArray = ((MyApp) getApplication()).getMyAreaArray();

注意:该方式存储的数据会随应用进程销毁清空,不适合存储需要持久化的数据

方案3:静态变量存储(仅推荐临时测试使用)

  1. 把MainActivity中的数组声明改为静态
public static MyAreas[] myArea;
  1. Activity2中直接访问
MyAreas[] receivedArray = MainActivity.myArea;

注意:该方式容易引发内存泄漏,若数组持有Context相关引用会导致内存无法正常回收,不建议线上环境使用

内容的提问来源于stack exchange,提问作者Carlos Melendez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:39:03