Przeczytałem kilka artykułów i oba wydają się robić to samo i zastanawiałem się, jaka jest różnica między uruchomieniem usługi w ten sposób:
Intent intent = new Intent(this, HelloService.class);
startService(intent);
lub tak:
Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);
Jak przeczytałem, te dwa robią to samo, jeśli w usłudze zwrócisz parametr START_STICKY;
android
android-service
user3629316
źródło
źródło
Odpowiedzi:
Zamiar
Intencja Androida to obiekt przenoszący intencję, tj. Wiadomość z jednego komponentu do innego komponentu wewnątrz lub na zewnątrz aplikacji. Intencje mogą przekazywać komunikaty między dowolnym z trzech podstawowych składników aplikacji - działaniami, usługami i odbiornikami transmisji.
Sam zamiar, obiekt intencji, jest pasywną strukturą danych. Zawiera abstrakcyjny opis operacji do wykonania.
Na przykład: załóżmy, że masz działanie, które wymaga uruchomienia klienta poczty e-mail i wysłania wiadomości e-mail. Aby to zrobić, Twoje działanie wyśle intencję z akcją
ACTION_SEND
wraz z odpowiednim wyborem do narzędzia do rozpoznawania intencji Androida:Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // only email apps should handle this
Określony selektor zapewnia użytkownikowi odpowiedni interfejs do wyboru sposobu wysyłania danych e-mail.
JASNE ZAMIERZENIA
// Explicit Intent by specifying its class name Intent i = new Intent(this, TargetActivity.class); i.putExtra("Key1", "ABC"); i.putExtra("Key2", "123"); // Starts TargetActivity startActivity(i);
IMPLICYJNE CELE
// Implicit Intent by specifying a URI Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com")); // Starts Implicit Activity startActivity(i);
Oczekujący zamiar
PendingIntent to token, który dajesz obcej aplikacji (np. NotificationManager, AlarmManager, Home Screen AppWidgetManager lub innym aplikacjom innych firm), który umożliwia zagranicznej aplikacji wykorzystanie uprawnień Twojej aplikacji do wykonania predefiniowanego fragmentu kodu.
Przykład oczekującego zamiaru: http://android-pending-intent.blogspot.in/
Źródło: zamiary Androida i oczekujące zamiary Androida
Mam nadzieję że to pomoże.
źródło
PendingIntent
jest opakowaniemIntent
. Zagraniczna aplikacja, która odbieraPendingIntent
, nie wie,Intent
która zawartość jest opakowanaPendingIntent
. Misją aplikacji zagranicznej jest odesłanie intencji do właściciela, gdy zostaną spełnione pewne warunki (na przykład: alarm z harmonogramem, powiadomienie kliknięciem ...). Warunki są podawane przez właściciela, ale przetwarzane przez zagraniczną aplikację (na przykład: alarm, powiadomienie).Jeśli zagraniczna aplikacja wysłała intencję do Twojej aplikacji, oznacza to, że zagraniczna aplikacja wie o treści intencji. i aplikacja zagraniczna podejmie decyzję o wysłaniu zamiaru, wtedy Twoja aplikacja musi przetworzyć zamiar, aby spełnić pewne warunki => Twoja aplikacja uzyska zasoby wydajności systemu.
źródło
Kolejna prosta różnica:
Normalny zamiar umrze, gdy tylko aplikacja zostanie zabita.
Oczekujące intencje nigdy nie umierają. Będą żyli tak długo, jak będzie to potrzebne przez usługę alarmową, usługę lokalizacyjną lub jakąkolwiek inną usługę.
źródło
Regularne uruchamianie usług przez AlarmManager
Podobnie jak w przypadku działań, system Android może w każdej chwili zakończyć proces usługi w celu oszczędzania zasobów. Z tego powodu nie można po prostu użyć
TimerTask
w usłudze, aby upewnić się, że jest wykonywana regularnie.Dlatego do prawidłowego planowania Usługi należy użyć
AlarmManager
klasy.AKTUALIZACJA:
Więc nie ma między nimi żadnej różnicy. Ale w zależności od tego, czy chcesz zapewnić wykonanie usługi, czy nie, możesz zdecydować, z czego skorzystać, ponieważ na pierwszą nie ma gwarancji, a na późniejszą .
Więcej informacji na AndroidServices .
źródło
getApplicationContext()
ani nie używaj go, gdy chcesz go ściśle, po prostu przeczytaj - kiedy-to-wywołać-kontekst-działania-lub-kontekst-aplikacji ( stackoverflow.com/questions/7298731/ ... ).Funkcjonalnie nie ma różnicy.
Znaczenie PendingIntent polega na tym, że możesz obsłużyć go do innej aplikacji, która później będzie mogła go używać tak, jakby ta inna aplikacja była sobą. Oto odpowiednie wyjaśnienie z dokumentacji :
Więc PendingIntent jest po prostu odwołaniem do danych, które reprezentują pierwotną intencję (która została użyta do utworzenia PendingIntent).
źródło