привязка к запущенному сервису (после finish() )/обработчик обратного вызова

Опять вопрос про 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!
                    }
        }
}
5
задан Johannes Staehlin 16 March 2012 в 02:10
поделиться