2011-10-24 26 views
13

Tengo un problema con el uso de un servicio en segundo plano.
Estoy usando el servicio de 2 actividades.onServiceConnected() no se llama

La primera actividad se inicia el Service con startService(intent) y se une a ella con bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

Esto funciona perfectamente y puede enviar un Message en onServiceConnected().

La segunda actividad sólo se une a la Service (puesto que ya ha empezado), utilizando de nuevo bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

Ahora aquí es mi problema:
En la segunda actividad Tengo un Button que debe utilizar el servicio cuando pulso eso.
Sin embargo, el onServiceConnected() nunca se llama en esta actividad, por lo que no puedo obtener la carpeta para crear un Messenger para enviar un Message al servidor.

¿Alguien sabe cuándo se llama exactamente onServiceConnected(), o lo que posiblemente está esperando?
¿O tal vez algo más para solucionar este problema?

EDITAR:bindService devuelve falso, ¿qué podría causar esto?

Gracias de antemano

+0

'bindService' debe devolver' false' si desea llamar a 'onRebind' después del primer enlace. – farukdgn

Respuesta

24

Después de un poco más de investigación, he descubierto que esto es un problema conocido en Android.

La segunda actividad de la que hablaba era una actividad que se usa como contenido dentro de un TabActivity.

La manera de solucionar este problema fue llamar bindService(...) en el contexto de aplicación, en lugar de en el contexto de actividad utilizando getApplicationContext().bindService(...)

+2

Hola, tengo el mismo problema. ¿Podría explicar el remedio un poco más? Si es posible, ¿podrías mirar mi código aquí y decirme qué se debe cambiar? Muchas gracias. Este error me está volviendo loco por un día. Mi código: http://ideone.com/cV5BJa –

+0

¿Podría explicarme por qué necesitamos usar getApplicationContext(). BindService not bindService? bindService funciona en mi actividad única pero no funciona en mi otra actividad (getApplicationContext(). BindService funciona). Es muy extraño. – Thinsky

+0

¡Muchas gracias! Esto es exactamente lo que estaba enfrentando y tiene mucho sentido usar el contexto de la aplicación en lugar del contexto de la actividad. ¡Solucionó mi problema! ¡¡Gracias hombre!! – Sjd

8

Añadir unen en el manifiesto ..

<service 
      android:name=".MyAccessibilityService" 
      android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > 
      <intent-filter> 
       <action android:name="android.accessibilityservice.AccessibilityService" /> 
      </intent-filter> 

</service> 

MyAccessibilityService el nombre del servicio.

16

es necesario agregar:

<service android:name="package.path.to.your.service.class" android:enabled="true"></service>

en el archivo de manifiesto de Android.

+2

para mí, no es necesario .class –

+1

es muy, muy importante, agregar paquete + nombre en manifiesto package.path.to.your.service.class –

1

Esto es lo que funcionó para mí

En lugar de

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

que utilizan

public IBinder onBind(Intent intent) { 
    return mMessenger.getBinder(); 
} 
+0

Incluso funciona con un nuevo Binder() si no necesita una implementación específica – DrinkBird

5

Me ocurrió hace un momento.
No te olvides de crear una instancia de la clase de cuaderno antes de la vuelta onbind. Error tonto, pero sucede. con suerte, esto ayudará a alguien en el futuro.

private YourBinder thisBinder; 

oncreate 
{ 
thisBinder = new YourBinder(); <--dont forget this. 
} 


public class YourBinder extends Binder 
{ 

} 

public IBinder onBind(Intent intent) 
{ 
return thisBinder; 
} 
0

Estaba xmarian y tuve el mismo problema y más tarde descubrí que no le había dado un nombre propio a ese servicio. Por lo tanto, el nombre del servicio debe recibir el atributo de nombre. Lo que supongo que el compilador de xmarian hace lo mismo que esa entrada en Android XML.