Télécommande Android rappels de service
(J'ai un distance service avec un AIDL interface qui est utilisée par plusieurs applications client. Je voudrais ajouter une méthode asynchrone de l'interface pour les appels qui prennent un certain temps, mais j'ai besoin de la solution à sécurisé, ce qui signifie que seuls mes applications peuvent communiquer avec le service. Les applications clientes sont signés avec la même signature que l'application de service. Actuellement, les apps se lier à la fonction et l'appel d'une interface unique méthode pour effectuer diverses opérations.
Une option est de radiodiffusion à l'Intention du service lorsque l'opération est terminée, et à l'aide d'un BroadcastReceiver dans l'application cliente, mais (Question #1) cela peut-il être fait d'une manière qui garantit que seules mes applications peuvent recevoir le but? setPackage() semble le faire, mais j'ai besoin de soutien en pain d'épice périphériques, ce qui semble exclure que l'approche en fonction de la réponse ici: setPackage de l'intention dans le pain d'épices
Il semble donc que j'ai besoin d'en ajouter une seconde .aidl interface avec l'interface de rappel pour le service à utiliser, mis en œuvre par le client. J'ai vu des exemples qui utilisent des auditeurs ici, mais je ne suis pas sûr quelle est la différence, et le client de passage dans la deuxième interface de l'objet comme un argument (comme utilisé dans les IScript /IScriptResult exemple de cette réponse: Service de rappel à l'activité dans android)
Question #2, quel est l'avantage de l'utilisation d'un écouteur d'ici vs une méthode de rappel?
OriginalL'auteur Android QS | 2013-01-29
Vous devez vous connecter pour publier un commentaire.
Un rappel de la méthode/de l'auditeur est la bonne chose à faire. (Comme CommonsWare dit, c'est à peu près la même chose). Je dirais que c'est beaucoup plus simple que de bidouiller avec BroadcastReceivers, puisque vous êtes déjà à l'aide de aidl.
Quelque chose comme ceci:
IAsyncThing.aidl:
IAsyncThingListener.aidl:
Vous pouvez vous assurer que seules vos applications peuvent se lier pour le service en utilisant une signature-autorisation de niveau sur votre service (voir la note sur les "autorisations de service" ici: http://developer.android.com/guide/topics/security/permissions.html). Plus précisément:
AndroidManifest.xml
. S'assurer qu'il estsignature
niveau.service
taguses-permission
de l'utiliser.Quelques autres choses à garder à l'esprit:
IAsyncThingListener.Stub
. Votre appel, le code de l'application peut-être déjà sous-classement d'autre chose, ce qui signifie que vous auriez à utiliser une autre (probablement intérieure) de classe pour recevoir la notification d'achèvement. J'en parle uniquement parce que cela pourrait être la réponse à la question #2 - dont je ne comprends pas tout.IBinder.linkToDeath
.C'est ce que l'
IBinder.linkToDeath
peu. Vous obtiendrez dit que si la demande est tué. Dans tous les autres cas (par exemple, elle est en arrière-plan) toutes les IPC communication devrait toujours fonctionner correctement.Si l'application de l'activité se lie à mon service et fait une demande asynchrone, mais n'est plus actif (non pas sur l'écran) lorsque la fonction de rappel est appelée, la fonction de rappel est encore reçue? Ne serait pas privé de rappel objet stub être détruites lorsque l'activité est détruite?
Votre activité n'est normalement détruite, simplement parce qu'il n'est plus sur l'écran. Votre activité est détruite que plus tard lorsque le système est à court de mémoire.
Grande réponse mec
OriginalL'auteur Adrian Taylor