AIDL interface entre les deux applications

J'ai coincé un total de mur avec l'AIDL interfaçage. J'ai une appli qui doit être contrôlé via l'application 3ème partie (j'ai suffisamment de contrôle sur ce que je peux leur demander de mettre en œuvre ce que jamais j'ai besoin dans leur activité)

À l'origine de mon application a également une activité avec l'interface et tout, mais je l'ai changé pour un service d'arrière-plan et pour tester, j'ai créé une fausse application qui gère pour démarrer l'application de service à l'arrière-plan.

Maintenant, je voudrais un moyen de demande de la méthode des appels de service (principalement; démarrer, arrêter, sendData). J'ai créé le .aidl fichiers pour les deux applications. L'aidl fichier implémente une seule méthode (c'est la courtoisie de certains autres question ici.)

package foo.testapp;
interface IScript 
{
     String executeScript(String script); 
}

tandis que l'autre aidl est le même sauf que le colis est "foo.otherapp". Les implémentations j'ai trouvé en ligne a même forfait pour les deux aidl fichiers, mais pour moi, cela provoque une erreur (suppose que c'est juste un problème de ma part parce que je déteste les espaces de noms et les paquets j'ai souvent juste le nom de mal, s'il est important de les changer, je peux le faire)

Le plan était d'utiliser cette méthode pour envoyer une chaîne de service et ont juste un switch plus de chaînes prédéfinies pour appeler une méthode correcte ( peut également mettre en œuvre trois méthodes différentes si elle améliore l'utilisation).

De toute façon... je ne peux pas obtenir l'aidl pour vous connecter, j'obtiens l'erreur "Impossible de démarrer le service intention

{act=foo.testapp.IScript } : pas trouvé

J'aimerais que cette supposition a quelque chose à faire avec mon malentendus ie. packagenames)

c'est la mise en œuvre dans mon test activité application

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;
     }
 };

Puis dans OnCreate() la méthode je vais le faire:

bindService(new Intent(IScript.class.getName()),
            mConnection, Context.BIND_AUTO_CREATE);

Dans la classe de service, j'ai ce;

@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";
    }
};

Et enfin les fichiers manifest;

eh bien en fait, je n'ai aucune idée si je dois ajouter quelque chose dans les fichiers manifeste lorsque l'on traite avec l'aidl. Dans l'exemple que j'ai vu ce;

    <intent-filter>
        <action android:name="foo.otherapp.IScript" />
    </intent-filter>

et

    <intent-filter>
        <action android:name="foo.testapp.IScript" />
    </intent-filter>

Je suppose que les erreurs peuvent être n'importe où. J'ai essayé de le configurer avec de la gomme à mâcher et de la bande-sida. Suppose que j'ai juste mal compris certains concept de base de cette.

De toute façon, toute aide est la bienvenue.

Merci d'avance!

OriginalL'auteur Marko Järvenpää | 2011-01-11