【发布时间】:2017-04-20 07:16:40
【问题描述】:
我有一个名为 Consts 的自定义对象。它包括一些关于用户和外部库对象的信息。我在用户身份验证后在LoginActivity 中创建Consts 对象,我想将此对象传递给我的MainActivity。
如何在意图之间传递包含外部对象的自定义对象?
Consts 对象的一部分:
public class Consts implements Parcelable {
//Created by me. I can pass this object to MainActivity.
UserInformationClass UserInfo = new UserInformationClass();
//This is external object.
SweetAlertDialog AlertDialog;
String AppVersion = "v2.0";
String OSVersion = "";
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(this.UserInfo, flags);
dest.writeString(this.AppVersion);
dest.writeString(this.OSVersion);
}
public Consts(SweetAlertDialog alert) {
this.AlertDialog = alert;
}
protected Consts(Parcel in) {
this.UserInfo = in.readParcelable(UserInformationClass.class.getClassLoader());
this.AppVersion = in.readString();
this.OSVersion = in.readString();
}
public static final Parcelable.Creator<Consts> CREATOR = new Parcelable.Creator<Consts>() {
@Override
public Consts createFromParcel(Parcel source) {
return new Consts(source);
}
@Override
public Consts[] newArray(int size) {
return new Consts[size];
}
};
}
登录活动:
public class LoginActivity {
Consts consts = new Consts(new SweetAlertDialog());
.
.
private void LoginCompleted(JSONObject json) {
consts.getUserInfo().setName("Cristiano");
consts.getUserInfo().setSurname("Ronaldo");
consts.getUserInfo().setTokenID("7");
consts.getUserInfo().setTokenTimeOut("100");
Intent i = new Intent(getApplicationContext(), MainActivity.class);
i.putExtra("ConstsObject", consts);
startActivity(i);
finish();
}
}
主活动:
public class MainActivity {
Consts consts;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bundle data = getIntent().getExtras();
consts = (Consts) data.getParcelable("ConstsObject");
//I can get consts object but consts.AlertDialog is null :(
}
【问题讨论】:
-
@DivyeshPatel,您的
Item对象仅包含String值。我想传递 External 对象。 -
您不能将不可包裹的对象放入包裹中。唯一可打包的对象是:Binder 对象(包括 IInterface 子类)、文件描述符(在包裹在 ParcelFileDescriptor 中之后)、字节数组以及由可打包对象组成或可以序列化为字节序列的任何内容。你想要传递的关于 AlertDialog 的内容是什么?里面的文字?布局?主题?还有什么?
-
这在 Java 中称为“静态字段”。这真的不是 Android 特有的东西。您不能在 Intents 中传递此类对象,但您可以传递“订单”(枚举或整数额外、Intent 操作字符串或 Uri),建议接收 Activity、使用哪个静态对象以及如何处理它。请注意,静态对象可能会造成内存泄漏——它们不会被垃圾回收,直到您将
null分配给它们。因此,请确保在不再需要它们时将它们丢弃。理想情况下,您根本不想在活动之间共享此类对象。现在可能是重新考虑您的应用设计的好时机。 -
在大多数情况下,您应该将重物保持为单例。它与 ContentProviders 相同——您不必关闭它们,因为当系统终止您的进程时,它们会与您一起死亡。视图对象很棘手:它们不能在活动之间轻松传递;从理论上讲,您可以将它们分离,传递,然后重新连接,但这通常不值得费心(您必须保留两个代码路径才能创建和重用它们,所以不妨每次都创建它们)。最好的策略是将所有可重用状态分开并保存在 Parcelable/singlton/database 中。
标签: android android-intent parcelable parcel