Що таке Android PendingIntent?


537

Я новачок в Android. Я читав Документацію на Android, але мені ще потрібно ще дещо роз'яснення. Хтось може сказати мені, що саме PendingIntentтаке?

Відповіді:


891

A PendingIntent- це маркер, який ви надаєте іноземній програмі (наприклад NotificationManager, AlarmManagerДомашній екран AppWidgetManagerабо іншим стороннім додаткам), що дозволяє іноземній програмі використовувати дозволи вашого додатка для виконання заздалегідь заданого фрагмента коду .

Якщо ви даєте іноземній заяві наміри, вона виконає ваші Intentвласні дозволи. Але якщо ви надаєте іноземній заяві a PendingIntent, ця програма виконає ваше Intentвикористання, використовуючи дозвіл вашої програми.


3
крім сповіщень, де ви ще бачили використання pendingIntents? Думаю, я бачив лише сповіщення ...
android developer

4
@Johnny_D: це означає те, що він говорить, загалом, ви хочете створити явний Намір, ім'я компонента якого є абсолютною назвою, яка однозначно посилається на один із ваших власних класів. В іншому випадку, Намір може бути надісланий до іншої програми, що може спричинити проблеми, оскільки цей Намір буде працювати з дозволу вашої програми.
Лі Лі Раян

3
@LieRyan, чи дозвіл програми тут є дозволом, який ми вказуємо в маніфесті? Напр. ІНТЕРНЕТ дозвіл?
Діффі

2
Невже це "передача дозволів" насправді не є безпечною? У мене є додаток A, що я дав кілька дозволів. Тоді у мене є додаток B, яке використовує набагато менше дозволів. Якщо програма A може запустити щось у програмі B через PendingIntent (дозволяючи всім дозволам від A бути тимчасово в B), чи не може B робити все, що може, за кадром, з цього дозволу? Наприклад, A може мати дозвіл на читання контактів користувача, але B - ні. Якщо A надсилає PendingIntent до B, тоді B може прочитати контакти та зробити щось шкідливе (наприклад, надіслати його на сервер).
Тіаго

6
@Tiago: У вашому випадку, якщо привілейована програма A надає програмі B очікуваний намір, щоб B міг надіслати її, коли хоче прочитати контактні дані. Відповідальність A полягає у тому, щоб запитувати у користувача, які контактні дані користувач хоче надати B, і лише надавати B ці дані. Намір намірів - це механізм ескалації привілеїв, і, як і будь-який механізм ескалації привілеїв, з великою силою виникає велика відповідальність. Користувач несе відповідальність за вирішення того, чи програма B достовірна для контактних даних, які вибрав користувач.
Лі Лі Раян

49

Намір, що очікує, - це маркер, який ви надаєте якійсь програмі для виконання дії від імені ваших програм, незалежно від того, живий процес вашої заявки чи ні.

Я думаю, що документація є достатньо детальною: Документи, що очікують на розгляд .

Подумайте лише про випадки використання для очікуючих намірів, таких як (Інтернети трансляції, тривоги планування), і документація стане більш зрозумілою та значущою.


Я думаю, що Намір також є своєрідним знаком, який ми надаємо якомусь іншому додатку для виконання дії від імені нашого додатка. Отже, єдиною різницею між наміром, що очікує, та наміром є життя нашого процесу подання заявки?
CopsOnRoad

40

У моєму випадку жоден з наведених вище відповідей, а також офіційна документація google не допомогли мені зрозуміти поняття PendingIntentкласу.

І тоді я знайшов це відео, Google I / O 2013, поза сесією Blue Dot . У цьому відео екс-гуглер Яйкумар Ганеш пояснює, що PendingIntentтаке, і саме ця річ дала мені велику картину цього.

Нижче наведено лише транскрипцію вищезазначеного відео ( з 15:24 ).

Отже, що таке очікуваний намір?

Це знак, який ваш додаток додасть до процесу локації, а процес локації використовуватиме його, щоб розбудити ваш додаток, коли трапиться якась цікава подія . Отже, це означає, що ваш додаток у фоновому режимі не завжди має працювати. Коли трапиться щось цікаве, ми розбудимо вас. Це економить багато акумулятора.

Це пояснення стає більш зрозумілим із цим фрагментом коду (який включений у слайд сеансу).

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

Погодьтеся, це зрозуміти досить просто і зрозуміло. Але це нічого не говорить нам про дозвіл, який надає PendingIntent іншому додатку.
CopsOnRoad

35

Чому необхідний PendingIntent? Я думав, як

  1. Чому приймаюча програма сама не може створити Intentабо
  2. Чому ми не можемо використовувати простий Intentдля тієї ж мети.

НапрIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Якщо я надішлю bluetoothIntentдо іншої програми, яка не має дозволу android.permission.BLUETOOTH_ADMIN, ця приймаюча програма не може включити Bluetooth за допомогою startActivity(bluetoothIntent).

Обмеження долається за допомогою PendingIntent. У PendingIntentпрограмі, що приймає, не потрібно android.permission.BLUETOOTH_ADMINввімкнути Bluetooth. Джерело .


3
Ваш приклад bluetoothIntent справді цінний. Спасибі
Нікс

1
@Kiran - Якщо прийом програми може увімкнути Bluetooth (використовуючи наміри в очікуванні), чому тоді ця програма не включила цей дозвіл у свій Маніфест? Це так, як я роблю додаток, який може телефонувати, але я не включаю дозволу CALL_PHONE, тому що я хочу, щоб інший додаток надіслав мені очікуваний намір здійснити цей дзвінок. Це те, що ти хочеш сказати?
CopsOnRoad

1
@CopsOnRoad Приймаючий додаток PendingIntent може бути загальним додатком, який отримує будь-який запит і виконує запит від імені запитувача. Її роль - це лише людина середнього віку, отже, не має всіх дозволів. Прикладом такого роду програм для середнього чоловіка є менеджер сповіщень, який може запускати будь-які програми, призначені для отримання сповіщень, не володіючи дозволом.
Сяо-Фен Лі

21

Намір у очікуванні - це намір, який розпочнеться в якийсь момент майбутнього. Звичайний намір починається негайно, коли він передається до startActivity(Intent)або StartService(Intent).


13

Майбутній намір, який можуть використовувати інші програми.
Ось приклад для створення одного:

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);

8
Downvote тому, що ви насправді не пояснюєте, що є особливим у намірі, який є "майбутнім" або корисним для інших додатків
Vic

@ WhereDatApp.com про це сказав Антуан де Сент Екзюпері, а переклав Льюїс Галантьєр;)
Чолецький

@Choletski спасибі, я не знав про переклад 👍
Breiner

13

ТАКСИ АНАЛОГІЯ

Намір

Запуски зазвичай використовуються для запуску Сервісів. Наприклад:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);

Це як при виклику таксі:

Myself = CurrentClass
Taxi Driver = ServiceClass

Намір наміченого

Вам потрібно буде використовувати щось подібне:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);

Тепер ця Третя сторона розпочне послугу, яка діє від вашого імені. Аналогія в реальному житті - Uber або Lyft, які є обома компаніями таксі.

Ви надсилаєте запит на поїздку до Uber / Lyft. Потім вони продовжуватимуть дзвінки одного з своїх водіїв від вашого імені.

Тому:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass

11

PendingIntent - це маркер, який ви надаєте іншій програмі (наприклад, диспетчеру повідомлень, диспетчеру сигналів або іншим стороннім додаткам), що дозволяє цій іншій програмі використовувати дозволи вашої програми для виконання заздалегідь заданого фрагмента коду. Щоб виконати трансляцію через очікуваний намір, отримайте PendingIntent через PendingIntent.getBroadcast (). Щоб виконати активність через очікуваний намір, ви отримаєте активність через PendingIntent.getActivity ().


7

Що таке наміри?

Намір - це певна команда в Android, яка дозволяє відправляти команду в ОС Android, щоб зробити щось конкретне. Подумайте про це як про дію, яка повинна відбутися. Можна здійснити багато дій, таких як надсилання електронного листа або додавання фотографії до електронного листа або навіть запуск програми. Логічний робочий процес створення наміру зазвичай такий: a. Створіть Намір b. Додати опції намірів -> Приклад. який тип намірів ми надсилаємо до ОС або будь-які атрибути, пов’язані з цим наміром, наприклад, текстовий рядок або щось, що передається разом із наміром c. РАЙНУТЬ наміри

Приклад із реального життя: Скажімо, я прокидаюся вранці і я "НАМЕЖАЮ" йти до умивальника. Я спершу повинен подумати про те, щоб піти в туалетну кімнату, але це НЕ насправді забирає мене в туалетну кімнату. Тоді мені доведеться сказати мозку спочатку встати з ліжка, потім піти до умивальної кімнати, а потім звільнитися, потім піти і вимити руки, потім піти і витерти руки. Як тільки я знаю, куди йду, Я НАДІСЛУЮ команду почати, і моє тіло вживає заходів.

Що таке очікувані наміри?

Продовжуючи приклад із реального життя, скажімо, що я хочу прийняти душ, але я хочу прийняти душ ПІСЛЯ я чищу зуби і снідаю. Тож я знаю, що не буду приймати душ принаймні 30-40 хвилин. Я все ще маю в голові, що мені потрібно підготувати одяг, а потім піднятися сходами назад до ванної, потім роздягнутись, а потім душа. Однак це не відбудеться, поки не пройде 30-40 хвилин. Тепер я маю намір очікувати прийняття душу. ПОВЕРНЕНО протягом 30-40 хвилин.

Це в значній мірі різниця між наміченим наміром і звичайним наміром. Регулярні наміри можна створювати без наміру, що очікує на розгляд, однак для того, щоб створити наміри, що очікують, спочатку потрібно встановити регулярні наміри.


Мені дуже сподобався простий і приклад, я досить добре зрозумів це словами.
Хосема

Я радий, що цей пост вам корисний Хосема
Нарендра Мотвані

це точно так само, як пояснення Шекіба Айяза вище. хто від кого скопіював? :)
likejudo

5

PendingIntentв основному є об'єктом, який обгортає інший Intentоб’єкт. Потім він може бути переданий в іноземну програму, де ви надаєте цьому додатку право на виконання операції, тобто виконайте намір так, ніби він був виконаний у процесі вашого власного додатка (той же дозвіл та особу). З міркувань безпеки ви завжди повинні передавати явні наміри PendingIntent, а не бути неявними.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

4

Легкою мовою:
1. Опис дії, що спрямовується на ціль та ціль. Спочатку ви повинні створити наміри, а потім вам потрібно передати певний клас Java, який ви хочете виконати, до наміру.
2. Ви можете викликати клас java, який є вашим класом дій класу за допомогою PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) та PendingIntent. getService (Context, int, Intent, int); Тут ви бачите, що Наміри, які походять з кроку 1
3. Ви повинні пам’ятати, що ... Надаючи PendingIntent іншій програмі, ви надаєте йому право виконувати вказану вами операцію.

Про це я дізнався після довгого читання.


3

Очікуючий намір обгортає загальний намір токеном, який ви надаєте іноземному додатку для виконання з вашого дозволу. Наприклад:

Повідомлення про ваш музичний додаток не може відтворювати / призупиняти музику, якщо ви не дали PendingIntentнадіслати трансляцію, оскільки ваш музичний додаток має READ_EXTERNAL_STORAGEдозвіл, якого не має. Повідомлення - це системна послуга (тому це іноземний додаток).


чудовий приклад!
likejudo

2

Як випливає з його назви .. PendingIntent

ви можете підвісити (зробіть це через деякий час). Він працює як інший намір .. це спосіб дати своє завдання якомусь іншому додатку виконувати від вашого імені.


1
Чи можете ви навести для цього приклад із реального життя?
CopsOnRoad

0

Pending Намір визначає дію , яке повинно зробити в майбутньому. Це дозволяє передати майбутній намір в іншу програму і дозволити цій програмі виконувати цей намір так, як ніби він має такі ж дозволи, як і ваша програма, незалежно від того, чи є ваша програма все ще, коли з часом виклик наміру.

Це знак, який ви надаєте іноземній програмі, яка дозволяє іноземній програмі використовувати дозволи вашого додатка для виконання заздалегідь заданого фрагмента коду.

Якщо ви даєте іноземній заяві наміри, і ця програма надсилає / передає наміри, які ви дали, вони виконають Намір з власними дозволами. Але якщо ви натомість надаєте іноземній програмі очікуваний намір, який ви створили за власним дозволом, ця програма виконає вміст, що міститься, використовуючи дозвіл вашої програми.

Щоб виконати трансляцію через очікуваний намір, отримайте PendingIntent через PendingIntent.getBroadcast (). Щоб виконати активність через очікуваний намір, ви отримаєте активність через PendingIntent.getActivity ().

Це наміри, які ви хочете виконати, але в більш пізній час. Подумайте про це, поклавши намір на лід. Причина, яка потрібна, полягає в тому, що наміри потрібно створити та запустити з дійсного контексту у вашій програмі, але є певні випадки, коли один недоступний у той момент, коли ви хочете запустити дію, оскільки технічно виходите за межі контексту програми ( двома поширеними прикладами є запуск діяльності з повідомлення або широкомовного приймача.

Створюючи PendingIntent, який ви хочете використовувати для запуску, скажімо, діяльності, поки у вас є контекст для цього (з іншої діяльності чи служби), ви можете передати цей об’єкт навколо чогось зовнішнього, щоб він запустив частину вашої програми від вашого імені.

Очікуючий вміст надає засоби для роботи додатків навіть після завершення процесу. Важливо зазначити, що навіть після того, як програма, яка створила PendingIntent, була вбита, цей намір все ще може працювати. Опис наміру і цільової дії для виконання з нею. Екземпляри цього класу створюються за допомогою getActivity (Context, int, Intent, int), getBroadcast (Context, int, Intent, int), getService (Context, int, Intent, int); повернутий об'єкт може бути переданий іншим програмам, щоб вони могли пізніше виконати описану вами дію від вашого імені.

Надаючи PendingIntent іншій програмі, ви надаєте йому право виконувати вказану вами операцію так, як ніби іншу програму ви отримали самі (з однаковими дозволами та особою). Таким чином, ви повинні бути обережними щодо того, як ви будуєте PendingIntent: часто, наприклад, базовий намір, який ви надаєте, матиме ім'я компонента, явно встановлене для одного з ваших власних компонентів, щоб переконатися, що воно в кінцевому рахунку надсилається туди і нікуди більше.

Сам PendingIntent - це просто посилання на маркер, який підтримує система, що описує вихідні дані, які використовуються для його отримання. Це означає, що, навіть якщо процес його власної програми буде вбитий, сам PendingIntent залишиться придатним для використання в інших процесах, які йому були надані. Якщо пізніше програма, що створює, знову отримує той самий тип PendingIntent (одна і та ж операція, та сама дія інтенції, дані, категорії та компоненти, і ті ж прапори), він отримає PendingIntent, що представляє той же маркер, якщо це все-таки дійсно, і може таким чином зателефонуйте cancel (), щоб видалити його.


0

Намір у очікуванні - це намір, який надає всі дозволи іншій програмі на виконання певних робіт. Коли основна діяльність знищена, ОС Android повертає дозвіл на неї.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.