Различия между намерением и 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;

5 ответов


намерение

намерение Android-это объект, несущий намерение, т. е. сообщение от одного компонента к другому компоненту внутри или вне приложения. Intents может передавать сообщения между любым из трех основных компонентов приложения - Activities, Services и BroadcastReceivers.

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

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

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

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

ЯВНЫЕ НАМЕРЕНИЯ

// 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);

неявный Намерения!--12-->

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

// Starts Implicit Activity
   startActivity(i); 

В Ожидании Намерениях

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

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

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

источник : Андроид Намерения и Android В Ожидании Намерения

надеюсь, что это помогает.


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

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


еще один простой отличается тем,

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

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


запуск служб регулярно через AlarmManager

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

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

обновление:

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

более подробная информация AndroidServices.


функционально, нет никакой разницы.

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

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

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

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