2012-08-24 19 views
7

Mam IntentSerivce, który działa czasami w tle i może to być dość długi proces w niektórych przypadkach. Dajemy użytkownikowi opcję zamknięcia aplikacji, która zasadniczo zatrzymuje się i odpytuje i ignoruje wszystkie powiadomienia push. Ale jeśli pojawi się powiadomienie push i IntentService zajmie trochę czasu, aby zakończyć to, co musi (pobiera informacje z serwera i wysyła powiadomienie do użytkownika, jeśli jest to potrzebne, jak nadejdzie nowa wiadomość lub coś takiego).Zatrzymywanie IntentService z działania

Oto problem, jeśli użytkownik wybierze opcję "Zamknij" aplikację, gdy intentservice nadal będzie działać, nadal otrzyma powiadomienie, którego nie chcę. Wiem, że istnieje metoda stopSelf() dla usługi, ale muszę zatrzymać ją w działaniu, gdy wiem, że użytkownik "Zamknij" aplikację za pomocą przycisku menu. Wysłanie innej usługi intent do usługi nie działa, ponieważ intencje stają się w kolejce i wywoływanie context.stopService(intent); w mojej aktywności nie działa tak jak i jak mogę to zatrzymać?

+0

Możliwy duplikat [Wymuszenie IntentService do natychmiastowego zatrzymania] (http://stackoverflow.com/questions/11258083/forcing- an-intentservice-to-stop-natychmiast) –

Odpowiedz

7

Czy przekazujesz nową Intent do stopService(Intent) lub oryginalną używaną w startService(Intent). Przejście pierwotnego zamiaru powinno zatrzymać usługę.

W przypadku niepowodzenia można użyć numeru Handler, aby przekazać usługę Message. Niech IntentService zaimplementuje interfejs Handler.Callback i utworzy nowy Handler(Handler.Callback) w swoim Activity, przekazując swoją IntentService jako oddzwonienie. Następnie zaimplementuj onHandleMessage() w swoim IntentService, aby zadzwonić pod numer stopSelf() i przekazać mu wiadomość Activity, kiedy ma się zatrzymać.

+1

Skąd bierze się instancja serwisowa (mam na myśli instancję Handler.Callback), gdy w działaniu uruchomiono od powiadomienia? – LiMar

3

Poniżej kod jest doskonale działa dobrze dla mnie zatrzymać IntentService z działalności:

stopService(new Intent(getApplicationContext(), MyIntentService.class)); 
+0

dziękuję bardzo! To działało idealnie dla mnie! – CodeDoctorJL