能不能把Activity放在包裹里?
Is it possible to put Activity in the parcel?
下面是我的 Parcelable class 的例子。如您所见,我想将 activity 放在 Parcel
中,但我该怎么做呢?我查看了 Activity
的源代码,它不是 Parcelable
也不是 Serializable
。
public class MyParcelable implements Parcelable {
private Activity mActivity;
private int mData;
private String mName;
@Override
public void writeToParcel(Parcel out, int flags) {
//out.writeX(mActivity);
out.writeInt(mData);
out.writeString(mName);
}
private MyParcelable(Parcel in) {
//mActivity = in.readX();
mData = in.readInt();
mName = in.readString();
}
public MyParcelable(Activity activity, int data, String name) {
mActivity = activity;
mData = data;
mName = name;
}
@Override
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
@Override
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
@Override
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
}
您可以放入 包裹中的任何东西并取出 包裹中的任何东西。但是 "anything" 之后是否有效将取决于多种因素。
所有 Activity 实例都与 Android 的 Activity 管理器密切合作。大多数定义 Activity 的方法:startActivity()
、finish()
、restart()
、setContentView()
、getPackage()
委托给 Activity 的方法Manager、ViewManager、PackageManager 等系统服务。 Activity 被系统销毁后,这些方法将不起作用。如果在没有 Android 的 "special sauce" 的情况下实例化 Activity class,这些方法也将不起作用。虽然在技术上可以使用反射或 JNI 实例化 Activity class,但这些简单的实例将不起作用。
这就是人们说 Activity 是 "managed by Android" 的意思:它基本上是由 OS 进程驱动的,如果不与这些进程通信就无法存在。幸运的是,Android 有一种启动此类通信的方法:Intent
。替换此行:
private Activity mActivity;
和
private Intent mActivity;
并使用打包的 Intent 在另一端收到后启动 Activity。当然,如果您需要的不仅仅是 Intent 来使您的 Activity 处于可用状态,则您必须将这些东西与 Intent 一起存储在您的 Parcelable 中。
将activity放入包裹不是个好主意。如果您需要这样做,可能是您的代码有问题,您需要检查代码以避免这种实现。
下面是我的 Parcelable class 的例子。如您所见,我想将 activity 放在 Parcel
中,但我该怎么做呢?我查看了 Activity
的源代码,它不是 Parcelable
也不是 Serializable
。
public class MyParcelable implements Parcelable {
private Activity mActivity;
private int mData;
private String mName;
@Override
public void writeToParcel(Parcel out, int flags) {
//out.writeX(mActivity);
out.writeInt(mData);
out.writeString(mName);
}
private MyParcelable(Parcel in) {
//mActivity = in.readX();
mData = in.readInt();
mName = in.readString();
}
public MyParcelable(Activity activity, int data, String name) {
mActivity = activity;
mData = data;
mName = name;
}
@Override
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
@Override
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
@Override
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
}
您可以放入 包裹中的任何东西并取出 包裹中的任何东西。但是 "anything" 之后是否有效将取决于多种因素。
所有 Activity 实例都与 Android 的 Activity 管理器密切合作。大多数定义 Activity 的方法:startActivity()
、finish()
、restart()
、setContentView()
、getPackage()
委托给 Activity 的方法Manager、ViewManager、PackageManager 等系统服务。 Activity 被系统销毁后,这些方法将不起作用。如果在没有 Android 的 "special sauce" 的情况下实例化 Activity class,这些方法也将不起作用。虽然在技术上可以使用反射或 JNI 实例化 Activity class,但这些简单的实例将不起作用。
这就是人们说 Activity 是 "managed by Android" 的意思:它基本上是由 OS 进程驱动的,如果不与这些进程通信就无法存在。幸运的是,Android 有一种启动此类通信的方法:Intent
。替换此行:
private Activity mActivity;
和
private Intent mActivity;
并使用打包的 Intent 在另一端收到后启动 Activity。当然,如果您需要的不仅仅是 Intent 来使您的 Activity 处于可用状态,则您必须将这些东西与 Intent 一起存储在您的 Parcelable 中。
将activity放入包裹不是个好主意。如果您需要这样做,可能是您的代码有问题,您需要检查代码以避免这种实现。