Pregunta

Hasta ahora tengo una clase para un simple servicio local. Lo que quiero hacer es enviar solicitudes para este servicio local de diferentes Actividades al en mi solicitud. En función de los parámetros de estas solicitudes de servicio se conectará a través de HttpClient a un servidor web y recibir un JSONObject y devolverlo a la actividad. Toda la comunicación HTTP ya está trabajando dentro de mi actividad, pero me gustaría que a ejecutar en un hilo separado en mi servicio local ahora.

El código fuente de mi muy simple servicio local tiene este aspecto hasta el momento:

// 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;
    }

}

El problema que estoy enfrentando ahora (debido a la falta de conocimiento) es la parte de comunicación Actividades <-> Servicio Local . He encontrado algunos ejemplos de comunicación e intercambio de objetos para un servicio remoto usando AIDL (Android Interfaz Definiton Language). Sin embargo, no estoy seguro de si he de ir por este camino. Simplemente me gustaría intercambiar cualquiera de mis propios objetos definidos o si eso no es posible, entonces sólo un JSONObject o si hace las cosas mucho más fácil incluso las matrices de cadenas simples trabajaría (por ahora).

Por favor alguien puede apuntar en la dirección correcta y si es posible dar un ejemplo sencillo de un intercambio de objetos (en ambos sentidos) con un servicio local.

Gracias de antemano.

¿Fue útil?

Solución

Me gustaría sugerir el uso de un AsyncTask en lugar de su propio hilo en este escenario.

Para dar una actividad de una referencia a su objeto BackgroundService, sus opciones son:

  1. Utilice un producto único (es decir, que su objeto BackgroundService disponible en un contexto estático, como un miembro de datos estáticos públicos, anulando que la referencia estática en onDestroy()).

  2. Siga el ejemplo de la API LocalServiceBinding devolver un IBinder que simplemente da acceso al objeto BackgroundService.

A partir de ahí, todo está en la misma JVM, lo que sólo puede pasar objetos alrededor. Tenga cuidado, sin embargo, no aferrarse a nada más allá de la vida útil de componentes (por ejemplo, Activity no debe almacenar en caché el singleton).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top