2012-04-03 11 views
7

que tienen un servicio con un constructor siguiente:¿Cómo crear una instancia del servicio de Android con un constructor?

public ShimmerService(Context context, Handler handler) { 
    mHandler = handler; 
} 

Quiero crear una instancia de esta clase de servicio. He siguiente código, pero no estoy seguro de por dónde pasa el parámetro de:

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder binder) { 
     mShimmerService = ((ShimmerService.ShimmerConfigureBinder) binder) 
       .getService(); 
     Toast.makeText(ConfigureShimmer.this, 
       "Shimmer service has succesfully started.", 
       Toast.LENGTH_SHORT).show(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mShimmerService = null; 
    } 
}; 

tengo todo lo demás incluyendo la configuración de unión, en el arranque y así sucesivamente. Pero obtengo un error en el código anterior:

04-03 19:06:10.285: E/AndroidRuntime(16837): java.lang.RuntimeException: Unable to instantiate service com.milanix.androidecg.services.ShimmerService: java.lang.InstantiationException: can't instantiate class com.milanix.androidecg.services.ShimmerService; no empty constructor 

¿Cómo puedo solucionar este problema? ¿Dónde tendré que pasar el parámetro? Siguiendo código funciona, sino, más bien usa la clase de servicio como clase, en lugar de servicio:

mShimmerService = new ShimmerService(this, mHandler); 

Respuesta

11

No debe construir servicios (o actividades, o los receptores de radiodifusión) de forma explícita. El sistema Android lo hace internamente. La forma correcta de construir un servicio es a través del startService() con un intento; siéntete libre de agregar parámetros adicionales a esa intención.

+0

pero, ¿cómo pasaré el uso y la intención del controlador? algún ejemplo? – Milan

+1

¿Para qué necesitas ese controlador? ¿Estás seguro de que construir el controlador desde cero en el servicio no será de ayuda? Los servicios no son hilos; el servicio se ejecuta en el mismo hilo de UI que el código de consumidor. –

+0

No sé si hay una diferencia entre 'bindService' y' startService' en este aspecto, pero de acuerdo con la documentación y [esta discusión] (https://groups.google.com/d/topic/android-developers/onqqpHz2WQw/discussion) los extras _might_ no estarán allí cuando el Intent se reciba en 'onBind'. – DuneCat

1

El servicio extiende el contexto, por lo que realmente no lo necesita como parámetro en su constructor, ya que puede usar esa misma instancia.

Si tiene otros parámetros que le gustaría pasar al servicio, recomendaría agregarlos a la intención startService como extras y obtenerlos en el método service.onStartCommand.

+0

de nuevo, ¿cómo es posible pasar el controlador con intención? – Milan

0

No pasa el controlador al servicio, Handler no implementa Parcelable, o Serializable, por lo que no creo que sea posible.

Cree el controlador en el servicio y pase todos los datos que necesite para crear el controlador a través de los servicios adicionales.

0

Debe tener un constructor sin argumentos para su clase de servicio, de lo contrario, el sistema no sabe cómo crear una instancia.

0

En lugar de pasar Handler (o cualquier objeto) al servicio (lo que no es posible por cierto), crea y registra BroadcastReceiver en su clase Activity. Cuando necesite invocar las funciones del Manejador (o cualquier función en otro objeto), envíe la transmisión al receptor registrado (sendBroadcast). También puede poner parámetros adicionales adicionales para la intención y puede manejar todo el código necesario directamente desde la Actividad según los parámetros.

Tal vez, en este caso, su controlador se eliminará por completo (Depende de lo que realmente necesita). Con los receptores de difusión, no sé imaginar la situación en la que necesitaría pasar algún objeto al Servicio. Por otro lado, haces algo que no es bueno y deberías revisar el diseño de la aplicación.

Si queremos que algo pase al Servicio, solo podemos iniciar el Servicio con parámetros adicionales en Intención. El servicio gestiona el estado de acuerdo con estos parámetros en el interior.

La idea es que el Servicio se ejecute independientemente de otras partes de las aplicaciones, por ejemplo, Actividades. Podemos controlarlo con parámetros adicionales cuando iniciamos el Servicio o enviamos transmisiones para invocar el código externo.

Cuestiones relacionadas