2012-06-11 26 views
7

* EDIT giải quyết bằng cách làm điều này: * tôi đã giải quyết nó bằng cách thay đổi của tôi onDestroy() của Hoạt động của tôi và ServiceConnection::onServiceDisconnected().Không thể phá hủy hoạt động (dịch vụ không được đăng ký)

Tôi đã thêm boolean để kiểm tra xem tôi có bị ràng buộc với Dịch vụ được gọi là boundToService hay không. Các 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(); 
    } 
} 

Đây là cách ràng buộc và unbinding được thực hiện trong hoạt động:

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

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

Như Guillaume nói, gọi super.onDestroy() đầu tiên là phải.

* END OF động SOLVE *

Tôi có một Foreground Service rằng dữ liệu các cuộc thăm dò GPS, và MapActivity yêu cầu rằng dữ liệu mỗi 3 giây. Khi onDestroy() của MapActivity được gọi, tôi nhận được lỗi LogCat này:

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` 

Và tất nhiên các mã xung quanh dòng 175 nơi ngoại lệ được gây ra trong chương trình của tôi:

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

Nếu bạn muốn biết thêm đoạn mã, chỉ cần cho tôi biết.

* chỉnh sửa *

Đây là mã cho ServiceConnection:

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

mConnection là loại 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

Có thể dịch vụ đã bị hủy trước khi hoạt động bị hủy không? – SirPentor

+0

Dịch vụ này sẽ bị hủy trước. – tolgap

+0

Đó là vấn đề cốt lõi rồi. Làm thế nào là nó bị phá hủy? – SirPentor

Trả lời

5

Đó là làm việc cho tôi! Chỉ cần gọi hàm unbindService() từ getApplicationContext() thay vì ngữ cảnh "này". (Tương tự cho ràng buộc dịch vụ)

getApplicationContext().unbindService(mServiceConnection); 
0

Bạn chỉ có thể thiết lập mService để null trong onServiceDisconnected và kiểm tra cho rằng trong onDestroy. Như thế này:

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

trình tốt.

Các vấn đề liên quan