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.

È stato utile?

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:

  1. 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 in onDestroy()).

  2. Segui il campione LocalServiceBinding API per restituire un IBinder che dà semplicemente l'accesso all'oggetto BackgroundService.

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top