能不能把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放入包裹不是个好主意。如果您需要这样做,可能是您的代码有问题,您需要检查代码以避免这种实现。