2012-06-11 3 views
7

* EDIT решаемым ДЕЛАТЬ ЭТО: * Я решил ее меняет onDestroy() моей деятельности и ServiceConnection::onServiceDisconnected().Невозможно уничтожить активность (услуга не зарегистрирована)

Я добавил логическое значение, чтобы проверить, ограничена ли я службой под названием boundToService. 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; 
    } 
}; 

И onDestroy():

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

Это как связывание и развязывание осуществляется в деятельности:

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

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

Как сказал Гийом, называя super.onDestroy() Первый обязательно.

* КОНЕЦ РЕШИТЬ *

У меня есть Foreground Service, что данные опросов GPS, и MapActivity запросов, что данные каждые 3 секунды. Когда onDestroy() из MapActivity называется, я получаю эту ошибку 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` 

И, конечно же, код вокруг линии 175, где исключение вызывается в моей программе:

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

Если вы хотите более фрагменты кода, просто скажите мне.

* редактировать *

Это код ServiceConnection:

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

mConnection является тип 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

Возможно ли, что служба уничтожена до того, как действие будет уничтожено? – SirPentor

+0

Служба сначала уничтожается. – tolgap

+0

Это основная проблема. Как он уничтожается? – SirPentor

ответ

5

Это работало для меня! Просто вызовите функцию unbindService() из getApplicationContext() вместо «этого» контекста. (То же самое для связывания службы)

getApplicationContext().unbindService(mServiceConnection); 
0

Вы можете просто установить mService в нуль в onServiceDisconnected и проверить, что в onDestroy. Как это:

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); 
    } 
} 

работает отлично.

Смежные вопросы