studio programacion herramientas fundamentos con avanzado aplicaciones android service instance

programacion - manual de android en pdf



Servicio Android varias instancias (3)

Todavía soy un poco nuevo en la clase de servicio de Android. Sé que necesita iniciar el servicio desde su aplicación con startService (intención), sin embargo, mi problema es que mi servicio tiene métodos dentro de él. Necesito comenzar el servicio con un intento y luego crear un objeto de esa clase en mi Actividad para poder llamar a los métodos del servicio. El problema es que cuando hago esto, creo una instancia del servicio cuando la inicio con un intento y otra instancia del servicio cuando creo un objeto de la clase en mi actividad. Esto significa que los datos pasados ​​al servicio desde startService (intención) no están allí cuando creo el objeto del servicio. ¿Alguna forma de evitar esto o simplemente estoy haciendo un uso incorrecto de la clase de servicio? Puedo dar un código, pero es básicamente esto:

//Create Object of ControlPanel service class. ControlPanel cPanel = new ControlPanel(); //Create intent for starting ControlPanel service class Intent controlPanel = new Intent(this, cPanel.getClass()); //Start Service startService(controlPanel);


¿Alguna forma de evitar esto o simplemente estoy haciendo un uso incorrecto de la clase de servicio?

Estás haciendo un uso incorrecto de la clase de Service .

Un Service se usa a través de dos patrones básicos:

  1. Enviar comandos a él, a través de startService() .

  2. Vinculado a él, para llamar a una API expuesta por ese Service , a través de bindService() .

La vinculación representa con mayor precisión lo que está intentando hacer ("para que pueda llamar a los métodos del servicio"), sin embargo, es difícil acertar, especialmente cuando se trata de cambios de configuración.

Por lo tanto, recomendaría primero que se recueste y determine por completo y de manera precisa por qué está utilizando un Service en primer lugar. ControlPanel , por ejemplo, es un nombre que asociaría con una UI, no con operaciones UI ("de fondo"). Entonces, y solo entonces, puede determinar si el comando o el patrón de enlace es apropiado para su caso de uso.


Diría que estás haciendo un uso indebido de la clase :-).

Llamar a startService () varias veces no da como resultado el inicio de un servicio múltiple.

Del doc :

Solicitar que se inicie un servicio de aplicación determinado. El Intento puede contener el nombre de clase completo de una implementación de servicio específica para comenzar, o una definición abstracta a través de la acción y otros campos del tipo de servicio para comenzar. Si este servicio no se está ejecutando, se creará una instancia y se iniciará (creando un proceso si es necesario); si se está ejecutando, entonces sigue ejecutándose.

También debe reemplazar onStartCommand () . La primera llamada startService inicia el servicio si aún no se ha iniciado. En cualquier caso, onStartCommand interceptará cualquier otra llamada startService y la intención que desee enviarle.


Puedes hacer esto con una clase de servicio.

public static int myStaticMethod(){ return 1; }

Simplemente haga los métodos que necesita para acceder a la estática.