why does startActivity with a parcelable subclass of Intent cause an NPE?

Viewed 95

I'm writing my first Android app. I extended Intent to enforce some things, e.g. setting a class; which worked fine. Now I want to parcel this subclass and implemented the methods according to the documentation.

My problem is that the mere existence of these methods causes Activity#startActivity to produce a NullPointerException.

CODE

public class ExplicitIntent<T> extends Intent {
    private final Class<T> cls;

    public ExplicitIntent( Context packageContext, Class<T> cls ) {
        super( packageContext, cls );

        this.cls = cls;
    }

    private ExplicitIntent( Parcel in ) {
        super();
        super.readFromParcel( in );
        cls = (Class<T>) in.readSerializable();
    }

    @Override
    public void writeToParcel( Parcel out, int flags ) {
        super.writeToParcel( out, flags );
        out.writeSerializable( cls );
    }

    public static final Parcelable.Creator<ExplicitIntent<?>> CREATOR = new Parcelable.Creator<ExplicitIntent<?>>() {
        public ExplicitIntent<?> createFromParcel( Parcel in ) {
            return new ExplicitIntent<>( in );
        }

        public ExplicitIntent<?>[] newArray( int size ) {
            return new ExplicitIntent<?>[size];
        }
    };
}

The following exception appears when I create a new ExplicitIntent without parceling anything

Logcat

2020-05-13 20:57:40.217 22534-22534/xxx.list E/AndroidRuntime: FATAL EXCEPTION: main
    Process: xxx.list, PID: 22534
    java.lang.NullPointerException: FileDescriptor must not be null
        at android.os.Parcel.readException(Parcel.java:2010)
        at android.os.Parcel.readException(Parcel.java:1950)
        at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:4352)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1611)
        at android.app.Activity.startActivityForResult(Activity.java:4487)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
        at android.app.Activity.startActivityForResult(Activity.java:4445)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
        at android.app.Activity.startActivity(Activity.java:4806)
        at android.app.Activity.startActivity(Activity.java:4774)
        at xxx.list.MainActivity.openActivity(MainActivity.java:160)
0 Answers
Related