Java Reference
In-Depth Information
Wenn man die Methode change ausprobiert, kann man feststellen, dass alles funktioniert
wie erwartet. Wenn man in der AIDL-Datei statt inout aber nur in angibt, wird zwar der
Zähler geändert, aber der neue Wert steht nach dem Aufruf nicht im übergebenen Daten-
objekt. Gibt man nur out an, so kommen die übergebenen Attributwerte factor und addend
beim Aufrufer nicht an. Oder besser gesagt: Sie kommen mit dem Wert 0 an, so dass der
Zähler damit immer auf 0 gesetzt wird. Das Gesagte gilt allerdings nur dann, wenn der
Service in einem eigenen Prozess läu . Befi nden sich dagegen der Aufrufer und der Dienst
im selben Prozess, so funktioniert immer alles richtig, gleichgültig ob man in, out oder
inout angibt. Dies liegt daran, dass in einem solchen Fall ein ganz normaler Methodenauf-
ruf stattfi ndet. Der Data-Parameter wird wie bei Java üblich als Referenz übergeben, die
Serialisierung wird nicht benutzt und in, out bzw. inout wird nicht berücksichtigt. Im Falle
unterschiedlicher Prozesse wird das Data-Objekt vor dem Aufruf zum Dienstprozess kopiert,
falls in oder inout spezifi ziert wurde, und nach dem Aufruf wieder zum Aufrufer zurück-
kopiert, falls out oder inout in der AIDl-Datei angegeben wurde. Dieses Hin- und Herkopie-
ren beim Methodenaufruf nennt man Call-By-Value-Result.
1 6 .9 .6 Parameterübergabe durch Call-By-Reference
Eine Parameterübergabe durch Call-By-Value bzw. Call-By-Value-Result für Objektparame-
ter ist in Java unüblich. Bei RMI kann die allgemein übliche Referenzübergabe (Call-By-
Reference) nachgeahmt werden, indem ein in einer Methode übergebenes Objekt ebenfalls
ein RMI-Objekt ist. Der Aufrufer erzeugt also zuerst ein Objekt, das von der Ferne aus auf-
gerufen werden kann. Dieses Objekt wird übergeben, so dass der Aufgerufene auf das
Objekt, das der Aufrufer übergeben hat, aus der Ferne sofort (noch während des Methoden-
aufrufs) oder später (wenn er die Referenz auf das RMI-Objekt speichert) zurückrufen kann.
Man bezeichnet dies als Callback. In Android gibt es diese Möglichkeit in ganz analoger
Weise.
Zu diesem Zweck muss für den Callback-Parameter ebenfalls eine AIDL-Schnittstelle defi -
niert werden. Als Aufgabe wollen wir die Schnittstelle Counter um eine Methode multiIn-
crement erweitern, die den Zähler n Mal erhöht (n kann als Argument angegeben werden).
Aus Demonstrationsgründen soll die Erhöhung in Einser-Schritten und relativ langsam
(also mit Wartezeiten zwischen je zwei Erhöhungen) erfolgen. Jedes Mal, wenn der Zähler
erhöht wurde, soll der Aufrufer durch einen Rückruf benachrichtigt werden, dass der Zähler
erhöht wurde. Die Rückrufschnittstelle besitzt deshalb eine einzige Methode zum Melden
eines neuen Zählerwerts (s. Listing 16.14).
Listing 16.14 AIDL-Rückrufschnittstelle
package javacomp.android.boundservice;
interface Callback
{
void newCounterValue(int newValue);
}
 
Search WWH ::




Custom Search