Что такое Android PendingIntent?

538

Я новичок в Android. Я прочитал документацию по Android, но мне все еще нужны некоторые разъяснения. Может кто-нибудь сказать мне, что именно PendingIntent?

Ракеш
источник

Ответы:

892

A PendingIntent- это токен, который вы даете стороннему приложению (например NotificationManager, AlarmManagerдомашнему экрану AppWidgetManagerили другим сторонним приложениям), который позволяет стороннему приложению использовать разрешения вашего приложения для выполнения предопределенного фрагмента кода .

Если вы дадите намерение иностранному приложению, оно будет исполнено Intentс собственными разрешениями. Но если вы дадите иностранному заявлению a PendingIntent, это приложение выполнит ваше, Intentиспользуя разрешение вашего приложения.

Ли Райан
источник
3
кроме уведомлений, где еще вы видели использование pendingIntents? Я думаю, что видел только уведомления использовать его ...
Android-разработчик
4
@Johnny_D: это означает, что он говорит, в общем, вы хотели бы создать явное намерение, чье имя компонента является абсолютным именем, которое однозначно ссылается на один из ваших собственных классов. В противном случае Намерение может быть отправлено в другое приложение, что может вызвать проблемы, поскольку оно будет запущено с разрешения вашего приложения.
Ложь Райан
3
@LieRyan, разрешение приложения - это разрешение, которое мы указываем в манифесте? Например. Интернет-разрешение?
Диффи
2
Разве эта «передача полномочий» не слишком плоха с точки зрения безопасности? У меня есть приложение А, которое я дал несколько разрешений. Тогда у меня есть приложение B, которое использует гораздо меньше разрешений. Если приложение A может запустить что-то в приложении B через PendingIntent (позволяя временно разрешить всем разрешениям от A быть на B), не может ли B сделать все возможное за кулисами с этим разрешением? Например, A может иметь разрешение на чтение контактов пользователя, а B - нет. Если A отправляет PendingIntent B, B может затем прочитать контакты и сделать что-то вредоносное (например, отправить его на сервер).
Тиаго
6
@Tiago: В вашем случае, если привилегированное Приложение A дает Приложению B ожидающее намерение, чтобы B мог отправить его, когда захочет прочитать контактные данные. Ответственность A состоит в том, чтобы спросить пользователя, какие контактные данные пользователь хочет предоставить B, и предоставить B только эти данные. Pending Intent - это механизм повышения привилегий, и, как и любой механизм повышения привилегий, с большой властью приходит большая ответственность. Пользователь несет ответственность за решение, является ли приложение B надежным для контактных данных, выбранных пользователем.
Ли Райан
48

Pending Intent - это токен, который вы даете некоторым приложениям для выполнения действий от имени ваших приложений, независимо от того, активен ли ваш процесс приложения или нет.

Я думаю, что документация достаточно подробная: в ожидании документов по намерениям .

Только подумайте о сценариях использования для ожидающих целей, таких как (Broadcasting Intents, планирование аварийных сигналов), и документация станет более понятной и значимой.

Samuh
источник
Я думаю, что Intent также является своего рода токеном, который мы даем другому приложению для выполнения действий от его имени. Итак, единственная разница между ожидающим намерением и намерением - это срок службы нашего приложения?
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_ADMINBluetooth. Источник .

Киран
источник
3
Ваш пример BluetoothIntent действительно ценен. Спасибо
Никс
1
@Kiran - Если принимающее приложение может включить Bluetooth (используя Pending Intent), то почему это приложение не включило это разрешение в свой манифест? Как будто я делаю приложение, которое может сделать вызов, но я не включаю разрешение 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
Даунвот, потому что вы на самом деле не объясняете, что особенного в намерении, которое является «будущим» или может использоваться другими приложениями
Вик
@ WhereDatApp.com это было сказано Антуаном де Сент-Экзюпери и переведено Льюисом Галантьером;)
Холецки
@Choletski спасибо, я не знал о переводе 👍
Одед Брейнер
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 - это токен, который вы даете другому приложению (например, Notification Manager, Alarm Manager или другим сторонним приложениям), который позволяет этому другому приложению использовать разрешения вашего приложения для выполнения предопределенного фрагмента кода. Чтобы выполнить трансляцию через ожидающее намерение, получите PendingIntent через PendingIntent.getBroadcast (). Чтобы выполнить действие через ожидающее намерение, вы получаете действие через PendingIntent.getActivity ().

srinu
источник
7

Что такое Намерение?

Намерение - это особая команда в Android, которая позволяет отправлять команду ОС Android для выполнения чего-то определенного. Думайте об этом как о действии, которое должно произойти. Существует много действий, таких как отправка электронного письма, прикрепление фотографии к электронному письму или даже запуск приложения. Логический рабочий процесс создания намерения обычно выглядит следующим образом: a. Создать намерение б. Добавить опции Intent -> Ex. какой тип намерения мы отправляем в ОС или какие-либо атрибуты, связанные с этим намерением, такие как текстовая строка или что-то переданное вместе с намерением c. ВЫПОЛНИТЬ Намерение

Пример из реальной жизни: допустим, я просыпаюсь утром и собираюсь пойти в туалет. Сначала я должен подумать о том, чтобы пойти в туалет, но на самом деле это не приводит меня в туалет. Затем мне придется сказать моему мозгу, чтобы он сначала встал с кровати, затем пошел в уборную, а затем отпустил, затем пошел и вымыл мои руки, затем пошел и вытер руки. Как только я знаю, куда я иду, я посылаю команду, и мое тело начинает действовать.

Что такое ожидающие намерения?

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

Это в значительной степени разница между ожидающим намерением и обычным намерением. Обычные намерения могут быть созданы без ожидающих намерений, однако, чтобы создать ожидающие намерения, сначала необходимо настроить обычные намерения.

Нарендра Мотвани
источник
Мне очень понравился простой и пример, я очень хорошо понял это с этими словами.
Хосема
Я рад, что этот пост полезен для вас, Джозема
Нарендра Мотвани
это точно так же, как объяснение Shakeeb Ayaz выше. кто с кого копировал? :)
likejudo
5

PendingIntentв основном объект, который оборачивает другой Intentобъект. Затем он может быть передан стороннему приложению, где вы предоставляете этому приложению право на выполнение операции, т.е. выполняете намерение, как если бы оно было выполнено из процесса вашего собственного приложения (то же самое разрешение и идентификация). По соображениям безопасности вы всегда должны передавать явные намерения PendingIntent, а не быть неявными.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
Гаутам Субраманиам
источник
4

Простым языком:
1. Описание намерения и целевого действия, которое нужно выполнить. Сначала вы должны создать намерение, а затем передать конкретный Java-класс, который вы хотите выполнить, в Intent.
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 оборачивает общее намерение токеном, который вы даете иностранному приложению для выполнения с вашего разрешения. Например:

Уведомление вашего музыкального приложения не может воспроизводить / приостанавливать музыку, если вы не дали PendingIntentпередачу для отправки, потому что у вашего музыкального приложения есть READ_EXTERNAL_STORAGEразрешение, которого нет у приложения уведомления. Уведомление - это системный сервис (так что это стороннее приложение).

Ашиш Рават
источник
отличный пример!
likejudo
2

Как следует из названия .. PendingIntent

Вы можете ожидать (сделать это через некоторое время) это. Это работает как другое намерение .. это способ передать вашу задачу другому приложению для выполнения от вашего имени.

Zar E Ahmer
источник
1
Можете ли вы привести пример из реальной жизни для этого?
CopsOnRoad
0

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

Это маркер, который вы даете стороннему приложению, которое позволяет стороннему приложению использовать разрешения вашего приложения для выполнения предопределенного фрагмента кода.

Если вы даете иностранному приложению намерение, и это приложение отправляет / передает заданное вами намерение, оно выполнит намерение со своими собственными разрешениями. Но если вместо этого вы дадите иностранному приложению ожидающее намерение, которое вы создали, используя свое собственное разрешение, то это приложение выполнит содержащееся намерение, используя разрешение вашего приложения.

Чтобы выполнить трансляцию через ожидающее намерение, получите PendingIntent через PendingIntent.getBroadcast (). Чтобы выполнить действие через ожидающее намерение, вы получаете действие через PendingIntent.getActivity ().

Это намеренное действие, которое вы хотите выполнить, но позже. Подумайте о том, чтобы поставить Намерение на лед. Причина, по которой это необходимо, заключается в том, что намерение должно быть создано и запущено из допустимого контекста в вашем приложении, но в некоторых случаях оно недоступно в то время, когда вы хотите выполнить действие, поскольку технически вы находитесь вне контекста приложения ( два распространенных примера - запуск действия из уведомления или BroadcastReceiver.

Создав PendingIntent, который вы хотите использовать для запуска, скажем, Activity, когда у вас есть для этого Контекст (из другой Activity или Service), вы можете передать этот объект чему-то внешнему, чтобы он мог запустить часть вашего приложения. от вашего имени.

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

Передав PendingIntent другому приложению, вы предоставляете ему право выполнять указанную вами операцию, как если бы другое приложение было вами (с теми же разрешениями и идентификацией). Таким образом, вы должны быть осторожны с тем, как вы строите PendingIntent: часто, например, для базового Intent, который вы предоставляете, имя компонента будет явно установлено на один из ваших собственных компонентов, чтобы гарантировать, что оно в конечном итоге будет отправлено туда и никуда.

Сам PendingIntent - это просто ссылка на токен, поддерживаемый системой, описывающий исходные данные, используемые для его получения. Это означает, что, даже если процесс принадлежащего ему приложения будет уничтожен, сам PendingIntent останется пригодным для использования другими процессами, которым он был предоставлен. Если создавшее приложение позже повторно извлекает тот же тип PendingIntent (та же операция, то же действие Intent, данные, категории и компоненты и те же флаги), оно получит PendingIntent, представляющий тот же токен, если он все еще действителен, и может таким образом, вызовите метод cancel (), чтобы удалить его.

vikseln
источник
0

Pending Intent - это намерение, которое предоставляет все разрешения другому приложению для выполнения определенных работ. Когда основное действие уничтожено, ОС Android забирает разрешение у него.

Neimer
источник