programacion - Enlace el servicio a la actividad en Android
manual de programacion android pdf (6)
Intento escribir un reproductor multimedia simple que reproduzca audio en tiempo real usando RTSP. Tengo una actividad GUI y un servicio que realiza la reproducción. Mi pregunta es cómo comunicar mejor entre la actividad y el servicio (por ejemplo, actualizar la interfaz gráfica basada en el estado del jugador).
Sé que puedo vincular el servicio a la actividad usando onBind (), pero si lo entiendo correctamente, esto detendrá el servicio si se mata la actividad. Quiero continuar la reproducción incluso si el usuario sale de la actividad. ¿Hay alguna forma estándar o preferida para tratar este problema?
Esta es una respuesta parcial, pero escribí una biblioteca que puede simplificar el uso de los servicios de Android, si se ejecutan localmente en el mismo proceso que la aplicación: https://github.com/germnix/acacia
Básicamente, usted define una interfaz anotada con @Service y su clase implementadora, y la biblioteca crea y vincula el servicio, maneja la conexión y el hilo de trabajo en segundo plano:
@Service(ServiceImpl.class)
public interface MyService {
void doProcessing(Foo aComplexParam);
}
public class ServiceImpl implements MyService {
// your implementation
}
MyService service = Acacia.createService(context, MyService.class);
service.doProcessing(foo);
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
...
<service android:name="com.gmr.acacia.AcaciaService"/>
...
</application>
Puede obtener una instancia del android.app.Service asociado para ocultar / mostrar las notificaciones persistentes, usar su propio android.app.Service y manejarlo manualmente si lo desea.
Existe un método llamado unbindService que tomará una ServiceConnection que habrá creado al llamar a bindService. Esto le permitirá desconectarse del servicio mientras lo deja funcionando.
Esto puede suponer un problema cuando te conectas nuevamente, ya que probablemente no sabes si se está ejecutando o no cuando comienzas la actividad nuevamente, así que tendrás que considerarlo en tu código de actividad.
¡Buena suerte!
Primero que nada, 2 cosas que necesitamos entender
Cliente
hace solicitud al servidor específico
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);`
aquí mServiceConn
es una instancia de la clase ServiceConnection
(incorporada), en realidad es una interfaz que debemos implementar con dos (primero para la red conectada y segundo para la red no conectada) para monitorear el estado de la conexión de red.
Servidor
- Maneja la solicitud del cliente y crea una réplica de la suya que es privada para el cliente que envía la solicitud y esta réplica del servidor se ejecuta en un hilo diferente.
Ahora en el lado del cliente, ¿cómo acceder a todos los métodos del servidor?
server send response con IBind Object.so IBind object es nuestro handler que accede a todo el método de servicio mediante el operador (.).
MyService myService; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { Log.d("ServiceConnection","connected"); myService = binder; } //binder comes from server to communicate with method''s of public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } }
ahora cómo llamar al método que se encuentra en el servicio
myservice.serviceMethod();
aquí myService
es object y serviceMethode
es el método en servicio. Y de esta manera la comunicación se establece entre el cliente y el servidor.
Si el usuario retrocede, se onDestroy()
método onDestroy()
. Este método es para detener cualquier servicio que se use en la aplicación. Entonces, si desea continuar el servicio incluso si el usuario se onDestroy()
de la aplicación, simplemente borre onDestroy()
. Espero que esto ayude.
traté de llamar
startService(oIntent);
bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE);
en consecuencia, podría crear un servicio fijo y vincularlo. Tutorial detallado para el ejemplo de servicio enlazado .
"Si inicia un servicio de android con startService(..)
ese servicio seguirá en ejecución hasta que invoque de forma explícita stopService(..)
. Hay dos razones por las que el sistema puede ejecutar un servicio. Si alguien llama a Context.startService()
entonces el sistema recuperará el servicio (creándolo y llamando a su método onCreate()
si es necesario) y luego llamará a su onStartCommand(Intent, int, int)
con los argumentos suministrados por el cliente. El servicio continuará en este punto hasta el momento Context.stopService()
o stopSelf()
. Tenga en cuenta que las llamadas múltiples a Context.startService()
no anidan (aunque dan como resultado múltiples llamadas correspondientes a onStartCommand()
), por lo que no importa cuántas veces se inicie un el servicio se detendrá una vez que se Context.stopService()
o stopSelf()
, sin embargo, los servicios pueden usar su stopSelf(int)
para garantizar que el servicio no se detiene hasta que se hayan procesado los intentos iniciados.
Los clientes también pueden usar Context.bindService()
para obtener una conexión persistente a un servicio. Esto también crea el servicio si aún no se está ejecutando (llamando a onCreate()
mientras lo hace), pero no llama a onStartCommand()
. El cliente recibirá el objeto IBinder
que devuelve el servicio de su onBind(Intent)
, lo que le permite al cliente devolver las llamadas al servicio. El servicio seguirá funcionando mientras se establezca la conexión (ya sea que el cliente retenga o no una referencia en el IBinder
del Servicio). Por lo general, el IBinder
devuelto es para una interfaz compleja que se ha escrito en AIDL.
Un servicio puede iniciarse y tener conexiones vinculadas a él. En tal caso, el sistema mantendrá el servicio en ejecución mientras se inicie o haya una o más conexiones con el indicador Context.BIND_AUTO_CREATE
. Una vez que ninguna de estas situaciones se onDestroy()
, se llama al método onDestroy()
del Servicio y el servicio finaliza efectivamente. Toda la limpieza (detención de subprocesos, onDestroy()
del registro de receptores) debe estar completa al regresar de onDestroy()
. "