OnServiceConnected nunca llamado después del método bindService

Tengo una situación particular: un servicio iniciado por un receptor de difusión inicia una actividad. Quiero hacer posible que esta actividad se comunique al servicio. He elegido utilizar AIDL para hacerlo posible. Todo parece funcionar bien excepto el método bindService() llamado en onCreate() de la actividad. BindService (), de hecho, lanza una excepción de puntero nulo porque onServiceConnected() nunca se llama mientras el método onBind() del servicio es. De bindService() modos bindService() devuelve true. El servicio es obviamente activo porque inicia la actividad. Sé que llamar a una actividad de un servicio podría sonar extraño, pero desafortunadamente esta es la única manera de tener reconocimiento de voz en un servicio.

Gracias por adelantado

8 Solutions collect form web for “OnServiceConnected nunca llamado después del método bindService”

No puedo resolver el problema exacto de su descripción, así que voy a adivinar aquí!

¿Cómo puede bindService() lanzar una NullPointerException ? La única manera que esto podría (/ debería) suceder es cuando no proporciona un Service o un oyente ServiceConnection .

bindService() no puede lanzar una onServiceConnected() NullPointerException porque onServiceConnected() no se llama. La llamada a onServiceConnected() es un producto de bindService() .

Así que supongo que está llamando a un método de AIDL , antes de que el Service realmente se ha unido?

Acabo de experimentar otra versión de este problema, con el mismo síntoma de onServiceConnected(...) no siendo llamado. La causa era diferente en mi caso.

Usted debe asegurarse de tener una declaración de servicio en su AndroidManifest.xml dentro de la etiqueta de la aplicación – esta fue la raíz del problema para mí.

 <application android:name=".YourAppTitle" android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name"> </activity> <service android:name="YourService" /> </application> 

Hay una complicación adicional si utilizas una librería de Android separada dentro de Eclipse; agregar esta etiqueta de servicio sólo parece arreglar el problema si el servicio de referencia está en el mismo paquete que el manifiesto; Es decir, si su aplicación está en el paquete abc y aquí es donde reside AndroidManifest.xml, entonces 'YourService' también debe estar en el paquete abc (manualmente copiado de otra biblioteca, si es necesario) o bien la etiqueta <service..> puede / será onServiceConnected(...) y onServiceConnected(...) todavía no se llamará.

Este fue el caso de mi proyecto, aunque he utilizado una declaración de importación adecuada para el servicio en mi código. Eclipse no mostró ningún error, por lo que la importación identificaba correctamente la clase de otra biblioteca en el espacio de trabajo de Eclipse.

HTH

Después de horas y horas de intentar averiguar esto, el problema es que los ejemplos que muestran la creación del servicio, no incluyen el método onBind o tienen el siguiente código de ejemplo o lo genera para usted:

 public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } 

Esto hace que el método onServiceConnected falle o nunca se ejecute realmente. El arreglo es MUY simple, que es el siguiente:

 public IBinder onBind(Intent intent) { return mBinder; } 

Donde se puede crear un cuaderno simple como el siguiente para devolverlo:

 private final IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { public ConferenceService getService() { return ConferenceService.this; } } 

El evento onServiceConnected nunca fue llamado en mi aplicación.

El problema era que tenía el nombre de servicio definido en mi Manifiesto de aplicación como:

 <service android:name="MyService" android:enabled="true"></service> 

Una vez que lo cambié al nombre completo de la clase trabajó:

 <service android:name="com.example.MyService" android:enabled="true"></service> 

Actualización: También puede utilizar un nombre de clase relativo:

 <service android:name=".MyService" android:enabled="true"></service> 

Especifique el nombre de la clase utilizando su com.example.MyServiceClass completo en lugar de sólo MyServiceClass .

Una cosa más es que si está llamando a método bindservice dentro del método oncreate entonces el onserviceconnected se llama después de que el método oncreate esté terminado.

Por lo tanto, cualquier referencia a las funciones de interfaz antes de que el oncreate termine (o antes de que onserviceconnected se llame) muestra una excepción de puntero nulo.

Sin embargo, otra causa de la pregunta original podría ser que el servicio no está ya en ejecución y está pasando 0 como indicador a bindService. Al igual que:

 bindService(intent, serviceConnection, 0); 

Cuando lo que buscas sería:

 bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); 

Puede haber otra explicación, no una situación muy frecuente, pero logré entrar en ella y perder 2 horas para resolverla.

Así que lo que hice fue que quería reutilizar el paquete de la intención recibida por el método onBind. Pero fui por la versión perezosa y cambié la clase de la intención. Aparentemente esto hace que el onServiceConnected no se llame. Probablemente porque el sistema mantiene una referencia a la intención y la utiliza cuando llama a onServiceConnected.

En conclusión, no cambie la intención que recibe en onBind.

Estaba llamando bind con un Intent vacío – getContext().bindService(new Intent(), mConnection, Context.BIND_AUTO_CREATE) . Tengo que hacer la intención más específica para indicar a qué servicio quiero enlazar. Esto es, obviamente, un error de código, pero la salida de Logcat por desgracia no es lo suficientemente claro.

  • Error interno al utilizar Descubrimiento de servicio de red en Android
  • Cómo saber si el usuario está en la pantalla de bloqueo desde el servicio
  • Diseño de hilos múltiples de Android Service
  • Android - widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?
  • BadParcelableException: ClaseNotFoundException al unmarshalling
  • cómo abrir la configuración de accesibilidad de mi aplicación directamente?
  • Enviar correo electrónico en servicio (sin preguntar al usuario)
  • Subida de imágenes de Android: ¿Utilizar actividad o servicio?
  • Cómo utilizar NotificationCompat.Builder y startForeground?
  • ResultReceiver no sobrevive a la rotación de la pantalla
  • Depuración de fallos de servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.