У меня есть активность, которая запускает службу и связывает ее. Но я хочу, чтобы моя служба работала, даже если активность закрыта, поэтому мне нужно ее отвязать. Когда я пытаюсь это сделать (вызывая мою функцию разъединения от службы), я всегда получаю это исключение.
Служба успешно привязана, и я могу общаться с ней. Я пытаюсь отвязать службу, только если она связана.
Я думаю, я пытаюсь связать и развязать службу из одного и того же контекста - это - вызовы связывания и развязки происходят из функций MainActivity.
Основная деятельность:
public class MainActivity extends AppCompatActivity {
private boolean bounded;
private SturkoPlayerService sturkoService;
...
//Connection
...
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
SturkoPlayerService.LocalBinder mBinder = (SturkoPlayerService.LocalBinder) service;
sturkoService = mBinder.getService();
bound = true;
...
Log.d(DEBUG_S, "Service bind: " + (bounded && sturkoService!=null)); //Binding successful
}
@Override
public void onServiceDisconnected(ComponentName name) {
bound = false;
sturkoService = null;
}
};
...
//Binding in MainActivity code
...
Intent startingIntent = new Intent(this, SturkoPlayerService.class);
startingIntent.setAction(SturkoPlayerService.PLAYER_START);
bindService(startingIntent, connection, Context.BIND_AUTO_CREATE);
...
//Unbinding
private void disconnectFromService() {
if (sturkoService != null && bound) {
...
this.unbindService(connection);
}
}
...
}
Услуга:
public class SturkoPlayerService extends Service {
...
public class LocalBinder extends Binder {
public SturkoPlayerService getService() {
return SturkoPlayerService.this;
}
}
...
}
EDIT1: Logcat
04-14 11:57:51.873 2890-2890 D/sturkoPlayer: START
04-14 11:57:51.873 2890-2890 D/sturkoPlayer: Service bind: true
04-14 11:58:01.406 2890-2890 W/System.err: java.lang.IllegalArgumentException: Service not registered: ....MainActivity$1@4221e2d8
04-14 11:58:01.521 2890-2890 W/System.err: at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:947)
04-14 11:58:01.521 2890-2890 W/System.err: at android.app.ContextImpl.unbindService(ContextImpl.java:1277)
04-14 11:58:01.522 2890-2890 W/System.err: at android.content.ContextWrapper.unbindService(ContextWrapper.java:405)
04-14 11:58:01.522 2890-2890 W/System.err: at ...MainActivity.disconnectFromService(MainActivity.java:122)
04-14 11:58:01.522 2890-2890 W/System.err: at ...MainActivity.onStop(MainActivity.java:132)
04-14 11:58:01.522 2890-2890 W/System.err: at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1210)
04-14 11:58:01.522 2890-2890 W/System.err: at android.app.Activity.performStop(Activity.java:5158)
04-14 11:58:01.523 2890-2890 W/System.err: at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3397)
04-14 11:58:01.523 2890-2890 W/System.err: at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3456)
04-14 11:58:01.525 2890-2890 W/System.err: at android.app.ActivityThread.access$1200(ActivityThread.java:149)
04-14 11:58:01.526 2890-2890 W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
04-14 11:58:01.527 2890-2890 W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
04-14 11:58:01.527 2890-2890 W/System.err: at android.os.Looper.loop(Looper.java:153)
04-14 11:58:01.527 2890-2890 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:4987)
04-14 11:58:01.528 2890-2890 W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
04-14 11:58:01.528 2890-2890 W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
04-14 11:58:01.529 2890-2890 W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
04-14 11:58:01.531 2890-2890 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
04-14 11:58:01.541 2890-2890 W/System.err: at dalvik.system.NativeStart.main(Native Method)
Edit2: в манифесте, под действием
<service
android:name=".Service.SturkoPlayerService"
android:enabled="true"
android:exported="true"></service>
РЕШЕНИЕ:
Проблема заключалась в том, что функция "disconnectFromService()" вызывалась и из finish(), и из onStop(). Так его вызывали дважды, когда деятельность уже собиралась закрыться.
После удаления вызова из onStop() исключение больше не генерируется.
К сожалению, эта ошибка была просто моей глупостью.