2012-06-11 8 views
7

* EDITAR resolver por hacer esto: * lo he resuelto cambiando mi onDestroy() de mi actividad y el ServiceConnection::onServiceDisconnected().No es posible destruir la actividad (servicio no se ha registrado)

He agregado un booleano para verificar si estoy limitado al Servicio llamado boundToService. El ServiceConnection:

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     myService = ((EventService.MyBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName name) { 
     // TODO Auto-generated method stub 
     Log.i(getPackageName(), "ServiceConnection::onServiceDisconnected() called"); 
     boundToService = false; 
    } 
}; 

Y el onDestroy():

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    Log.e(getPackageName(), "Destroying Activity"); 
    if (boundToService && mConnection != null) { 
     doUnbindService(); 
    } 
} 

Así es como la unión y separación se realiza en la actividad:

public void doBindService() { 
    bindService(new Intent(this, EventService.class), mConnection, 
      Context.BIND_AUTO_CREATE); 
    boundToService = true; 
} 

public void doUnbindService() { 
    unbindService(mConnection); 
    boundToService = false; 
} 

Como se ha dicho Guillaume, llamando super.onDestroy() primero es una necesidad

* FIN DE RESOLVER *

Tengo un Foreground Service que los datos de las encuestas de GPS, y las solicitudes MapActivity que los datos de cada 3 segundos. Cuando el onDestroy() del MapActivity se llama, me sale este error LogCat:

06-11 21:26:35.591: D/CLIPBOARD(14801): Hide Clipboard dialog at Starting input: finished by someone else... ! 
06-11 21:26:44.451: D/dalvikvm(14801): Debugger has detached; object registry had 1371 entries 
06-11 21:26:44.451: D/AndroidRuntime(14801): Shutting down VM 
06-11 21:26:44.456: W/dalvikvm(14801): threadid=1: thread exiting with uncaught exception (group=0x40c4b1f8) 
06-11 21:26:44.476: E/AndroidRuntime(14801): FATAL EXCEPTION: main 
06-11 21:26:44.476: E/AndroidRuntime(14801): java.lang.RuntimeException: Unable to destroy activity {com.project4.mtl/com.project4.mtl.EventActivity}: java.lang.IllegalArgumentException: Service not registered: [email protected] 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3124) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3142) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.ActivityThread.access$1200(ActivityThread.java:127) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1192) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.os.Looper.loop(Looper.java:137) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.ActivityThread.main(ActivityThread.java:4507) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at java.lang.reflect.Method.invokeNative(Native Method) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at java.lang.reflect.Method.invoke(Method.java:511) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at dalvik.system.NativeStart.main(Native Method) 
06-11 21:26:44.476: E/AndroidRuntime(14801): Caused by: java.lang.IllegalArgumentException: Service not registered: [email protected] 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:888) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.ContextImpl.unbindService(ContextImpl.java:1211) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.content.ContextWrapper.unbindService(ContextWrapper.java:375) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at com.project4.mtl.EventActivity.onDestroy(EventActivity.java:175) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.Activity.performDestroy(Activity.java:4629) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1082) 
06-11 21:26:44.476: E/AndroidRuntime(14801): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3111) 
06-11 21:26:44.476: E/AndroidRuntime(14801): ... 11 more` 

Y por supuesto el código alrededor de la línea 175, donde la excepción es causado en mi programa:

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    unbindService(mConnection); 
    super.onDestroy(); 
} 

Si quieren más fragmentos de código, solo dígame.

* edición *

Este es el código para el ServiceConnection:

public void doBindService() { 
    //ComponentName service = startService(new Intent(this, 
     // EventService.class)); 
    bindService(new Intent(this, EventService.class), mConnection, 
      Context.BIND_AUTO_CREATE); 
} 

mConnection es el tipo de ServiceConnection:

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     myService = ((EventService.MyBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName name) { 
     // TODO Auto-generated method stub 

    } 
}; 
+0

¿Es posible que el servicio se destruya antes de que se destruya la actividad? – SirPentor

+0

El servicio se destruye primero. – tolgap

+0

Ese es el problema central entonces. ¿Cómo se destruye? – SirPentor

Respuesta

5

que ha funcionado para mí! Simplemente llame a la función unbindService() de getApplicationContext() en lugar de "este" contexto. (Lo mismo para la vinculación del servicio)

getApplicationContext().unbindService(mServiceConnection); 
0

Se podía establecer mService a nulo en onServiceDisconnected y compruebe que en onDestroy. De esta manera:

private ServiceConnection mConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName className, IBinder binder) { 
      mService = ((LoadArticlesService.LoadArticlesBinder) binder).getService(); 
     } 
     public void onServiceDisconnected(ComponentName className) { 
      mService = null; 
     } 
    }; 

OnDestroy:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (mService != null) { 
     unbindService(mConnection); 
    } 
} 

funciona bien.

Cuestiones relacionadas