Co to jest Android PendingIntent?


537

Jestem nowicjuszem w systemie Android. Przeczytałem Dokumentację Androida, ale wciąż potrzebuję więcej wyjaśnień. Czy ktoś może mi powiedzieć, co to dokładnie PendingIntentjest?

Odpowiedzi:


891

PendingIntentTo 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 Intentz własnymi uprawnieniami. Ale jeśli dasz zagraniczną aplikację PendingIntent, ta aplikacja wykona twoje Intentużycie za jej zgodą.


3
poza powiadomieniami, gdzie jeszcze widziałeś korzystanie z pendingIntents? Myślę, że widziałem, że używają go tylko powiadomienia ...
programista Androida

4
@Johnny_D: oznacza to, co mówi, ogólnie rzecz biorąc, chciałbyś stworzyć wyraźną intencję, której nazwa komponentu jest nazwą absolutną, która jednoznacznie odnosi się do jednej z twoich własnych klas. W przeciwnym razie zamiar może zostać wysłany do innej aplikacji, co może powodować problemy, ponieważ zamiar będzie działał za zgodą aplikacji.
Lie Ryan

3
@LieRyan, czy zezwolenie aplikacji jest tutaj uprawnieniem określonym w manifeście? Na przykład. Pozwolenie na INTERNET?
Diffy

2
Czy to „przekazanie uprawnień” nie jest naprawdę złe pod względem bezpieczeństwa? Mam aplikację A, której udzieliłem kilku uprawnień. Następnie mam aplikację B, która używa znacznie mniej uprawnień. Jeśli aplikacja A może uruchomić coś w aplikacji B za pomocą PendingIntent (pozwalając tymczasowo na wszystkie uprawnienia z A na B), to czy B nie może zrobić tego, co może za kulisami z tym uprawnieniem? Na przykład A może mieć uprawnienia do odczytu kontaktów użytkownika, ale B nie. Jeśli A wysyła PendingIntent do B, B może następnie odczytać kontakty i zrobić coś złośliwego (np. Wysłać je na serwer).
Tiago,

6
@Tiago: W twoim przypadku, jeśli uprzywilejowana aplikacja A daje aplikacji B oczekującą intencję, aby B mógł ją wysłać, gdy chce odczytać dane kontaktowe. Do obowiązków A należy zapytanie użytkownika, które dane kontaktowe użytkownik chce przekazać B, i tylko te dane B. Pending Intent jest mechanizmem eskalacji uprawnień i podobnie jak każdy mechanizm eskalacji uprawnień, z wielką mocą wiąże się wielka odpowiedzialność. Użytkownik jest odpowiedzialny za decyzję, czy aplikacja B jest godna zaufania dla danych kontaktowych wybranych przez użytkownika.
Lie Ryan

49

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.


Myślę, że Intent jest także rodzajem tokena, który przekazujemy innej aplikacji w celu wykonania czynności w jej imieniu. Tak więc jedyną różnicą między Oczekiwaniem a Zamiarem jest życie naszego procesu aplikacji?
CopsOnRoad

40

W moim przypadku żadna z powyższych odpowiedzi ani oficjalna dokumentacja Google nie pomogły mi uchwycić pojęcia PendingIntentklasy.

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 PendingIntentjest, 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(...)   
    }
}

Zgadzam się, jest to dość proste i jasne do zrozumienia. Ale nie mówi nam nic o pozwoleniu, które PendingIntent daje innej aplikacji.
CopsOnRoad

35

Dlaczego PendingIntent jest wymagany? Myślałem jak

  1. Dlaczego sama aplikacja odbierająca nie może utworzyć Intentlub
  2. Dlaczego nie możemy użyć prostego Intentdo tego samego celu.

Na przykładIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Jeśli wyślę bluetoothIntentdo 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 PendingIntentaplikacji odbierającej nie trzeba android.permission.BLUETOOTH_ADMINwłączać Bluetooth. Źródło .


3
Twój przykład bluetoothIntent jest naprawdę cenny. Dzięki
Nicks

1
@Kiran - Jeśli odbierająca aplikacja może włączyć Bluetooth (za pomocą Pending Intent), to dlaczego ta aplikacja nie uwzględniła tego pozwolenia w Manifeście? To tak, jakbym tworzył aplikację, która może nawiązywać połączenia, ale nie uwzględniam uprawnienia CALL_PHONE, ponieważ chcę, aby inna aplikacja wysłała mi komunikat Oczekiwanie na wykonanie tego połączenia. Czy to chcesz powiedzieć?
CopsOnRoad

1
@CopsOnRoad Aplikacja odbierająca PendingIntent może być aplikacją ogólną, która odbiera dowolne żądania i wykonuje je w imieniu osoby żądającej. Jego rola jest tylko pośrednikiem, dlatego nie ma wszystkich uprawnień. Przykładem tego rodzaju aplikacji pośrednich jest menedżer powiadomień, który może uruchamiać dowolne zamierzone aplikacje z powiadomienia bez posiadania pozwolenia.
Xiao-Feng Li

21

Oczekiwanie na zamiar to zamiar, który rozpocznie się w pewnym momencie w przyszłości. Normalne zamiary zaczynają się natychmiast po przekazaniu do startActivity(Intent)lub StartService(Intent).


13

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);

8
Usprawiedliw, ponieważ tak naprawdę nie wyjaśniasz, co jest specjalnego w zamiarach, które są „przyszłe” lub możliwe do wykorzystania przez inne aplikacje
Vic

@ WhereDatApp.com powiedział Antoine de Saint Exupéry i przetłumaczony przez Lewisa Galantière;)
Choletski

@Choletski dzięki, nie wiedziałem o tłumaczeniu 👍
Oded Breiner

13

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

11

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 ().


7

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.


Bardzo podobał mi się ten prosty i przykład, zrozumiałem go całkiem dobrze z tymi słowami.
Josema

Cieszę się, że ten post jest dla Ciebie przydatny Josema
Narendra Motwani,

jest to dokładnie to samo, co wyjaśnienie Shakeeb Ayaz powyżej. kto od kogo kopiował? :)
likejudo

5

PendingIntentjest w zasadzie przedmiotem, który otacza inny Intentobiekt. 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);

4

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.


3

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ś PendingIntenttransmisji, ponieważ aplikacja muzyczna ma READ_EXTERNAL_STORAGEuprawnienia, których nie ma aplikacja powiadomień. Powiadomienie to usługa systemowa (więc jest to aplikacja zagraniczna).


świetny przykład!
likejudo

2

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.


1
Czy możesz podać prawdziwy przykład tego?
CopsOnRoad

0

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ąć.


0

Pending Intent to intencja, która zapewnia wszelkie uprawnienia innej aplikacji do wykonania określonych prac. Po zniszczeniu głównej aktywności system operacyjny Android odbiera od niej pozwolenie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.