Android: Comment communiquer et objets d'échange avec un service local?
-
20-09-2019 - |
Question
Jusqu'à présent, j'ai une classe pour un simple service local. Ce que je veux faire est de envoyer des demandes à ce service local de différentes activies dans ma demande. En fonction des paramètres de ces demandes le service se connecte via HttpClient à un serveur Web et recevoir un JSONObject et le retourner à l'activité. Toute la communication HTTP travaille déjà dans mon activité, mais je voudrais à exécuter dans un thread séparé dans mon service local maintenant.
Le code source de mon service local très simple ressemble à ceci jusqu'à présent:
// BackgroundService.java
package com.test.localservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class BackgroundService extends Service
{
@Override
public void onCreate() {
super.onCreate();
Log.i("BackgroundService", "onCreate()");
Thread thr = new Thread(null, new RunThread(), "BackgroundService");
thr.start();
}
class RunThread implements Runnable
{
public void run() {
Log.i("BackgroundService", "run()");
/* Here the HTTP JSON communication is going to happen */
//BackgroundService.this.stopSelf();
}
}
@Override
public void onDestroy()
{
Log.i("BackgroundService", "onDestroy()");
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
Log.i("BackgroundService", "onStart()");
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
Log.i("BackgroundService", "onBind()");
return null;
}
}
Le problème que je suis face maintenant (en raison d'un manque de connaissance) est la partie de la communication Activités <-> Service local . J'ai trouvé quelques exemples de communication et d'échange pour un objet Service à distance avec
La solution Je suggère d'utiliser un Pour donner une activité une référence à votre objet Utilisez un singleton (à savoir, faire de votre objet Suivez l'exemple de l'API A partir de là, tout est dans la même machine virtuelle, de sorte que vous pouvez simplement passer des objets autour. Attention, cependant, de ne pas tenir sur quoi que ce soit passé la durée de vie des composants (par exemple, AsyncTask
au lieu de votre propre fil dans ce scénario. BackgroundService
, vos options sont:
BackgroundService
disponible à partir d'un contexte statique, comme un membre de données statiques du public, que référence annulant statique onDestroy()
). LocalServiceBinding
pour retourner un IBinder
qui donne simplement l'accès à l'objet BackgroundService
. Activity
ne doit pas mettre en cache le singleton).