intent.getParcelableExtra()在API 23上工作但不在API 25

时间:2017-12-26 21:02:15

标签: android android-intent android-pendingintent parcelable

我遇到这个奇怪的问题,intent.getParcelableExtra() API 23 上工作正常但在 API 25 上没有,它返回 NULL < /强>

以下是我用较少的代码重现问题的方法:

用户类为例:

public class User implements Parcelable {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age =age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(name);
        out.writeInt(age);
    }

    public User(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
    }

    public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
 }

MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        /*setting view*/

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlarmReceiver.class);
        User user = new User("test", 25);
        intent.putExtra("user", user);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3000, pendingIntent);

    }
}

接收者:

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        android.os.Debug.waitForDebugger();
        User user = intent.getParcelableExtra("user");
    }
}

我正在使用调试器来停止执行并评估接收器中的用户对象。

使用模拟器Android 6.0 API级别23时:用户正确传递,但使用我的手机Android 7.1.2 API级别25时:用户 NULL

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

感谢CommonsWare,我能够理解这个问题。它似乎与Android有关,除了使用变通办法之外,我们无能为力。

对于仍想使用Parcelable的用户,请使用:How to marshall and unmarshall a Parcelable to a byte array with help of Parcel?

对我来说,我保存了想要传递给文件的对象(使用json),然后我将文件名作为字符串传递给AlarmManager,然后在接收器中读取文件。 / p>