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
Vous devez vous connecter pour publier un commentaire.
J'ai décidé de répondre à ma propre question car j'ai trouvé une solution exacte.
Ma Vie Avec Android
Tout a fonctionné seulement par le copier-coller de la source et en changeant les noms et les noms de fonction correctement (en supposant que vous êtes à la mise en œuvre de ce dans votre propre projet)
Source de dossier client va à l'activité du client et serviceimpl va de service. Je n'ai pas besoin du "activité de Service", donc je l'ai laissée ( et il ne semble pas vraiment être invoquée en tout cas).
Je n'ai pas assez de réputation pour poster des liens multiples, de sorte que vous pouvez obtenir le code source à partir du haut de la page.
OriginalL'auteur Marko Järvenpää
J'ai du mal avec ce trop. Vous avez raison dans votre estimation que le RemoteInterface.aidl doit avoir le même nom de paquet dans le service et l'application de test - alors, où voulez-vous le mettre!?
Si vous êtes en développement dans Eclipse puis le truc est d'avoir une source commune de dossier (commun aux deux projets) Font de ce dossier en dehors de ces deux projets et dans la construction de propriétés, cliquez sur lien "source" et naviguez jusqu'à l'emplacement de la source commune. (Vous pouvez appeler n'importe quel nom que vous voulez) le Faire dans les deux projets, et de mettre l'interface.aidl. Il apparaîtra dans les deux projets de l'Explorateur de packages et quand vous le changez dans un projet, les autres sera mis à jour aussi.
Dans la source commune de dossier j'ai mis de l'interface.aidl dans un paquet avec le même nom que le service.
Si vous êtes en utilisant Ant à construire, il devient un peu difficile car la valeur par défaut ant_rules.xml ne prend pas en charge deux aidl dossiers, et vous devrez modifier votre build.xml un peu ajouter une nouvelle cible et toutes ses dépendances.
J'ai obtenu mon projet en adaptant les échantillons de forme Chapitre 17, à partir de la source de téléchargement ici:
texte du lien
Hier, c'était un peu occupé et je ne pouvais pas travailler sur tout cela. De toute façon... j'ai maintenant créé un dossier dans mon espace de travail appelé AIDL, sous que j'ai créé des dossiers foo.service, et placé à l'interface.aidl fichier et le nom du package dans l'aidl fichier foo.service le problème est, je ne peux pas importer ce maintenant. J'ai aussi essayé d'avoir l' .aidl fichier dans le AIDL dossier racine. Je suis à l'aide d'eclipse.
J'ai joué un peu avec ce tout à fait un peu et ils ont finalement décidé d'essayer de construction le projet didacticiel de sources liées. Le tutoriel ne fonctionne pas tout de suite au moins (je n'ai pas vraiment essayer de savoir si c'est une sorte de tutoriel qui est résolu dans le livre qui lui sont liés). Il était en train de donner d'erreur Intention de ne pas trouvé .... fondamentalement réussi à le même état que mon projet actuel. J'ai googlé le sujet peu plus et a heurté une mine d'or. Simplifiée à l'extrême et petit tutoriel sur aidl la communication sur des applications distinctes. mylifewithandroid.blogspot.com/2008/01/invoking-services.html
OriginalL'auteur NickT