AIDL-Schnittstelle zwischen zwei Applikationen
Habe ich stecken eine gesamte Wand mit der AIDL-Schnittstelle. Ich habe eine app, die kontrolliert werden muss über 3rd-party-Anwendung (ich habe genug Kontrolle über diese, so kann ich Sie bitten, das umzusetzen, was ich jemals brauchen in Ihrer Tätigkeit)
Ursprünglich meine app war auch eine Aktivität mit interface und alles, aber ich habe es geändert, ein hintergrund-Dienst und testen, habe ich eine dummy-app, die steuert, starten Sie die service-app in den hintergrund.
Nun würde ich gerne einen Weg, um request-Methode fordert von der service (vor allem; start -, stop -, sendData). Ich habe die .aidl-Dateien für beide apps. Der aidl-Datei implementiert nur eine einzige Methode (dies ist mit freundlicher Genehmigung von einige anderen Frage hier.)
package foo.testapp;
interface IScript
{
String executeScript(String script);
}
während die anderen aidl ist das gleiche, außer das Paket "foo".otherapp". Die Implementierungen, die ich im Netz gefunden habe hatte gleiche Paket für beide aidl-Dateien, aber für mich dies verursacht einen Fehler (denke mal das ist nur ein problem meinerseits, da ich es hasse namespaces und packages gibt, so dass ich oft einfach einen Namen für Sie schlecht, wenn es wichtig ist, Sie zu ändern, ich kann es tun)
War der plan bei dieser Methode sendet einen string an den service und nur über einen Schalter verfügen über vordefinierte Zeichenfolgen zum aufrufen einer entsprechenden Methode ( könnte auch einfach umzusetzen, drei verschiedene Methoden, wenn es verbessert die Auslastung).
Trotzdem... komme ich nicht an die aidl zu verbinden, bekomme ich die Fehlermeldung "Unable to start service Vorsatz
{act=foo.testapp.IScript } : nicht gefunden
Ich würde diese Vermutung hat etwas zu tun mit meiner Missverständnisse ie. packagenames oder so)
dies ist die Umsetzung in meinem test Aktivität app
private final IScript.Stub mBinder = new IScript.Stub()
{
@Override
public String executeScript(String script) throws RemoteException
{
//TODO Auto-generated method stub
}
};
IScript mService = null;
private ServiceConnection mConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service)
{
mService = IScript.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName className)
{
mService = null;
}
};
Dann in OnCreate () - Methode werde ich dies tun:
bindService(new Intent(IScript.class.getName()),
mConnection, Context.BIND_AUTO_CREATE);
In der service-Klasse habe ich diese;
@Override
public IBinder onBind(Intent intent)
{
//Select the interface to return. If your service only implements
//a single interface, you can just return it here without checking
//the Intent.
if (IScript.class.getName().equals(intent.getAction()))
{
return mBinder;
}
return null;
}
/**
* The IRemoteInterface is defined through IDL
*/
private final IScript.Stub mBinder = new IScript.Stub()
{
@Override
public String executeScript(String script) throws RemoteException
{
if (script == "test")
{
return "foo";
}
return "fail";
}
};
Und schließlich die manifest-Dateien;
naja, eigentlich, ich habe keine Ahnung, ob ich dazu etwas in den manifest-Dateien, beim Umgang mit der aidl. In dem einen Beispiel, das ich sah;
<intent-filter>
<action android:name="foo.otherapp.IScript" />
</intent-filter>
und
<intent-filter>
<action android:name="foo.testapp.IScript" />
</intent-filter>
Ich würde vermuten, dass der Fehler könnte überall sein. Ich habe versucht, das set up mit Kaugummi und Pflaster. Denke, ich habe nur missverstanden einige grundlegende Konzept dieses.
Trotzdem, jede Hilfe ist willkommen.
Vielen Dank im Voraus!
InformationsquelleAutor Marko Järvenpää | 2011-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beschloss ich beantworte meine eigene Frage, da ich eine exakte Lösung.
Mein Leben Mit Android
Alles funktioniert nur durch kopieren und einfügen die Quelle und ändern Sie die package-Namen und Funktionsnamen korrekt (vorausgesetzt, Sie implementieren diese in Ihr eigenes Projekt)
Quelle von client-Ordner geht, um die client-Aktivität und serviceimpl geht um service. Ich brauchte nicht die 'Dienstleistung', so ließ ich es aus ( und es scheint nicht wirklich geltend gemacht werden, sowieso).
Habe ich nicht genug Ruf zu post mehrere links, so dass Sie bekommen können, die Quelle, aus der Spitze der Seite.
InformationsquelleAutor Marko Järvenpää
Ich kämpfte mit diesem auch. Sie sind richtig in Ihrer Vermutung, dass das RemoteInterface.aidl haben muss, um den selben package-Namen in den Dienst und die test-app - also wo steckst du!?
Wenn Sie die Entwicklung in Eclipse dann der trick ist, auf einen gemeinsamen source-Ordner (für beide Projekte) diesen Ordner außerhalb von Projekten und in den build-Eigenschaften/Quelle, klicken Sie auf "link source" und navigieren Sie zum Speicherort der gemeinsamen Quelle. (Sie können es nennen, einen beliebigen Namen, die Sie wollen), Tun Sie dies in beide Projekte und stellen die Schnittstelle.aidl. Es erscheint in beiden Projekten' Package Explorer, und wenn Sie es ändern Sie in einem Projekt, das andere gibts auch.
In der gemeinsamen source-Ordner lege ich die Schnittstelle.aidl im Paket mit dem gleichen Namen wie das service.
Wenn Sie Ameise zu bauen, die wird es ein bisschen schwierig, als die Standard ant_rules.xml keine Unterstützung für zwei aidl-Ordner, und Sie müssen ändern Sie Ihre build.xml einiges hinzufügen ein neues Ziel und alle seine Abhängigkeiten.
Ich habe mein Projekt gehen, durch eine Anpassung der Muster-Formular Kapitel 17 aus dem "download-Quelle" hier:
link-text
Gestern war ein wenig beschäftigt, und ich konnte nicht arbeiten zu diesem Thema. Anyways... ich habe jetzt einen Ordner erstellt in meinem Arbeitsbereich genannt AIDL, unter, die ich erstellt habe Ordner foo.service, und platziert die Schnittstelle.aidl-Datei und die package Namen in der aidl-Datei foo.service das problem ist, ich kann nicht importieren Sie diese jetzt. Ich habe auch versucht, mit der .aidl-Datei in der AIDL-Ordner root. Ich bin mit eclipse.
Ich spielte mit diesem durchaus ein wenig und schließlich beschlossen, zu versuchen, bauen Sie das Projekt tutorial aus den Quellen verlinkt. Das tutorial hat nicht funktioniert, sofort mindestens (ich habe nicht wirklich herausfinden, ob es eine Art tutorial, das gelöst in dem Buch verwiesen wird). Es gab Fehler Absicht nicht gefunden .... im Grunde kam es zu den selben Zustand, wie mein Aktuelles Projekt. Ich googeln das Thema etwas mehr und trifft eine Goldmine. Extrem vereinfacht und ein kleines tutorial auf aidl-Kommunikation über separate Anwendungen. mylifewithandroid.blogspot.com/2008/01/invoking-services.html
InformationsquelleAutor NickT