Odpowiedzi:
PendingIntent
To znak, że dajesz do aplikacji obcej (np NotificationManager
, AlarmManager
, Home Screen AppWidgetManager
, lub innych aplikacji 3rd party), co pozwala na stosowanie obcego uprawnienia do korzystania z danej aplikacji, aby wykonać predefiniowany kawałek kodu .
Jeśli dasz zagranicznej aplikacji zamiar, wykona ona ciebie Intent
z własnymi uprawnieniami. Ale jeśli dasz zagraniczną aplikację PendingIntent
, ta aplikacja wykona twoje Intent
użycie za jej zgodą.
Oczekiwanie na zamiar to token, który dajesz jakiejś aplikacji w celu wykonania akcji w imieniu aplikacji, niezależnie od tego, czy proces aplikacji trwa, czy nie.
Myślę, że dokumentacja jest wystarczająco szczegółowa: Dokumenty Pending Intent .
Wystarczy pomyśleć o przypadkach użycia dla Oczekujących Intencji, takich jak (Nadawanie Intencji, planowanie alarmów), a dokumentacja stanie się bardziej zrozumiała i zrozumiała.
W moim przypadku żadna z powyższych odpowiedzi ani oficjalna dokumentacja Google nie pomogły mi uchwycić pojęcia PendingIntent
klasy.
A potem znalazłem ten film, Google I / O 2013, sesja Beyond the Blue Dot . W tym filmie ex-googler Jaikumar Ganesh wyjaśnia, co PendingIntent
jest, i właśnie to dało mi duży obraz tego.
Poniżej znajduje się tylko transkrypcja powyższego wideo ( z 15:24 ).
Więc co jest w toku?
Jest to token, który proces aplikacji poda procesowi lokalizacji, a proces lokalizacji użyje go, aby obudzić aplikację, gdy wydarzy się interesujące zdarzenie . Oznacza to w zasadzie, że Twoja aplikacja w tle nie musi zawsze działać. Kiedy wydarzy się coś interesującego, obudzimy cię. Oszczędza to dużo baterii.
To wyjaśnienie staje się bardziej zrozumiałe dzięki temu fragmentowi kodu (który znajduje się na slajdzie sesji).
PendingIntent mIntent = PendingIntent.getService(...);
mLocationClient.requestLocationUpdates(locationRequest, mIntent);
public void onHandleIntent(Intent intent) {
String action = intent.getAction();
if (ACTION_LOCATION.equals(action)) {
Location location = intent.getParcelableExtra(...)
}
}
Dlaczego PendingIntent jest wymagany? Myślałem jak
Intent
lubIntent
do tego samego celu.Na przykładIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Jeśli wyślę bluetoothIntent
do innej aplikacji, która nie ma uprawnień android.permission.BLUETOOTH_ADMIN
, ta aplikacja odbierająca nie może włączyć Bluetooth za pomocą startActivity(bluetoothIntent)
.
Ograniczenie to można pokonać za pomocą PendingIntent
. Dzięki PendingIntent
aplikacji odbierającej nie trzeba android.permission.BLUETOOTH_ADMIN
włączać Bluetooth. Źródło .
Przyszła intencja, z której mogą korzystać inne aplikacje.
A oto przykład tworzenia takiego:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
ANALOGIA PODATKOWA
Zamiar
Zamiary są zwykle używane do uruchamiania Usług. Na przykład:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);
To tak, jakbyś wezwał taksówkę:
Myself = CurrentClass
Taxi Driver = ServiceClass
Oczekuje na zamiar
Musisz użyć czegoś takiego:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);
Teraz ta strona trzecia uruchomi usługę działającą w Twoim imieniu. Prawdziwą analogią jest Uber lub Lyft, którzy są firmami taksówkowymi.
Wysyłasz zapytanie o przejazd do Uber / Lyft. Następnie zaczną dzwonić do jednego ze swoich kierowców w Twoim imieniu.
W związku z tym:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
PendingIntent to token, który przekazujesz innej aplikacji (np. Menedżerowi powiadomień, Menedżerowi alarmów lub innym aplikacjom zewnętrznym), który pozwala tej aplikacji na korzystanie z uprawnień aplikacji do wykonania predefiniowanego fragmentu kodu. Aby wykonać transmisję za pośrednictwem oczekującej intencji, uzyskaj PendingIntent za pośrednictwem PendingIntent.getBroadcast (). Aby wykonać działanie za pośrednictwem oczekującego zamiaru, otrzymasz działanie za pośrednictwem PendingIntent.getActivity ().
Co to jest zamiar?
Intent to specyficzne polecenie w systemie Android, które pozwala wysłać polecenie do systemu operacyjnego Android, aby zrobić coś konkretnego. Pomyśl o tym jak o akcji, która musi się odbyć. Istnieje wiele działań, które można wykonać, takich jak wysłanie wiadomości e-mail, dołączenie zdjęcia do wiadomości e-mail lub nawet uruchomienie aplikacji. Logiczny proces tworzenia zamiaru jest zwykle następujący: Utwórz zamiar b. Dodaj opcje zamiaru -> np. jaki rodzaj zamiaru wysyłamy do systemu operacyjnego lub wszelkie atrybuty powiązane z tym zamiarem, takie jak ciąg tekstowy lub coś przekazywanego wraz z zamiarem c. URUCHOM CEL
Przykład z życia: Powiedzmy, że budzę się rano i „zamierzam” iść do toalety. Najpierw będę musiał MYŚLIĆ o pójściu do toalety, ale to tak naprawdę NIE doprowadzi mnie do toalety. Będę musiał powiedzieć mózgowi, aby najpierw wstał z łóżka, a następnie poszedł do toalety, a następnie zwolnił, a następnie poszedł i umył ręce, a następnie poszedł i wytarł ręce. Kiedy już wiem, dokąd zmierzam, WYSYŁAM polecenie, aby rozpocząć, a moje ciało podejmuje działania.
Co to jest oczekiwanie?
Kontynuując przykład z życia, powiedzmy, że chcę wziąć prysznic, ale chcę wziąć prysznic PO Myciu zębów i jem śniadanie. Więc wiem, że nie będę brać prysznica przez co najmniej 30-40 minut. Wciąż mam w głowie, że muszę przygotować ubranie, a potem wejść po schodach do łazienki, rozebrać się i wziąć prysznic. Stanie się to jednak dopiero po upływie 30–40 minut. Teraz mam zamiar wziąć prysznic. OCZEKUJE na 30-40 minut.
Jest to właściwie różnica między zamierzonym i regularnym zamiarem. Regularne zamiary mogą być tworzone bez założeń oczekujących, jednak aby utworzyć oczekujące zamiary, musisz najpierw skonfigurować regularne zamiary.
PendingIntent
jest w zasadzie przedmiotem, który otacza inny Intent
obiekt. Następnie może zostać przekazany do aplikacji zagranicznej, w której przyznajesz tej aplikacji prawo do wykonania operacji, tj. Wykonania zamiaru, tak jakby był wykonany z procesu własnej aplikacji (to samo uprawnienie i tożsamość). Ze względów bezpieczeństwa zawsze powinieneś przekazywać wyraźne zamiary do PendingIntent, a nie być niejawnym.
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
W prostym języku:
1. Opis działania zamiaru i celu do wykonania. Najpierw musisz utworzyć zamiar, a następnie przekazać określoną klasę Java, którą chcesz wykonać, do zamiaru.
2. Możesz wywołać te klasy java, które są twoją klasą akcji klas, przez PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) i PendingIntent. getService (Context, int, Intent, int); Tutaj widzisz ten zamiar, który pochodzi z kroku 1
3. Należy pamiętać, że ... Dając PendingIntent innej aplikacji, przyznajesz jej prawo do wykonania określonej operacji.
Tego nauczyłem się po długim czytaniu.
PendingIntent otacza ogólną intencję tokenem, który dajesz zagranicznej aplikacji do wykonania za Twoją zgodą. Na przykład:
Powiadomienie o aplikacji muzycznej nie może odtwarzać / wstrzymywać muzyki, jeśli nie przekazałeś
PendingIntent
transmisji, ponieważ aplikacja muzyczna maREAD_EXTERNAL_STORAGE
uprawnienia, których nie ma aplikacja powiadomień. Powiadomienie to usługa systemowa (więc jest to aplikacja zagraniczna).
Jak sama nazwa wskazuje .. PendingIntent
możesz go zawiesić (zrób to po pewnym czasie). Działa w inny sposób. Jest to sposób na przekazanie zadania innej aplikacji do wykonania w Twoim imieniu.
Oczekujące Intent Określa działania należy podjąć w przyszłości. Pozwala przekazać przyszłą intencję do innej aplikacji i pozwolić tej aplikacji na wykonanie tej intencji, tak jakby miała takie same uprawnienia jak twoja aplikacja, niezależnie od tego, czy twoja aplikacja jest nadal aktywna po jej wywołaniu.
Jest to token, który przekazujesz zagranicznej aplikacji, która pozwala zagranicznej aplikacji na wykorzystanie uprawnień aplikacji do wykonania predefiniowanego fragmentu kodu.
Jeśli dasz zagranicznej aplikacji zamiar, a ta aplikacja wyśle / wyemituje zamiar, który podałeś, wykona zamiar z własnymi uprawnieniami. Ale jeśli zamiast tego przekażesz zagranicznej aplikacji OCZEKIWANIE utworzone przez Ciebie za pomocą własnego pozwolenia, ta aplikacja wykona zawarty Intent za pomocą pozwolenia Twojej aplikacji.
Aby wykonać transmisję za pośrednictwem oczekującej intencji, uzyskaj PendingIntent za pośrednictwem PendingIntent.getBroadcast (). Aby wykonać działanie za pośrednictwem oczekującego zamiaru, otrzymasz działanie za pośrednictwem PendingIntent.getActivity ().
Jest to czynność zamierzona, którą chcesz wykonać, ale w późniejszym czasie. Pomyśl o tym, jak postawić na lodzie. Powodem jest to, że Intent musi zostać utworzony i uruchomiony z prawidłowego kontekstu w aplikacji, ale istnieją pewne przypadki, w których nie jest on dostępny w momencie, gdy chcesz uruchomić działanie, ponieważ technicznie jesteś poza kontekstem aplikacji ( dwa typowe przykłady to uruchamianie działania z poziomu powiadomienia lub nadawcy.
Tworząc obiekt PendingIntent, którego chcesz użyć do uruchomienia, powiedzmy, działania, gdy masz do tego kontekst (z innego działania lub usługi), możesz przekazać ten obiekt do czegoś zewnętrznego, aby mógł uruchomić część aplikacji w Twoim imieniu.
PendingIntent zapewnia środki do działania aplikacji, nawet po zakończeniu procesu. Należy zauważyć, że nawet po tym, jak aplikacja, która utworzyła PendingIntent, została zabita, Intent może nadal działać. Opis zamierzonej i docelowej akcji do wykonania z nim. Instancje tej klasy są tworzone za pomocą getActivity (Context, int, Intent, int), getBroadcast (Context, int, Intent, int), getService (Context, int, Intent, int); zwrócony obiekt może zostać przekazany innym aplikacjom, aby mogły później wykonać akcję opisaną w Twoim imieniu.
Nadając PendingIntent innej aplikacji, przyznajesz jej prawo do wykonania określonej operacji, tak jakby inna aplikacja była sobą (z tymi samymi uprawnieniami i tożsamością). Dlatego powinieneś uważać na to, jak zbudujesz PendingIntent: często, na przykład, podstawowa intencja, którą podajesz, będzie miała nazwę komponentu jawnie ustawioną na jeden z twoich własnych komponentów, aby upewnić się, że ostatecznie zostanie wysłana tam i nigdzie indziej.
Sam PendingIntent to po prostu odwołanie do tokena obsługiwanego przez system opisujący oryginalne dane użyte do jego odzyskania. Oznacza to, że nawet jeśli proces aplikacji będący jej właścicielem zostanie zabity, sam PendingIntent pozostanie użyteczny dla innych procesów, które zostały mu przekazane. Jeśli aplikacja tworząca później ponownie pobierze ten sam rodzaj PendingIntent (ta sama operacja, ta sama akcja Intent, dane, kategorie i komponenty oraz te same flagi), otrzyma PendingIntent reprezentujący ten sam token, jeśli jest nadal ważny i może dlatego wywołaj anuluj (), aby go usunąć.