Опять вопрос про LocalServices. Как мне (повторно) привязаться к существующей службе после onDestroy()?
Проблема:
Я привязываюсь к службе и запускаю службу из действия. Я отправляю исполняемые объекты в Binder для обратного вызова (обновление индикатора выполнения) в пользовательском интерфейсе. Когда я закрываю это действие, ОС может завершить жизненный цикл и уничтожить действие, вызвав onDestroy(), верно? Я имитирую это, вызывая finish() в методе onPause(). Итак, как только я перезапущу действие, как мне снова привязаться к той же службе? Я думал, что Services — это Singelton, но когда я пытаюсь выполнить повторную привязку, я получаю еще одну ссылку на связыватель. Итак, binder.callbackHandler.post(binder.progressHandler);
по-прежнему содержит ссылку на старый binder/callback/progressHandler, а не на мой новый.
Даже Конструктор Сервиса снова вызывается!
Есть ли какое-либо решение, чтобы иметь индикатор выполнения, который обновляется объектами обратного вызова из службы (работает). Закрытие/onDestroy() действия. Вернуться и продолжить прогрессбар?
Мой код довольно большой, но воссоздал сценарий:
public class MyService extends Service {
private final LocalBinder binder = new LocalBinder();
public class LocalBinder extends Binder implements TestRunServiceBinder {
private Handler callbackHandler;
private ServiceStartActivity.RunOnServiceProgress onProgress;
@Override
public void setActivityCallbackHandler(Handler messageHandler) {
callbackHandler = messageHandler;
}
@Override
public void setServiceProgressHandler(RunOnServiceProgress runnable) {
onProgress = runnable;
}
public void doSomething(){
_doSomething();
};
private void _doSomething(){
while(...){
//do this a couple of times (could take up to 10min)
binder.callbackHandler.post(binder.progressHandler);
wait()
}
}
}
_
public class ServiceStartActivity{
private final Handler messageHandler = new Handler();
private ServiceConnection mTestServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
testRunBinder = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
testRunBinder = (TestRunServiceBinder) service;
testRunBinder.setActivityCallbackHandler(messageHandler);
testRunBinder.setServiceProgressHandler(new RunOnServiceProgress());
}
};
@Override
protected void onStart() {
super.onStart();
// bind to the Service
final Intent serviceIntent = new Intent(ServiceStartActivity.this,
MyService.class);
getApplicationContext().bindService(serviceIntent,
mTestServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
getApplicationContext().unbindService(mTestServiceConnection);
}
public class RunOnServiceProgress implements Runnable {
@Override
public void run() {
//do something on the UI!
}
}
}