studio - service intent android
onServiceConnected nunca llamado después del método bindService (8)
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 usar 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 nunca se llama a onBind()
mientras que el método onBind()
del servicio. De bindService()
modos, bindService()
devuelve true. El servicio está obviamente activo porque comienza la actividad. Sé que llamar a una actividad desde un servicio puede sonar extraño, pero desafortunadamente esta es la única forma de tener reconocimiento de voz en un servicio.
Gracias por adelantado
Acabo de experimentar otra versión de este problema, con el mismo síntoma de onServiceConnected(...)
no se llama. La causa fue diferente en mi caso.
Debes asegurarte de tener una declaración de servicio en tu 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>
Existe una complicación adicional si usa una biblioteca de Android separada dentro de Eclipse: agregar esta etiqueta de Servicio parece solucionar el problema si el servicio al que se hace 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 (copiado manualmente desde otra biblioteca, si es necesario) o la etiqueta <service..>
puede / estará ignorado y onServiceConnected(...)
aún no se llamará.
Este fue el caso de mi proyecto, aunque utilicé 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 estaba identificando correctamente la clase de otra biblioteca en el espacio de trabajo de Eclipse.
HTH
Después de horas y horas de intentar resolver 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. La solución es MUY simple, que es la siguiente:
public IBinder onBind(Intent intent) {
return mBinder;
}
Donde podría crear una carpeta simple como la siguiente para regresar:
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 del 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 funcionó:
<service android:name="com.example.MyService" android:enabled="true"></service>
Actualización: También puedes usar 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 solo MyServiceClass .
Estaba llamando a bind con un Intent vacío - getContext().bindService(new Intent(), mConnection, Context.BIND_AUTO_CREATE)
. Tengo que hacer que la intención sea más específica para indicar a qué servicio quiero enlazar. Esto obviamente es un error de código, pero desafortunadamente la salida de Logcat no fue lo suficientemente clara.
No puedo resolver el problema exacto de tu descripción, ¡así que voy a adivinar aquí!
¿Cómo puede bindService()
lanzar una NullPointerException
? La única forma en que esto podría (/ debería) suceder es cuando no proporciona un Service
o un oyente de ServiceConnection
.
bindService()
no puede lanzar una NullPointerException
porque onServiceConnected()
no se llama. La llamada a onServiceConnected()
es un producto de bindService()
.
Entonces, ¿supongo que está llamando a un método AIDL
, antes de que el Service
se haya vinculado?
Otra causa a la pregunta original podría ser que el servicio no se está ejecutando y que 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 y perder 2 horas para resolverla.
Entonces, 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 no se llame al onServiceConnected. Probablemente porque el sistema mantiene una referencia a la intención y la usa cuando llama a ServiceConnected.
En conclusión, no cambie la intención que recibe en onBind.
Una cosa más es que si llama bindservice
método bindservice
dentro del método onserviceconnected
se llama al oncreate
después de que oncreate
método oncreate
.
Por lo tanto, cualquier referencia a las funciones de la interfaz antes de que finalice oncreate
(o antes de onserviceconnected
) muestra una excepción de puntero nulo.