将对象数据从一个活动转移到另一个活动

时间:2011-03-17 17:56:12

标签: 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;
        }

        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.

我想将数据(ArrayList employeeInfo)从Activity1传输到Activity2。

使用Parcelable是将数据从Activity1传输到Activity2的唯一方法吗? 如果没有,有什么替代方案。

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

5 个答案:

答案 0 :(得分:4)

以下是我对Parceleble的实现:

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];
}

};

}

以及我如何传输数据:

Intent parcelIntent = new Intent().setClass(ActivityA.this, ActivityB.class);
ProfileData data = new ProfileData(profile.gender, profile.getFullName(), profile.birthDate);
parcelIntent.putExtra("profile_details", data);
startActivity(parcelIntent);

并获取数据:

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

答案 1 :(得分:0)

您可以让EmployeeInfo班级实施Serializable。或者你可以发送这样的数据

intent.putExtra("id", employInfo.getEmployeeID());
intent.putExtra("name", employInfo.getEmployeeName());
intent.putExtra("age", employInfo.getAge());

如果您需要传输自定义类的列表,我会使用第一种方法。因此,您可以将整个列表设为Serializable 然而,他们说每个人都应该使用Parcelable,因为它“更快”。 Tbh,我从来没有用它,因为它需要更多的努力,我怀疑有人可以通过意图发送大量的数据来实现常规应用程序的速度差异

答案 2 :(得分:0)

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

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

JAL

编辑:答案是肯定的:

可以通过调用putExtras(Bundle)和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;
    }
}

然后我们在父活动中创建一个类的一个不可变的有状态实例,一个消息,并在一个intent中发送它,如下所示:

  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;
    }

答案 3 :(得分:0)

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

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

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并获取传输方法,将abjects从一个活动转移到其他活动,如:

转移:

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

ToRecieve:

Object obj=((TestApplication) activity.getApplication()).getTransferObj();

注意 始终记得在清单应用程序标记中输入此应用程序:

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

答案 4 :(得分:0)

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