Различия между Intent и PendingIntent

Я прочитал некоторые статьи, и оба, похоже, делают одно и то же, и мне было интересно, в чем разница между запуском такого сервиса:

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

или так:

Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

Как я читаю, эти два делают то же самое, если в службе вы возвращаете параметр START_STICKY;

Ответ 1

Намерение

Android Intent - это объект, несущий намерение, то есть сообщение от одного компонента к другому компоненту внутри или снаружи приложения. Умения могут передавать сообщения между любыми тремя основными компонентами приложения - "Действия, службы" и "BroadcastReceivers".

Само намерение, объект Intent, является пассивной структурой данных. Он содержит абстрактное описание выполняемой операции.

Например: скажем, у вас есть Activity, который должен запустить почтовый клиент и отправить электронное письмо. Чтобы сделать это, ваша активность отправит Intent с действием ACTION_SEND вместе с соответствующим выбором в Android Intent Resolver:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

Указанный выбор дает правильный интерфейс для пользователя, чтобы выбрать способ отправки ваших данных электронной почты.

EXPLICIT INTENTS

// Explicit Intent by specifying its class name
   Intent i = new Intent(this, TargetActivity.class);
   i.putExtra("Key1", "ABC");
   i.putExtra("Key2", "123");

// Starts TargetActivity
   startActivity(i);

ВЛИЯНИЕ ЗАЯВЛЕНИЯ

// Implicit Intent by specifying a URI
   Intent i = new Intent(Intent.ACTION_VIEW, 
   Uri.parse("http://www.example.com"));

// Starts Implicit Activity
   startActivity(i); 

Ожидание намерения

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

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

Пример ожидаемого намерения: http://android-pending-intent.blogspot.in/

Источник: Android намерения и Ожидаемые намерения Android

Надеюсь, что это поможет.

Ответ 2

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

Если иностранное приложение отправляет намерение в ваше приложение, означает, что иностранное приложение знает о содержании намерения. и иностранное приложение принимают решение отправить намерение, то ваше приложение должно обработать намерение выполнить некоторые условия = > ваше приложение получит ресурс производительности системы.

Ответ 3

Еще одно простое отличие:

  • Нормальное намерение умрет, как только приложение будет убито.

  • Ожидающие намерения никогда не умирают. Они будут живы до тех пор, пока это необходимо для службы оповещения, службы определения местоположения или любых других услуг.

Ответ 4

Запуск сервисов регулярно с помощью AlarmManager

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

Итак, для правильного планирования службы используйте класс AlarmManager.

UPDATE:

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

Дополнительная информация на AndroidServices.

Ответ 5

Функционально нет разницы.

Значение PendingIntent заключается в том, что вы можете обрабатывать его в другом приложении, которое впоследствии может использовать его, как если бы это было другое приложение. Вот соответствующее объяснение из документации:

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

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

Таким образом, PendingIntent - это просто ссылка на данные, которые представляют собой исходное намерение (которое используется для создания PendingIntent).