java - programacion - ¿Cómo es posible que el servicio se ejecute indefinidamente y también permita el enlace en Android?
manual de programacion android pdf (5)
No he usado servicios con el servicio de mensajería, pero me he vinculado a un servicio remoto con una interfaz remota (AIDL). Mis hallazgos pueden ser de alguna ayuda. Como mi actividad y servicio principal están actualmente implementados, me enlace al servicio como lo hace con el código como
mServiceConnected = bindService(new Intent("com.mypackage.MyService.SERVICE"), this,
Context.BIND_AUTO_CREATE);
Mi actividad implementa ServiceConnection
Cuando llamo unbindService (this) cuando la actividad finaliza, entonces como ha encontrado, se llama al método onDestroy () del servicio.
Sin embargo, antes de la línea bindService, también comienzo explícitamente el servicio con
startService(new Intent("com.mypackage.MyService.SERVICE"));
entonces el desvinculación no hace que el servicio onDestroy () se ejecute. Aún es necesario llamar a desvincularServicio en la actividad onDestroy / Stop, de lo contrario, se perderá una conexión de servicio.
En mi caso, presumiblemente, el servicio permanece disponible para que otras aplicaciones se vinculen a través de su interfaz remota.
Quiero un servicio que se ejecute en segundo plano hasta que lo detenga, incluso si el componente que lo inició se destruye y también permite el enlace a las actividades. Como es posible ?
Según el documento de servicios enlazados de Android, existen tres formas de crear un servicio vinculado
- Extendiendo la clase Binder.
- Usando Messenger.
- Usando AIDL.
Creé un servicio enlazado usando messenger (2do método). La actividad se vincula al servicio en su método onStart () y se desvincula en su método onStop (). La mensajería bidireccional (entre actividad y servicio) funciona correctamente. Pero el problema es que cuando la actividad desvincula el servicio, el servicio se destruye. Pero quiero un servicio que pueda ejecutarse indefinidamente.
Es posible como la Guía de desarrollo de servicios android: "Aunque esta documentación generalmente trata estos dos tipos de servicios por separado, su servicio puede funcionar en ambos sentidos: puede iniciarse (ejecutarse indefinidamente) y también permitir el enlace. Es simplemente una cuestión de si usted implementar un par de métodos de devolución de llamada: onStartCommand () para permitir que los componentes lo inicien y onBind () para permitir el enlace. "
También implemento el método onStartCommand () en el servicio y devuelvo START_STICKY, pero nunca se llama. En cuanto a las devoluciones de llamada de ciclo de vida del servicio delimitado en la guía de desarrollo, no existe el método de devolución de llamada onStartCommand (). Entonces, ¿cómo es posible ejecutar el servicio hasta que nos detengamos y también permitamos el enlace?
Estoy usando la plataforma eclipse en fedora 15 OS.
Alguna ayuda.....
Para realizar la comunicación entre el servicio y la actividad . También puede usar Binder como se menciona en el ejemplo oficial de Android
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
Como documentos oficiales de Android sugiere http://developer.android.com/guide/components/services.html#StartingAService
Aunque esta documentación generalmente trata estos dos tipos de servicios por separado, su servicio puede funcionar en ambos sentidos: puede iniciarse (para ejecutarse indefinidamente) y también permitir el enlace. Es simplemente una cuestión de si implementa un par de métodos de devolución de llamada: onStartCommand () para permitir que los componentes lo inicien y onBind () para permitir el enlace.
Este proyecto implementa esta combinación de servicio ( BothService ) y muestra cómo un servicio puede ejecutarse de manera indefinida y también permitir el enlace con múltiples actividades .
Si agrega la "Ongoing Notification"
en "Ongoing Notification"
en el Cajón de aplicaciones de Android, su aplicación y servicio no serán eliminados.
Consulte http://developer.android.com/guide/topics/ui/notifiers/notifications.html
Service.onStartCommand
llamará a la devolución de llamada Service.onStartCommand
solo cuando inicie su servicio utilizando el método startService
. Como @NickT y @JoelF ya indicaron que necesita llamar a startService()
además de la llamada bindService()
en algún lugar de su código de cliente (por ejemplo, en onCreate).
También es posible que desee echar un vistazo a este artículo (un poco viejo, pero útil): " Vida doble de un servicio " y pruebe el autor del programa de ejemplo proporcionado.
Solo necesita iniciarlo con startService()
alguna parte. Esto evitará que se detenga automáticamente cuando no haya más enlaces.
De la documentación del servicio , énfasis mío:
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.
Como otros han señalado, todavía podría ser asesinado por Android si se necesitan recursos. Puede "priorizar" su Servicio y reducir las posibilidades de ser asesinado si lo convierte en un servicio en primer plano .