Відповіді:
A PendingIntent
- це маркер, який ви надаєте іноземній програмі (наприклад NotificationManager
, AlarmManager
Домашній екран AppWidgetManager
або іншим стороннім додаткам), що дозволяє іноземній програмі використовувати дозволи вашого додатка для виконання заздалегідь заданого фрагмента коду .
Якщо ви даєте іноземній заяві наміри, вона виконає ваші Intent
власні дозволи. Але якщо ви надаєте іноземній заяві a PendingIntent
, ця програма виконає ваше Intent
використання, використовуючи дозвіл вашої програми.
Намір, що очікує, - це маркер, який ви надаєте якійсь програмі для виконання дії від імені ваших програм, незалежно від того, живий процес вашої заявки чи ні.
Я думаю, що документація є достатньо детальною: Документи, що очікують на розгляд .
Подумайте лише про випадки використання для очікуючих намірів, таких як (Інтернети трансляції, тривоги планування), і документація стане більш зрозумілою та значущою.
У моєму випадку жоден з наведених вище відповідей, а також офіційна документація 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? Я думав, як
Intent
абоIntent
для тієї ж мети.НапрIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Якщо я надішлю bluetoothIntent
до іншої програми, яка не має дозволу android.permission.BLUETOOTH_ADMIN
, ця приймаюча програма не може включити Bluetooth за допомогою startActivity(bluetoothIntent)
.
Обмеження долається за допомогою PendingIntent
. У PendingIntent
програмі, що приймає, не потрібно android.permission.BLUETOOTH_ADMIN
ввімкнути Bluetooth. Джерело .
Майбутній намір, який можуть використовувати інші програми.
Ось приклад для створення одного:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
ТАКСИ АНАЛОГІЯ
Намір
Запуски зазвичай використовуються для запуску Сервісів. Наприклад:
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
PendingIntent - це маркер, який ви надаєте іншій програмі (наприклад, диспетчеру повідомлень, диспетчеру сигналів або іншим стороннім додаткам), що дозволяє цій іншій програмі використовувати дозволи вашої програми для виконання заздалегідь заданого фрагмента коду. Щоб виконати трансляцію через очікуваний намір, отримайте PendingIntent через PendingIntent.getBroadcast (). Щоб виконати активність через очікуваний намір, ви отримаєте активність через PendingIntent.getActivity ().
Що таке наміри?
Намір - це певна команда в Android, яка дозволяє відправляти команду в ОС Android, щоб зробити щось конкретне. Подумайте про це як про дію, яка повинна відбутися. Можна здійснити багато дій, таких як надсилання електронного листа або додавання фотографії до електронного листа або навіть запуск програми. Логічний робочий процес створення наміру зазвичай такий: a. Створіть Намір b. Додати опції намірів -> Приклад. який тип намірів ми надсилаємо до ОС або будь-які атрибути, пов’язані з цим наміром, наприклад, текстовий рядок або щось, що передається разом із наміром c. РАЙНУТЬ наміри
Приклад із реального життя: Скажімо, я прокидаюся вранці і я "НАМЕЖАЮ" йти до умивальника. Я спершу повинен подумати про те, щоб піти в туалетну кімнату, але це НЕ насправді забирає мене в туалетну кімнату. Тоді мені доведеться сказати мозку спочатку встати з ліжка, потім піти до умивальної кімнати, а потім звільнитися, потім піти і вимити руки, потім піти і витерти руки. Як тільки я знаю, куди йду, Я НАДІСЛУЮ команду почати, і моє тіло вживає заходів.
Що таке очікувані наміри?
Продовжуючи приклад із реального життя, скажімо, що я хочу прийняти душ, але я хочу прийняти душ ПІСЛЯ я чищу зуби і снідаю. Тож я знаю, що не буду приймати душ принаймні 30-40 хвилин. Я все ще маю в голові, що мені потрібно підготувати одяг, а потім піднятися сходами назад до ванної, потім роздягнутись, а потім душа. Однак це не відбудеться, поки не пройде 30-40 хвилин. Тепер я маю намір очікувати прийняття душу. ПОВЕРНЕНО протягом 30-40 хвилин.
Це в значній мірі різниця між наміченим наміром і звичайним наміром. Регулярні наміри можна створювати без наміру, що очікує на розгляд, однак для того, щоб створити наміри, що очікують, спочатку потрібно встановити регулярні наміри.
PendingIntent
в основному є об'єктом, який обгортає інший Intent
об’єкт. Потім він може бути переданий в іноземну програму, де ви надаєте цьому додатку право на виконання операції, тобто виконайте намір так, ніби він був виконаний у процесі вашого власного додатка (той же дозвіл та особу). З міркувань безпеки ви завжди повинні передавати явні наміри PendingIntent, а не бути неявними.
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
Легкою мовою:
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 іншій програмі, ви надаєте йому право виконувати вказану вами операцію.
Про це я дізнався після довгого читання.
Очікуючий намір обгортає загальний намір токеном, який ви надаєте іноземному додатку для виконання з вашого дозволу. Наприклад:
Повідомлення про ваш музичний додаток не може відтворювати / призупиняти музику, якщо ви не дали
PendingIntent
надіслати трансляцію, оскільки ваш музичний додаток маєREAD_EXTERNAL_STORAGE
дозвіл, якого не має. Повідомлення - це системна послуга (тому це іноземний додаток).
Як випливає з його назви .. PendingIntent
ви можете підвісити (зробіть це через деякий час). Він працює як інший намір .. це спосіб дати своє завдання якомусь іншому додатку виконувати від вашого імені.
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 (), щоб видалити його.