Las siguientes llamadas onBind () no se activan
usando pan de jengibre 2.3.4 api lvl 10.
Estoy comenzando un servicio después de la bota terminada. Para ello he añadido un receptor de difusión que inicia el servicio. Estoy utilizando el mismo servicio en el lanzador. Estoy tratando de enlazar al servicio añadiendo params adicionales a Intent. Obtención de resultados de servicio por respuesta de difusión.
- ¿Cómo implementar funcionalidades como Facebook "New Story" característica?
- Obtención de I / art: Explicit concurrent mark sweep GC liberado
- ¿Cómo se puede ejecutar servicio indefinidamente y también permitir la vinculación en android?
- Cómo detener un servicio de Android desde un hilo
- Cómo funciona el servicio Foreground (proceso diferente / mismo proceso) cuando Android tiene poca memoria
El problema es cuando se enlaza primero, se desencadena onBind () en el servicio. Otros enlaces no llaman a onBind () en el servicio. Creo que el problema es el servicio que comienza directamente after_boot. Cuando no comienzo el servicio en cargador y deje la actividad comenzarlo con Context.BIND_AUTO_CREATE que se comporta como esperado.
La única solución que se me ocurrió es cambiar onUnbind () del servicio y emitir onBind () en onRebind () llamada del servicio. No me gusta esta solución, ya que podría romper en versiones posteriores android conduciendo el método onBind () que se llama dos veces.
Entonces, ¿por qué no se activan los enlaces subsiguientes en los servicios que se inician después de completar el arranque. Cualquier otra solución elegante es bienvenida.
PD: Ya lo implementé en aidl, pero no me gusta, ya que el servicio va a hacer algunas cosas asíncronas para devolver los datos y tengo que añadir archivos aidl en ambas aplicaciones, agregará manejadores que conduce al código hinchado.
Gracias por adelantado. Snippet de mi código:
Manifiesto del servicio:
<intent-filter> <action android:name="com.organization.android.ACTION_BOOT_COMPLETED" /> </intent-filter> <intent-filter> <action android:name="com.organization.android.WORK_INTENT" /> </intent-filter> </service> <receiver android:name=".CoreServiceReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" > </action> <category android:name="android.intent.category.HOME" > </category> </intent-filter> </receiver>
Cuando me enlace al servicio:
Intención intention = new Intent (WORK_INT); intent.putExtra ("param", param);
context.registerReceiver (broadcastReceiver, new IntentFilter("com.organization.android.WORK_RESULT")); context.bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
}
Cuando obtengo el resultado:
context.unbindService(mConnection); context.unregisterReceiver (broadcastReceiver);
- Antecedentes El servicio se mata en android
- BroadcastReceiver cuando se cambia el estado de la red wifi o 3g
- Aclaración de setUpdateCurrent en OneOffTask
- Android Service ha filtrado a pesar de que es (supuestamente) no se ejecuta
- Cómo ejecutar CountDownTimer en un servicio en Android?
- ¿Cómo ejecutar un servicio singleton (compartido) en una biblioteca para múltiples aplicaciones?
- Android Fatal señal 11 (SIGSEGV) en 0x636f7d89 (código = 1). ¿Cómo se puede localizar?
- ¿Cómo puedo saber si mi servicio ha iniciado
De la documentación sobre la vinculación a los servicios:
Varios clientes pueden conectarse al servicio a la vez. Sin embargo, el sistema llama al método onBind () de su servicio para recuperar el IBinder sólo cuando se une el primer cliente. A continuación, el sistema entrega el mismo IBinder a todos los clientes adicionales que se enlazan, sin llamar de nuevo a Bind ().
Este comportamiento no cambiará, por lo que su método de reemplazar onUnbind para devolver true, y luego llamar onBind durante onRebind está perfectamente bien, aunque el enlace original seguirá siendo enviado al cliente, no cualquier nuevo que pueda generar en su nueva llamada a onBind. (es decir, realmente no debería estar llamando a onBind, pero sólo manejar onRebind como un caso separado)