2015-05-19 7 views
18

Przechodziłem przez Bound Service w witrynie dla programistów Androida. Pomyślałem, że rozumiem tę usługę wystarczająco, ale znalazłem inny sposób połączenia usługi poprzez użycie klasy Messenger, szczególnie w przypadku usług lokalnych. Tam byłem zdezorientowany. Może źle pomyślałem.Dlaczego używać usługi, jeśli działa w tym samym wątku w Androidzie

Oto moje zrozumienie usługi Android. Aby utworzyć usługę przy

  1. Chcesz zrobić oddzielne pracy w tle.
  2. Chcesz zrobić oddzielny proces.
  3. Chcesz, aby działał w innym cyklu życia.

Zamieszanie jest pierwszą pozycją na liście, definicją tła. Czy tło nie jest wątkiem lub procesem? Nigdy nie myślałem, że może działać na głównym wątku.

Oto uwaga dotycząca serwisu na stronach poświęconych programistom.

Uwaga: Usługa działa w głównym wątku jej hosting procesowej-usługi nie tworzy swój własny wątek i nie działa w oddzielnym procesie (o ile nie określono inaczej). Oznacza to, że jeśli twoja usługa będzie wykonywać intensywne prace lub operacje blokujące procesor (takie jak odtwarzanie MP3 lub praca w sieci), powinieneś utworzyć nowy wątek w usłudze, aby to zrobić. Używając oddzielnego wątku, zmniejszysz ryzyko błędów ANR (Application Not Responding), a główny wątek aplikacji pozostanie dedykowany interakcji użytkownika z twoimi działaniami.

Pytania 1. Dlaczego ktoś wybrał opcję korzystania z usługi, jeśli funkcja serwisowa w każdym razie działa w głównym wątku? 2. Czy musimy napisać usługę tylko po to, aby zablokować ANR, nawet jeśli czasochłonna praca jest wykonywana w głównym wątku? Załóżmy, że usługa jest tylko dla mojej aplikacji. 3. Czy istnieją praktyczne przypadki lub powody, dla których usługa jest prywatna i działa w tym samym wątku?

Z góry dziękuję.

+1

głównym celem usługi jest to, że mają inny cykl życia niż cyklu aktywności - tak # 3 stosuje się tutaj. – pskink

Odpowiedz

17

Główny wątek aplikacji nie zawsze jest wątkiem interfejsu użytkownika. Na przykład, gdy działanie jest zatrzymane, wywoływana jest funkcja onStop(), stąd wątek interfejsu użytkownika jest usuwany z tego działania i przenoszony do innej czynności w tej samej lub innej aplikacji. Jednak nie oznacza to, że aplikacja nie jest już aktywna, może kontynuować pracę w tle, dopóki nie zostanie zamknięta przez system operacyjny lub użytkownika. Więc kto utrzymuje go w tle? Jest to główny wątek, a nie wątek interfejsu użytkownika.

Jakie są usługi

W Androidzie usługa jest komponentem aplikacji, które można wykonać długo działa operacje w tle na wątku UI. Na tle oznacza to, że nie ma interfejsu użytkownika. Usługa działa domyślnie na głównym wątku wywołującego komponentu (a tym samym może obniżyć czas reakcji i spowodować ANR), dlatego użytkownik powinien utworzyć nowy wątek, aby wykonywać długotrwałe operacje. Usługę można również uruchomić w zupełnie innym procesie.

W przeciwieństwie do komponentów aktywnych usługi nie mają graficznych interfejsów . Ponadto odbiorniki Broadcast Receiver służą do odbierania wiadomości o nadawaniu (broadcast, multicast, unicast) i wykonywania krótkich zadań , podczas gdy usługi mają na celu długotrwałe przetwarzanie, takie jak przesyłanie strumieniowe muzyki, transakcji sieciowych, plików I/O, interakcji z bazami danych itp. Kiedy service jest uruchamiana przez komponent aplikacji niczym Aktywny to działa w tle i wciąż działa nawet jeśli przełączniki użytkownik do innej aplikacji lub element wyjściowy jest sama zniszczona

Dlaczego usługa użycie

Usługi mają wyższy priorytet niż inne procesy w tle i dlatego jest mniej prawdopodobne, że Android je zakończy. Chociaż można skonfigurować do ponownego uruchomienia, gdy tylko dostępne są wystarczające zasoby . Powinieneś przejść przez różne procesy i ich priorytet/ważny poziom w dokumentacji procesów i wątków . Przypisanie im tego samego priorytetu co czynności pierwszego planu jest zdecydowanie możliwe, w takim przypadku musi być widoczne aktywne powiadomienie (zazwyczaj używane do odtwarzania muzyki z Usług).

Skorzystaj z IntentService, jeśli nie chcesz sam sobie radzić z zarządzaniem wątkami. W przeciwnym razie użyj AsyncTasks.

Przeczytaj ten doskonały artykuł pod numerem understand more in detail, a także read this answer.

+0

Mam punkt, który myślę. Zasadniczo są to różne cele (dostępność tylko dla krótkiego kontekstu (ekran) i usługi są szersze) i nie są przydatne do rozróżnienia ich pod względem wydajności, ponieważ i tak usługa działa na głównym wątku. – Jaekwan

+0

Zgodnie z https://stackoverflow.com/questions/3261370/is-main-thread-the-same-as-ui-thread główny wątek i wątek interfejsu użytkownika są takie same – 10101010

0

Podsumowując, usługi działają w tle wątku interfejsu użytkownika. Można wykonywać zadania takie jak uwierzytelnianie klient-serwer lub zapisywać w bazie danych, w której zadania są wykonywane w tle bez interfejsu graficznego.

Ale jeśli wykonujesz naprawdę długie zadania przetwarzania, które mogą zablokować interfejs, korzystasz z usługi w osobnym wątku.

np usługi na osobnym wątku jest IntentService