2014-12-14 2 views
0

У меня есть приложение, которое выполняет некоторые повторяющиеся фоновые задачи. Я использую службу и Alarmmanager с методом setrepeating. Единственный способ остановить эту услугу - это кнопка, которая появляется на экране моей активности (конечно, система Android может убить ее по любой причине в любое время, но мне все равно, что делает система Android). Моя проблема в том, что через некоторое время моя деятельность будет уничтожена системой Android. У меня есть служба, которая работает вечно, если Android не убьет ее. Мой вопрос в том, как я могу получить ссылку на эту службу, чтобы остановить ее после создания новой активности (я предполагаю, что я создаю новую активность после уничтожения старой) ?.Остановка работы андроида после разрушенной деятельности

+0

http://stackoverflow.com/questions/27459885/stop-service-in-an-activity это может полезно –

+0

Я думаю, что я просто созданный дубликат этого вопроса http://stackoverflow.com/questions/10482171/how-to-get-reference-to-running-service – mbaydar

ответ

0

Рассмотрите bindService and unbindService. Когда ваша деятельность создана, вы можете позвонить bindService и использовать возвращенное связующее для связи с вашим сервисом. Услуга может быть как привязана, так и запущена, если вы не хотите, чтобы вы отключили свою службу после завершения вашей деятельности.

Другим подходом может быть использование LocalBroadcastManager для связи между вашей деятельностью и сервисом.

Наконец, рассмотрите либо Otto, либо Eventbus - два удивительных проекта с открытым исходным кодом для обмена информацией между компонентами вашего проекта Android.

+0

Я не уверен, что они работают для моей проблемы. Я могу общаться между деятельностью и службой. Проблема в том, что моя деятельность уничтожена. Я не могу остановить свое обслуживание. Я также не хочу привязываться к пользователю, потому что я не могу контролировать, когда он уничтожит мою деятельность, и даже после того, как моя деятельность будет уничтожена, я хочу, чтобы мой сервис продолжал работать, если пользователь не остановит его. – mbaydar

+0

Я думаю, вам нужно быть более ясным, что именно вы хотите. Ваш вопрос, кажется, говорит, что вы хотите убить службу, когда действие будет уничтожено. Если это так, привязка - хороший ответ. Если вы хотите что-то еще, скажите нам, что именно вы хотите. –

+0

, если я правильно понимаю, @mbaydar хочет снова подключиться к своему фоновому сервису, как только его деятельность будет уничтожена, а затем воссоздана. Здесь есть два варианта. 1. Запуск службы И привязка к ней, гарантируя тем самым, что unbind не будет убивать службу, но если служба уже запущена, он просто привязывается к уже запущенному экземпляру. 2. Отправка широковещательного события (/ otto/eventbus) на «любую службу, которая может быть там», и ожидание ответа. –

0

Используйте службу привязки и отвяжите методы обслуживания в своей MainActivity, чтобы вы могли вызвать службу unbind onDestroy(), когда ваша активность приложений либо явно уничтожена пользователем, либо системой Android, класс обслуживания также уничтожается.

Используйте этот пост в качестве руководства: Example: Communication between Activity and Service using Messaging

+0

Если я использую службу связывания, это значит, что как только моя деятельность будет уничтожена, моя служба также будет уничтожена. Который я не хочу, потому что я не могу контролировать, когда моя деятельность разрушена. Другими словами, я не могу заниматься своей деятельностью так долго, как хочу на заднем плане. Поэтому я не думаю, что ответ является обязательным. – mbaydar

+0

Причина, по которой ваш класс обслуживания работает вечно без закрытия даже при создании нового действия, просто потому, что класс службы не синхронизирован (без связи) с какой-либо деятельностью, в первую очередь, когда вы запускаете приложение в первый раз , – CodeZero

0

Я думаю, что я не мог объяснить мою проблему четко. Но я нашел ответ на этот пост How to get reference to running service? Dawid Sajdak ответить

private boolean isMyServiceRunning() { 
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if ("your.service.classname".equals(service.service.getClassName())) { 
      return false; 
     } 
    } 
    return true; 
} 

if(isMyServiceRunning()) { 
    stopService(new Intent(ServiceTest.this,MailService.class)); 
} 
Смежные вопросы