Android: come comunicare e oggetti di scambio con un servizio locale?
-
20-09-2019 - |
Domanda
Finora ho una classe per un semplice servizio locale. Quello che voglio fare è quello di richieste inviare per questo servizio locale da diverse activies nella mia applicazione. A seconda dei parametri di queste richieste del servizio si collegherà via HttpClient a un server web e ricevere una JSONObject e restituirlo all'attività. Tutta la comunicazione HTTP è già al lavoro all'interno della mia attività, ma mi piacerebbe che per l'esecuzione in un thread separato nel mio servizio locale ora.
Il codice sorgente del mio molto semplice servizio locale assomiglia a questo finora:
// 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;
}
}
Il problema che sto affrontando ora (a causa di una mancanza di conoscenza) è la parte di comunicazione Attività <-> servizio locale . Ho trovato alcuni esempi di comunicazione e scambio di oggetti per un Remote Service con AIDL (Interfaccia Android Definiton Language). Tuttavia, non sono sicuro se devo andare su questa strada. Vorrei semplicemente piace scambiare entrambi i miei oggetti definiti o, se ciò non è possibile, solo un JSONObject o se rende le cose molto più facile anche solo semplici matrici di stringhe avrebbe funzionato (per ora).
Qualcuno può per favore mi punto nella giusta direzione e, se possibile, dare un semplice esempio di uno scambio di oggetti (in entrambe le direzioni), con un servizio locale.
Grazie in anticipo.
Soluzione
Io suggerirei di utilizzare un AsyncTask
anziché il vostro proprio thread in questo scenario.
Per dare un'attività un riferimento all'oggetto BackgroundService
, le opzioni sono:
-
Usa un Singleton (vale a dire, rendere il vostro oggetto
BackgroundService
disponibile da un contesto statico, come ad esempio un membro di dati static pubblico, che annulla i riferimento statico inonDestroy()
). -
Segui il campione
LocalServiceBinding
API per restituire unIBinder
che dà semplicemente l'accesso all'oggettoBackgroundService
.
Da lì, tutto è nella stessa JVM, quindi si può solo passare oggetti intorno. Attenzione, però, a non trattenere nulla oltre la durata dei componenti (ad esempio, Activity
non dovrebbe memorizzare nella cache il Singleton).