Android开发:如何实现跨Activity访问自定义类数组
跨Activity访问自定义类数组的实现方案
你在Activity2中直接定义ArrayList变量无法直接获取MainActivity内的数组实例,原因是不同Activity拥有独立的上下文实例,无法直接互相访问非静态成员变量。可通过以下几种方式实现需求:
方案1:通过Intent传递(官方推荐,适合数据量不大的场景)
Android官方推荐使用Intent传递跨页面数据,自定义类需要实现Parcelable接口完成序列化,性能远高于Java原生的Serializable。
- 修改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); } }
- MainActivity跳转时传递数组
// 跳转Activity2的逻辑中添加 Intent intent = new Intent(MainActivity.this, Activity2.class); intent.putExtra("myAreaData", myArea); startActivity(intent);
- Activity2中接收数据
// onCreate方法中获取 MyAreas[] receivedArray = getIntent().getParcelableArrayExtra("myAreaData"); // 如需转成ArrayList可以用下面的代码 // ArrayList<MyAreas> mMyAreasList = new ArrayList<>(Arrays.asList(receivedArray));
方案2:全局Application存储(适合全应用生命周期复用的数据)
- 自定义Application类
public class MyApp extends Application { private MyAreas[] myAreaArray; public MyAreas[] getMyAreaArray() { return myAreaArray; } public void setMyAreaArray(MyAreas[] myAreaArray) { this.myAreaArray = myAreaArray; } }
- 在AndroidManifest.xml中声明自定义Application
<application android:name=".MyApp" 其余原有属性不变> <!-- 原有Activity等组件声明 --> </application>
- MainActivity初始化数组后存入Application
((MyApp) getApplication()).setMyAreaArray(myArea);
- Activity2中直接取值
MyAreas[] receivedArray = ((MyApp) getApplication()).getMyAreaArray();
注意:该方式存储的数据会随应用进程销毁清空,不适合存储需要持久化的数据
方案3:静态变量存储(仅推荐临时测试使用)
- 把MainActivity中的数组声明改为静态
public static MyAreas[] myArea;
- Activity2中直接访问
MyAreas[] receivedArray = MainActivity.myArea;
注意:该方式容易引发内存泄漏,若数组持有Context相关引用会导致内存无法正常回收,不建议线上环境使用
内容的提问来源于stack exchange,提问作者Carlos Melendez
相关产品推荐
相关产品推荐

