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

Schreibe einen Kommentar