Ответы:
A PendingIntent
- это токен, который вы даете стороннему приложению (например NotificationManager
, AlarmManager
домашнему экрану AppWidgetManager
или другим сторонним приложениям), который позволяет стороннему приложению использовать разрешения вашего приложения для выполнения предопределенного фрагмента кода .
Если вы дадите намерение иностранному приложению, оно будет исполнено Intent
с собственными разрешениями. Но если вы дадите иностранному заявлению a PendingIntent
, это приложение выполнит ваше, Intent
используя разрешение вашего приложения.
Pending Intent - это токен, который вы даете некоторым приложениям для выполнения действий от имени ваших приложений, независимо от того, активен ли ваш процесс приложения или нет.
Я думаю, что документация достаточно подробная: в ожидании документов по намерениям .
Только подумайте о сценариях использования для ожидающих целей, таких как (Broadcasting Intents, планирование аварийных сигналов), и документация станет более понятной и значимой.
В моем случае ни один из приведенных выше ответов, ни официальная документация 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 - это токен, который вы даете другому приложению (например, Notification Manager, Alarm Manager или другим сторонним приложениям), который позволяет этому другому приложению использовать разрешения вашего приложения для выполнения предопределенного фрагмента кода. Чтобы выполнить трансляцию через ожидающее намерение, получите PendingIntent через PendingIntent.getBroadcast (). Чтобы выполнить действие через ожидающее намерение, вы получаете действие через PendingIntent.getActivity ().
Что такое Намерение?
Намерение - это особая команда в Android, которая позволяет отправлять команду ОС Android для выполнения чего-то определенного. Думайте об этом как о действии, которое должно произойти. Существует много действий, таких как отправка электронного письма, прикрепление фотографии к электронному письму или даже запуск приложения. Логический рабочий процесс создания намерения обычно выглядит следующим образом: a. Создать намерение б. Добавить опции Intent -> Ex. какой тип намерения мы отправляем в ОС или какие-либо атрибуты, связанные с этим намерением, такие как текстовая строка или что-то переданное вместе с намерением c. ВЫПОЛНИТЬ Намерение
Пример из реальной жизни: допустим, я просыпаюсь утром и собираюсь пойти в туалет. Сначала я должен подумать о том, чтобы пойти в туалет, но на самом деле это не приводит меня в туалет. Затем мне придется сказать моему мозгу, чтобы он сначала встал с кровати, затем пошел в уборную, а затем отпустил, затем пошел и вымыл мои руки, затем пошел и вытер руки. Как только я знаю, куда я иду, я посылаю команду, и мое тело начинает действовать.
Что такое ожидающие намерения?
Продолжая пример из реальной жизни, скажем, я хочу принять душ, но хочу принять душ ПОСЛЕ того, как я чищу зубы и завтракаю. Так что я знаю, что не буду принимать душ, по крайней мере, до 30-40 минут. У меня все еще есть в голове, что мне нужно подготовить свою одежду, а затем пройти вверх по лестнице обратно в ванную, затем раздеться и затем принять душ. Однако этого не произойдет, пока не пройдет 30-40 минут. Теперь у меня есть намерение принять душ. В ожидании 30-40 минут.
Это в значительной степени разница между ожидающим намерением и обычным намерением. Обычные намерения могут быть созданы без ожидающих намерений, однако, чтобы создать ожидающие намерения, сначала необходимо настроить обычные намерения.
PendingIntent
в основном объект, который оборачивает другой Intent
объект. Затем он может быть передан стороннему приложению, где вы предоставляете этому приложению право на выполнение операции, т.е. выполняете намерение, как если бы оно было выполнено из процесса вашего собственного приложения (то же самое разрешение и идентификация). По соображениям безопасности вы всегда должны передавать явные намерения PendingIntent, а не быть неявными.
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
Простым языком:
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 другому приложению, вы предоставляете ему право выполнять указанную вами операцию.
Это то, что я узнал после долгого чтения.
PendingIntent оборачивает общее намерение токеном, который вы даете иностранному приложению для выполнения с вашего разрешения. Например:
Уведомление вашего музыкального приложения не может воспроизводить / приостанавливать музыку, если вы не дали
PendingIntent
передачу для отправки, потому что у вашего музыкального приложения естьREAD_EXTERNAL_STORAGE
разрешение, которого нет у приложения уведомления. Уведомление - это системный сервис (так что это стороннее приложение).
Как следует из названия .. PendingIntent
Вы можете ожидать (сделать это через некоторое время) это. Это работает как другое намерение .. это способ передать вашу задачу другому приложению для выполнения от вашего имени.
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 (), чтобы удалить его.