Android 将对象数据从一个活动传输到另一个活动

Android 将对象数据从一个活动传输到另一个活动,android,Android,我的EmployeeInfo课程如下: public class EmployeeInfo { private int id; // Employee ID private String name; // Employee Name private int age;// Employee Age public int getEmployeeID() { return id; }

我的EmployeeInfo课程如下:

 public class EmployeeInfo {
        private int id; // Employee ID
        private String name; // Employee Name
        private int age;// Employee Age

        public int getEmployeeID() {
            return id;
        }

        public void setEmployeeID(int id) {
            this.id = id;
        }

        public String getEmployeeName() {
            return name;
        }

        public void setEmployeeName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age= age;
        }
    }


ArrayList<EmployeeInfo> employeeInfo object contains the emplyoyee info data for multiple employees.
我想将数据数组列表employeeInfo从Activity1传输到Activity2

使用Parcelable是将数据从Activity1传输到Activity2的唯一方法吗? 如果没有,还有什么选择

如果是,请提供Parcelable的原型代码以及如何将对象数据从Activity1传输到Activity2的示例代码。

您只需让EmployeeInfo类实现序列化即可。或者你可以像这样发送数据

intent.putExtra("id", employInfo.getEmployeeID());
intent.putExtra("name", employInfo.getEmployeeName());
intent.putExtra("age", employInfo.getAge());
如果需要传输自定义类的列表,我将使用第一种方法。所以您可以将整个列表设置为可序列化。 然而,他们说每个人都应该使用Parcelable,因为它更快。Tbh,我从未使用过它,因为它需要更多的努力,而且我怀疑有人能意识到常规应用程序在速度上的差异,而不需要通过intent发送大量数据。你可以简单地让EmployeeInfo类实现可序列化。或者你可以像这样发送数据

intent.putExtra("id", employInfo.getEmployeeID());
intent.putExtra("name", employInfo.getEmployeeName());
intent.putExtra("age", employInfo.getAge());
如果需要传输自定义类的列表,我将使用第一种方法。所以您可以将整个列表设置为可序列化。
然而,他们说每个人都应该使用Parcelable,因为它更快。Tbh,我从未使用过它,因为它需要更多的努力,而且我怀疑有人能意识到在常规应用程序中,通过intent发送大量数据时速度的差异。以下是我对Parcelable的实现:

public class ProfileData implements Parcelable {

private int gender;
private String name;
private String birthDate;

public ProfileData(Parcel source) {
    gender = source.readInt();
    name = source.readString();
    birthDate = source.readString();
}

public ProfileData(int dataGender, String dataName, String dataBDate) {
    gender = dataGender;
    name = dataName;
    birthDate = dataBDate;
}

// Getters and Setters are here

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

@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(gender);
out.writeString(name);
out.writeString(birthDate);
}

public static final Parcelable.Creator<ProfileData> CREATOR
      = new Parcelable.Creator<ProfileData>() {

public ProfileData createFromParcel(Parcel in) {
    return new ProfileData(in);
}

public ProfileData[] newArray(int size) {
    return new ProfileData[size];
}
并获取数据:

    Bundle data = getIntent().getExtras();
    ProfileData profile = data.getParcelable("profile_details");

以下是我对Parcelable的实现:

public class ProfileData implements Parcelable {

private int gender;
private String name;
private String birthDate;

public ProfileData(Parcel source) {
    gender = source.readInt();
    name = source.readString();
    birthDate = source.readString();
}

public ProfileData(int dataGender, String dataName, String dataBDate) {
    gender = dataGender;
    name = dataName;
    birthDate = dataBDate;
}

// Getters and Setters are here

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

@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(gender);
out.writeString(name);
out.writeString(birthDate);
}

public static final Parcelable.Creator<ProfileData> CREATOR
      = new Parcelable.Creator<ProfileData>() {

public ProfileData createFromParcel(Parcel in) {
    return new ProfileData(in);
}

public ProfileData[] newArray(int size) {
    return new ProfileData[size];
}
并获取数据:

    Bundle data = getIntent().getExtras();
    ProfileData profile = data.getParcelable("profile_details");

好问题。查看文档并进行扶手椅编码:

可以通过调用putExtrasBundle和myBundle.putSerializable在活动之间传递对象。对象和整个对象树需要实现可序列化

日航

编辑:答案是肯定的:

可以通过调用putExtrasBundle和myBundle.putSerializable在活动之间传递不可变对象。对象和整个对象树需要实现可序列化。这是面向对象编程的基本原则,即传递有状态消息

首先,我们通过声明一个新类来创建不可变对象:

package jalcomputing.confusetext;

import java.io.Serializable;

/*
 * Immutable messaging object to pass state from Activity Main to Activity ManageKeys
 * No error checking
 */
public final class MainManageKeysMessage implements Serializable {
    private static final long serialVersionUID = 1L;
    public final int lengthPassword;
    public final long timeExpire;
    public final boolean isValidKey;
    public final int timeoutType;

    public MainManageKeysMessage(int lengthPassword, long timeExpire, boolean isValidKey, int timeoutType){
        this.lengthPassword= lengthPassword;
        this.timeExpire= timeExpire;
        this.isValidKey= isValidKey;
        this.timeoutType= timeoutType;
    }
}
然后,我们在父活动中创建该类的一个不可变有状态实例,即消息,并按如下所示的意图发送它:

  private void LaunchManageKeys() {
        Intent i= new Intent(this, ManageKeys.class); // no param constructor
        // push data (4)
        MainManageKeysMessage message= new MainManageKeysMessage(lengthPassword,timeExpire,isValidKey,timeoutType);
        Bundle b= new Bundle();
        b.putSerializable("jalcomputing.confusetext.MainManageKeysMessage", message);
        i.putExtras(b);
        startActivityForResult(i,REQUEST_MANAGE_KEYS); // used for callback
    }
最后,我们在子活动中检索对象

   try {
        inMessage= (MainManageKeysMessage) getIntent().getSerializableExtra("jalcomputing.confusetext.MainManageKeysMessage");
        lengthPassword= inMessage.lengthPassword;
        timeoutType= inMessage.timeoutType;
        isValidKey= inMessage.isValidKey;
        timeExpire= inMessage.timeExpire;
    } catch(Exception e){
        lengthPassword= -1;
        timeoutType= TIMEOUT_NEVER;
        isValidKey= true;
        timeExpire= LONG_YEAR_MILLIS;
    }

好问题。查看文档并进行扶手椅编码:

可以通过调用putExtrasBundle和myBundle.putSerializable在活动之间传递对象。对象和整个对象树需要实现可序列化

日航

编辑:答案是肯定的:

可以通过调用putExtrasBundle和myBundle.putSerializable在活动之间传递不可变对象。对象和整个对象树需要实现可序列化。这是面向对象编程的基本原则,即传递有状态消息

首先,我们通过声明一个新类来创建不可变对象:

package jalcomputing.confusetext;

import java.io.Serializable;

/*
 * Immutable messaging object to pass state from Activity Main to Activity ManageKeys
 * No error checking
 */
public final class MainManageKeysMessage implements Serializable {
    private static final long serialVersionUID = 1L;
    public final int lengthPassword;
    public final long timeExpire;
    public final boolean isValidKey;
    public final int timeoutType;

    public MainManageKeysMessage(int lengthPassword, long timeExpire, boolean isValidKey, int timeoutType){
        this.lengthPassword= lengthPassword;
        this.timeExpire= timeExpire;
        this.isValidKey= isValidKey;
        this.timeoutType= timeoutType;
    }
}
然后,我们在父活动中创建该类的一个不可变有状态实例,即消息,并按如下所示的意图发送它:

  private void LaunchManageKeys() {
        Intent i= new Intent(this, ManageKeys.class); // no param constructor
        // push data (4)
        MainManageKeysMessage message= new MainManageKeysMessage(lengthPassword,timeExpire,isValidKey,timeoutType);
        Bundle b= new Bundle();
        b.putSerializable("jalcomputing.confusetext.MainManageKeysMessage", message);
        i.putExtras(b);
        startActivityForResult(i,REQUEST_MANAGE_KEYS); // used for callback
    }
最后,我们在子活动中检索对象

   try {
        inMessage= (MainManageKeysMessage) getIntent().getSerializableExtra("jalcomputing.confusetext.MainManageKeysMessage");
        lengthPassword= inMessage.lengthPassword;
        timeoutType= inMessage.timeoutType;
        isValidKey= inMessage.isValidKey;
        timeExpire= inMessage.timeExpire;
    } catch(Exception e){
        lengthPassword= -1;
        timeoutType= TIMEOUT_NEVER;
        isValidKey= true;
        timeExpire= LONG_YEAR_MILLIS;
    }

还有另一种方法来传输对象。我们可以使用应用程序来传输对象,在我看来,这是一种更好的方法

首先,在主包中创建自定义应用程序

public class TestApplication extends Application {
    private Object transferObj;

    @Override
    public void onCreate() {
        super.onCreate();
        // ACRA.init(this);
    }

    public Object getTransferObj() {
        return transferObj;
    }

    public void setTransferObj(Object transferObj) {
        this.transferObj = transferObj;
    }

}
现在使用setTransfer和get transfer方法将对象从一个活动移动到另一个活动,如:

转让:

((TestApplication) activity.getApplication()).setTransferObj(Yous object);
ToRecieve:

Object obj=((TestApplication) activity.getApplication()).getTransferObj();
注 始终记住在清单应用程序标记中输入此应用程序:

<application
        android:name=".TestApplication">
</application>

还有另一种方法来传输对象。我们可以使用应用程序来传输对象,在我看来,这是一种更好的方法

首先,在主包中创建自定义应用程序

public class TestApplication extends Application {
    private Object transferObj;

    @Override
    public void onCreate() {
        super.onCreate();
        // ACRA.init(this);
    }

    public Object getTransferObj() {
        return transferObj;
    }

    public void setTransferObj(Object transferObj) {
        this.transferObj = transferObj;
    }

}
现在使用setTransfer和get transfer方法将对象从一个活动移动到另一个活动,如:

转让:

((TestApplication) activity.getApplication()).setTransferObj(Yous object);
ToRecieve:

Object obj=((TestApplication) activity.getApplication()).getTransferObj();
注 始终记住在清单应用程序标记中输入此应用程序:

<application
        android:name=".TestApplication">
</application>

您可以使用Gson或Jakson将对象转换为jsonstring,使用intent作为字符串传递,并在另一个活动中读取json。

您可以使用Gson或Jakson将对象转换为jsonstring,使用intent作为字符串传递,并在另一个活动中读取json

   try {
        inMessage= (MainManageKeysMessage) getIntent().getSerializableExtra("jalcomputing.confusetext.MainManageKeysMessage");
        lengthPassword= inMessage.lengthPassword;
        timeoutType= inMessage.timeoutType;
        isValidKey= inMessage.isValidKey;
        timeExpire= inMessage.timeExpire;
    } catch(Exception e){
        lengthPassword= -1;
        timeoutType= TIMEOUT_NEVER;
        isValidKey= true;
        timeExpire= LONG_YEAR_MILLIS;
    }