Исходная реализация в основном состоит из двух этапов процесса.
1 Написание объекта java на парцеллу, которая включает в себя два метода:.
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(cityName);
dest.writeString(macroName);
dest.writeString(id);
}
Опишите содержание для установки флага для вашего содержимого. Большую часть времени вам просто нужно не трогать.
public void writeToParcel (Parcel dest, int flags), вам необходимо написать объект класса Java для посылки шаг за шагом в соответствии с полями в классе JAVA. В приведенном выше примере мой класс имеет три строки. Вы можете писать почти все типы объектов в посылке. Вам просто нужно выбрать подходящий. Как WriteString(), writeList() или writeObject() и т.д.
2. Вторая часть читает ваш объект Java обратно из участка
Эта часть требуется две вещи.Сначала СОЗДАТЕЛЬ вашего класса java, как показано ниже:
public static final Creator<City> CREATOR = new Creator<City>() {
@Override
public City createFromParcel(Parcel in) {
return new City(in);
}
@Override
public City[] newArray(int size) {
return new City[size];
}
};
В приведенном выше примере мой класс Java - это город. Он считывает объект City из посылки. Но он называет новый City (in) конструктор Город класс. Так что теперь мне нужен конструктор, который принимает объект посылки в аргументах. Давайте также создадим это.
protected City(Parcel in) {
cityName = in.readString();
macroName = in.readString();
id = in.readString();
}
Теперь мы сделаем класс полным полным доказательством. Одно замечание, мы должны прочитать членов в той же последовательности в защищенных City (Parcel in), мы помещаем их в паркет, то есть в метод writeToParcel().
О том, как воспроизвести badParcelable exeption, просто позволяя android создать java-объект из сообразительного. Для этого вы можете выбрать «Уничтожить действия» из параметров разработчика на устройстве Android и поместить приложение в фоновом режиме в эту активность, чтобы андроид убил идентификатор вашего приложения. Возобновите свое приложение путем повторной работы (onCreate + Bundle), вы получите это исключение, если вы не выполнили его правильно.
Я добавил фрагмент в вопросе, показывающий, как я использую аргумент. Не могли бы вы взглянуть, возможно, так я использую это неправильно? –
@AdrianHristov: В конце концов, этот 'Bundle' может быть помещен в' Parcel' и отправлен через границы процесса. В этом случае я точно не уверен. Мы знаем, что это происходит, как если бы Android прекратил ваш процесс, когда вы находитесь в фоновом режиме, но пользователь сразу возвращается к вашему приложению (например, 30 секунд), наше состояние восстанавливается, и единственный способ, который возможен, - это если наше состояние находится в основном ОС-процессе (а не в процессе, который только что закончился). – CommonsWare