Главная » Разработка для Android » Передача объектов произвольного класса в виде реализаций интерфейса Parcelable

0

Чтобы передавать нестандартные объекты между процессами, они долж- ны реализовывать интерфейс Parcelable. Это позволит разбивать их на про- стые типы, хранимые  в объекте  Parcel,  который,  в свою очередь, может передаваться от процесса к процессу.

Реализуйте метод writeToParcel, чтобы разбить  объект класса на со- ставные части, затем публичное статическое поле Creator (представляющее собой класс Parcelable.Creator), которое создаст новый объект, основанный на переданном экземпляре Parcel.

В листинге 15.6 показан пример использования интерфейса Parcelable в сочетании  с классом  Quake,  который  вы ранее создали  в своем проекте Earthquake.

Листинг 15.6. Реализация интерфейса Parcelable  для класса Quake

package com.paad.earthquake;

import java.util.Date;

import android.location.Location;

import android.os.Parcel;

import android.os.Parcelable;

public class Quake implements Parcelable {

private Date date; private String details; private Location location; private double magnitude; private String link;

public Date getDate() { return date; }

public String getDetails() { return details; } public Location getLocation() { return location; } public double getMagnitude() { return magnitude; } public String getLink() { return link; }

public Quake(Date _d, String _det, Location _loc, double _mag, String _link) {

date = _d; details = _det; location = _loc; magnitude = _mag; link = _link;

}

@Override

public String toString(){

SimpleDateFormat sdf = new SimpleDateFormat("HH.mm"); String dateString = sdf.format(date);

return dateString + ":" + magnitude + " " + details;

}

private Quake(Parcel in) { date.setTime(in.readLong()); details = in.readString(); magnitude = in.readDouble();

Location location = new Location("generated"); location.setLatitude(in.readDouble()); location.setLongitude(in.readDouble());

link= in.readString();

}

public void writeToParcel(Parcel out, int flags) { out.writeLong(date.getTime()); out.writeString(details); out.writeDouble(magnitude); out.writeDouble(location.getLatitude()); out.writeDouble(location.getLongitude()); out.writeString(link);

}

public static final Parcelable.Creator<Quake> CREATOR =

new Parcelable.Creator<Quake>() {

public Quake createFromParcel(Parcel in) {

return new Quake(in);

}

public Quake[] newArray(int size) {

return new Quake[size];

}

};

public int describeContents() {

return 0;

}

}

Теперь, когда у вас есть реализация Parcelable, необходимо создать объ- явление AIDL, чтобы сделать класс доступным при реализации интерфейса AIDL для своего Сервиса.

В листинге  15.7 показано  содержимое  файла  Quake.aidl, который нужно создать для класса Quake, реализованного выше.

Листинг 15.7. Объявление интерфейса AIDL для класса Quake

package com.paad.earthquake;

parcelable Quake;

Помните, что при передаче нестандартного объекта между процессами клиентский процесс должен иметь доступ к определению класса этого объ- екта.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии