Как выполнить действие, когда служба останавливается? - PullRequest
1 голос
/ 05 сентября 2011

Я разрабатываю приложение, в котором запускаю фоновую службу и хочу, чтобы моя основная деятельность выполняла определенное действие после остановки службы

Я попробовал это в моем сервисе

public void onDestroy() {
    myActivity.getInstance().performAction();
}

однако это вызывает исключение службы времени ожидания, так как служба не останавливается, за исключением случаев, когда это действие завершено и это действие занимает много времени

как я могу обойти это. Есть предложения?

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Service и Activity не имеют одинаковый жизненный цикл.Это означает, что ваш Service может не найти экземпляр YourActivity при вызове YourActivity.getInstance().Ваш код должен противостоять этому.

И поскольку performAction() является методом YourActivity, было бы лучше выполнить его из YourActivity, а не из Service.

Таким образом, вы должны сделать следующее, я думаю:

  • опубликовать Message от вашего Service до YourActivity, используя Handler (подробнее в обработчике и в сообщении ) вместо прямого вызова YourActivity.performAction() с вашего Service.Вы бы отправили это сообщение непосредственно перед вызовом Service.stopSelf() (более подробная информация на stopSelf () ) или почему бы не переопределить этот метод.

  • make YourActivity может обработать это сообщение и выполнить performAction() (примеры обработки сообщений можно найти здесь: просто Ctrl-F "Обработчик" на этой странице ).Выполните его в отдельном Thread, чтобы избежать страшного «Приложение не отвечает».

0 голосов
/ 05 сентября 2011

Обычно уведомления используются для получения статуса от службы.

Есть несколько тем, которые могут вас заинтересовать:

Отправка уведомления от службы в Android

или

Уведомить деятельность от службы

См. Также примеры в:

http://developer.android.com/reference/android/app/Service.html

0 голосов
/ 05 сентября 2011

Любое действие, которое занимает много времени, требует отдельного потока. Вы можете посмотреть на AsyncTask, Thread, HandlerThread для решения. AsyncTask, вероятно, лучший вариант, так как он выполняет код в собственном потоке. После завершения AsyncTask обратный вызов вызывается из потока GUI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...