Java Reference
In-Depth Information
...
public void writeToParcel(Parcel out, int flags)
{
out.writeInt(factor);
out.writeInt(addend);
out.writeInt(result);
}
public void readFromParcel(Parcel in)
{
factor = in.readInt();
addend = in.readInt();
result = in.readInt();
}
}
Listing 16.12 lässt erahnen, was man tun muss. Die Attribute werden in einer bestimmten
Reihenfolge geschrieben. Genau in dieser Reihenfolge kommen sie an und müssen den
Attributen zugewiesen werden.
Bevor man die Klasse als Parameter in einer AIDL-Datei verwenden kann, muss für Data
eine eigene AIDL-Datei angelegt werden (s. Listing 16.13).
Listing 16.13 AIDL-Datei für die Klasse Data
package javacomp.android.boundservice;
parcelable Data;
Damit können wir die AIDL-Schnittstelle Counter (s. Listing 16.8) um folgende Methode
erweitern:
void change(inout Data data);
Hier sieht man jetzt eine Abweichung bei der AIDL-Syntax gegenüber Java: Man muss spe-
zifi zieren, ob es sich bei dem Parameter um einen Eingabeparameter handelt (in), also eine
Datenübergabe vom Aufrufer zur aufgerufenen Methode, oder um einen Ausgabeparameter
(out), also von der aufgerufenen Methode zurück zum Aufrufer, oder um beides (inout). Weil
wir die Attribute factor und addend an die Methode übergeben und result von der Methode
zurückbekommen wollen, brauchen wir inout. Die Implementierung dieser Methode ist
sehr naheliegend; die Klasse CounterImpl aus Listing 16.9 wird dazu wie folgt ergänzt:
public synchronized void change(Data data) throws RemoteException
{
counter = counter * data.getFactor() + data.getAddend();
data.setResult(counter);
}
Die neue Methode change kann beispielsweise wie folgt benutzt werden (Counter sei eine
Referenz auf den Zähler aus onServiceConnected):
Data data = new Data(10, 1);
counter.change(data);
int result = data.getResult();
 
Search WWH ::




Custom Search