是否可以将活动放入包裹?

时间:2017-08-02 08:20:19

标签: android parcelable

以下是我的Parcelable类的示例。如您所见,我想将活动放在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];
        }
    };
}

2 个答案:

答案 0 :(得分:0)

您可以任何内容放入Parcel中,然后任何内容从Parcel中取出。但是,之后的“任何事情”是否会起作用取决于各种因素。

所有活动实例都与Android的ActivityManager密切合作。定义Activity的大多数方法:startActivity()finish()restart()setContentView()getPackage()委托ActivityManager,ViewManager,PackageManager和其他系统的方法服务。在系统销毁Activity之后,这些方法将无法工作。如果你实例化没有Android的“特殊酱”的Activity类,那些方法也行不通。虽然在技术上可以使用反射或JNI实例化Activity类,但这些实例不起作用。

这就是人们的意思,当他们说Activity是“由Android管理”时:它基本上是由操作系统进程驱动的,如果没有与这些进程的通信就不能存在。幸运的是,Android有办法启动此类通信:Intent。替换此行:

private Activity mActivity;

private Intent mActivity;

在另一方收到活动后,使用parcelized Intent启动活动。当然,如果你需要更多的东西而不仅仅是Intent来使你的Activity成为可用的形状,你必须将这些东西与Intent一起存储在你的Parcelable中。

答案 1 :(得分:0)

将活动放入包裹并不是一个好主意。如果您需要这样做,可能您的代码很糟糕,您需要查看代码以避免此实现。