Android PendingIntent nedir?


537

Ben Android'e yeni başladım. Android Belgelerini okudum, ancak daha fazla açıklamaya ihtiyacım var. Biri bana tam olarak ne olduğunu söyleyebilir PendingIntentmi?

Yanıtlar:


891

Bir PendingIntentyabancı bir uygulamaya verdikleri bir belirteç (örneğin NotificationManager, AlarmManager, Ana Ekran AppWidgetManagerveya diğer 3. parti uygulamaları), bir kod önceden tanımlanmış bir parça yürütülecek uygulamanın izinlerini kullanmak için yabancı uygulama sağlar .

Yabancı uygulamaya bir Amaç verirseniz, Intentkendi izinlerinizle yürütür . Ancak, yabancı başvuruya a verirseniz PendingIntent, bu başvuru Intentbaşvurunuzun iznini kullanarak yürütür .


3
bildirimler dışında, pendingIntents kullanarak başka nerede gördünüz? Ben sadece bildirimleri kullanmak gördüm ...
android geliştirici

4
@Johnny_D: Bu, genel olarak, bileşen adı açık bir şekilde kendi sınıflarınızdan birine atıfta bulunan mutlak bir ad olan açık bir Niyet oluşturmak istediğiniz anlamına gelir. Aksi takdirde, Amaç başka bir uygulamaya gönderilebilir, bu da bu Amaç uygulamanızın izni altında çalışacağından sorunlara neden olabilir.
Yalan Ryan

3
@LieRyan, uygulama izni burada manifest'te belirttiğimiz izin midir? Örneğin. İNTERNET izni?
Diffy

2
Bu "izinlerin devri" gerçekten güvenlik açısından kötü değil mi? Birkaç izin verdiğim bir A uygulamam var. Sonra çok daha az izin kullanan B uygulaması var. A uygulaması B uygulamasında bir PendingIntent aracılığıyla bir şey başlatabilirse (A'dan gelen tüm izinlerin geçici olarak B'de olmasına izin verirse), B bu izne sahip olan perde arkasında elinden geleni yapamaz mı? Örneğin, A kullanıcının kişilerini okuma iznine sahip olabilir, ancak B sahip değildir. A, B'ye bir PendingIntent gönderirse, B daha sonra kişileri okuyabilir ve kötü amaçlı bir şey yapabilir (sunucuya göndermek gibi).
Tiago

6
@Tiago: Sizin durumunuzda, ayrıcalıklı bir Uygulama A, Uygulama B'ye beklemede olan bir amaç verirse, B'nin bir kişi verisini okumak istediğinde gönderebilmesini sağlar. Kullanıcının B'ye hangi iletişim verilerini vermek istediğini sormak ve yalnızca bu verileri B'ye vermek A'nın sorumluluğundadır. Bekleyen Niyet bir ayrıcalık yükseltme mekanizmasıdır ve tıpkı herhangi bir ayrıcalık yükseltme mekanizması gibi, büyük güçle büyük sorumluluk gelir. B uygulamasının kullanıcının seçtiği iletişim verileri için güvenilir olup olmadığına karar vermek kullanıcının sorumluluğundadır.
Yalan Ryan

48

Bekleyen Niyet, başvuru sürecinizin canlı olup olmadığına bakılmaksızın uygulamalarınız adına bir işlem gerçekleştirmek için bazı uygulamalara verdiğiniz bir simgedir .

Belgelerin yeterince ayrıntılı olduğunu düşünüyorum: Bekleyen Niyet dokümanları .

Bekleyen Amaçlar (Yayınlama Amaçları, programlama alarmları) gibi kullanım örneklerini düşünün ve belgeler daha net ve anlamlı hale gelecektir.


Bence Niyet aynı zamanda bizim uygulama adına bir eylem gerçekleştirmek için başka bir uygulamaya verdiğimiz bir tür belirteç olduğunu düşünüyorum. Yani, Bekleyen bir niyet ile Niyet arasındaki tek fark başvuru sürecimizin ömrüdür?
CopsOnRoad

40

Benim durumumda, yukarıdaki cevapların hiçbiri veya google'ın resmi dokümantasyonuPendingIntent sınıf kavramını almama yardımcı oldu .

Ve sonra bu videoyu buldum, Google I / O 2013, Blue Dot oturumunun ötesinde . Bu videoda eski googler Jaikumar Ganesh ne PendingIntentolduğunu açıklıyor ve bu bana bunun büyük resmini verdi.

Aşağıda, yukarıdaki videonun sadece transkripsiyonudur (15 :24'ten itibaren ).

Bekleyen niyet nedir?

Uygulama işleminizin konum işlemine vereceği bir belirteçtir ve konum işlemi, ilgilenilen bir etkinlik olduğunda uygulamanızı uyandırmak için kullanır . Bu temelde arka plandaki uygulamanızın her zaman çalışması gerekmediği anlamına gelir. İlgilenilen bir şey olduğunda, sizi uyandırırız. Bu çok fazla pil tasarrufu sağlar.

Bu açıklama, oturumun slaydında bulunan bu kod snippet'i ile daha açık hale gelir.

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(...)   
    }
}

Katılıyorum, anlaşılması oldukça basit ve açık. Ancak PendingIntent'in diğer uygulamalara verdiği izin hakkında hiçbir şey söylemiyor.
CopsOnRoad

35

Neden PendingIntent gerekli? Gibi düşünüyordum

  1. Alıcı uygulamanın kendisi neden Intentveya
  2. Neden basit bir Intentşeyi aynı amaçla kullanamayız .

ÖrneğinIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

bluetoothIntentİzni olmayan başka bir uygulamaya gönderirsem android.permission.BLUETOOTH_ADMIN, bu alıcı uygulama ile Bluetooth özelliğini etkinleştiremez startActivity(bluetoothIntent).

Sınırlama kullanılarak aşılabilir PendingIntent. İle PendingIntentalıcı uygulama, gerek yok android.permission.BLUETOOTH_ADMINBluetooth etkinleştirme. Kaynak .


3
BluetoothIntent örneğiniz gerçekten değerlidir. Teşekkürler
Nicks

1
@Kiran - Uygulama alan Bluetooth'u (Bekleyen Niyet kullanarak) açabilirse, bu uygulama neden bu izni Manifest'e dahil etmedi? Arama yapabilen bir uygulama yapıyorum ama CALL_PHONE iznini dahil etmiyorum çünkü başka bir uygulamanın bana bu çağrıyı yapmak için Beklemede Niyet göndermesini istiyorum. Söylemek istediğin bu mu?
CopsOnRoad

1
@CopsOnRoad PendingIntent'in alıcı uygulaması, herhangi bir talebi alan ve istekte bulunan kişi adına isteği yürüten genel bir uygulama olabilir. Rolü sadece orta adam, bu yüzden tüm izinlere sahip değil. Bu tür orta düzey uygulamaların bir örneği, izin alınmadan herhangi bir uygulamayı bir bildirimden başlatabilen bildirim yöneticisidir.
Xiao-Feng Li

21

Bekleyen niyet, gelecekte bir noktada başlayacak olan bir niyettir. Normal amaç startActivity(Intent)veya iletisine geçildiğinde hemen başlar StartService(Intent).


13

Diğer uygulamaların kullanabileceği gelecek niyet.
İşte bir tane oluşturmak için örnek:

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);

8
Downvote çünkü "gelecek" veya diğer uygulamalar tarafından kullanılabilir bir niyet hakkında özel olanı gerçekten açıklamıyorsunuz
Vic

@ WhereDatApp.com Antoine de Saint Exupéry tarafından söylendi ve Lewis Galantière tarafından çevrildi;)
Choletski

@Choletski teşekkürler, Çeviri hakkında bilmiyordum 👍
Oded Breiner

13

TAKSİ ANALOJİSİ

niyet

Amaçlar genellikle Hizmetleri başlatmak için kullanılır. Örneğin:

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

Bu taksi çağırmak gibidir:

Myself = CurrentClass
Taxi Driver = ServiceClass

Bekleyen Niyet

Bunun gibi bir şey kullanmanız gerekecek:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);

Şimdi bu Üçüncü taraf sizin adınıza hareket ederek hizmeti başlatacaktır. Gerçek hayat benzetmesi, her ikisi de taksi şirketi olan Uber veya Lyft'tir.

Sen Uber / Lyft bir yolculuk için istek gönderin. Daha sonra devam edecek ve sürücülerinden birini sizin adınıza arayacaklar.

Bu nedenle:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass

11

PendingIntent, başka bir uygulamaya (örn. Bildirim Yöneticisi, Alarm Yöneticisi veya diğer 3. taraf uygulamalar) verdiğiniz ve bu diğer uygulamanın önceden tanımlanmış bir kod parçası yürütmek için uygulamanızın izinlerini kullanmasına izin veren bir simgedir. Bekleyen bir amaç yoluyla yayın yapmak için PendingIntent.getBroadcast () aracılığıyla bir PendingIntent edinin. Bekleyen bir amaç yoluyla bir etkinlik gerçekleştirmek için etkinliği PendingIntent.getActivity () yoluyla alırsınız.


7

Niyet nedir?

Niyet, Android'de belirli bir şey yapmak için Android işletim sistemine bir komut göndermenizi sağlayan belirli bir komuttur. Bunu gerçekleşmesi gereken bir eylem gibi düşünün. E-posta gönderme, e-postaya fotoğraf ekleme, hatta bir uygulama başlatma gibi birçok işlem yapılabilir. Bir amaç yaratmanın mantıksal iş akışı genellikle aşağıdaki gibidir: a. Niyet Yaratın b. Amaç seçenekleri ekle -> Örn. işletim sistemine ne tür bir niyet gönderdiğimizi ya da bir metin dizesi ya da niyetle birlikte iletilen bir şey gibi bu niyetle ilişkili nitelikleri c. Niyeti ÇALIŞTIR

Gerçek Hayat Örneği: Diyelim ki sabah uyanıyorum ve tuvalete gitmek için “niyet ”im. İlk önce tuvalete gitmeyi düşünmek zorunda kalacağım, ama bu beni gerçekten tuvalete götürmez. Daha sonra beynime önce yataktan kalkmasını, sonra tuvalete gitmeyi ve sonra serbest bırakmayı, sonra gidip ellerimi yıkamamı, sonra gidip ellerimi silmem gerekecek. Nereye gittiğimi bildiğimde, başlama emrini GÖNDERİYORUM ve bedenim harekete geçiyor.

Bekleyen Niyetler Nedir?

Gerçek hayattan örnek olarak, diyelim ki duş almak istiyorum ama dişlerimi fırçalayıp kahvaltı yaptıktan SONRA duş almak istiyorum. En az 30-40 dakikaya kadar duş almayacağımı biliyorum. Hala kafamda kıyafetlerimi hazırlamam gerekiyor, sonra merdivenleri tuvalete geri götürüyorum, sonra soyunup duş alıyorum. Ancak bu, 30-40 dakika geçene kadar gerçekleşmeyecektir. Şimdi duş almak için BEKLENEN bir niyetim var. 30-40 dakika beklemede.

Bekleyen Niyet ile Düzenli Niyet arasındaki fark budur. Bekleyen Niyet olmadan Düzenli Niyetler oluşturulabilir, ancak Bekleyen Niyet oluşturmak için önce bir Normal Niyet kurulumuna sahip olmanız gerekir.


Basit ve örneği gerçekten sevdim, bu kelimelerle oldukça iyi anladım.
Josema

Bu yazının sizin için yararlı olduğuna sevindim Josema
Narendra

bu Shakeeb Ayaz'ın yukarıdaki açıklamasıyla tamamen aynıdır. kim kimden kopyaladı? :)
likejudo

5

PendingIntenttemelde başka bir nesneyi saran bir Intentnesnedir. Daha sonra, bu uygulamaya işlemi gerçekleştirme hakkı tanıdığınız yabancı bir uygulamaya geçilebilir, yani amacı kendi uygulamanızın işleminden (aynı izin ve kimlik) yürütülmüş gibi yürütün. Güvenlik nedenleriyle, her zaman açık niyetleri örtük olmak yerine bir PendingIntent'e iletmelisiniz.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

4

Kolay bir dilde,
1. Gerçekleştirilecek bir Niyet ve Hedef eyleminin açıklaması. Önce bir niyet oluşturmanız ve ardından yürütmek istediğiniz belirli bir java sınıfını Niyet'e iletmeniz gerekir.
2. Sınıf eylem sınıfınız olan java sınıfını PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) ve PendingIntent ile çağırabilirsiniz. getService (Bağlam, int, Amaç, int); Burada adım 1'den gelen
Niyet'i göreceksiniz. Unutmayın ki ... Bir PendingIntent'i başka bir uygulamaya vererek, belirttiğiniz işlemi gerçekleştirme hakkı vermiş olursunuz.

Uzun bir okumadan sonra öğrendim.


3

Bir PendingIntent, genel Niyeti izninizle yürütmek için yabancı uygulamaya verdiğiniz bir jetonla sarar. Örneğin:

Müzik uygulamanızın bildirimi, PendingIntentyayın göndermeye vermediyseniz, müzik uygulamanızın READ_EXTERNAL_STORAGEbildirim uygulamasının izin vermediği için müzik çalamaz / duraklatamaz . Bildirim bir sistem hizmetidir (bu yüzden yabancı bir uygulama).


harika bir örnek!
likejudo

2

Adından da anlaşılacağı gibi .. PendingIntent

Bekleyebilirsiniz (bir süre sonra yapın). Diğer amaç olarak çalışır .. bu sizin adınıza gerçekleştirmek için başka bir uygulamaya görev vermenin bir yoludur.


1
Bunun için gerçek bir hayat örneği verebilir misiniz?
CopsOnRoad

0

Bir Beklemede Niyet belirtir bir eylem gelecekte almaya. Gelecekteki bir Niyeti başka bir uygulamaya geçirmenize ve bu uygulamanın, Niyet nihayet çağrıldığında uygulamanızın hala etrafta olup olmadığına bakılmaksızın, uygulamanızla aynı izinlere sahipmiş gibi bu Niyeti uygulamasına izin verir.

Yabancı bir uygulamanın önceden tanımlanmış bir kod parçasını yürütmek için uygulamanızın izinlerini kullanmasına izin veren bir belirteçtir.

Yabancı uygulamaya bir Niyet verirseniz ve bu uygulama verdiğiniz Niyet'i gönderir / yayınlarsa, Niyeti kendi izinleriyle yürütürler. Ancak bunun yerine yabancı uygulamaya kendi izninizi kullanarak oluşturduğunuz bir Bekleyen Niyet verirseniz, söz konusu uygulama, uygulamanızın iznini kullanarak içerilen Niyeti yürütür.

Bekleyen bir amaç yoluyla yayın yapmak için PendingIntent.getBroadcast () aracılığıyla bir PendingIntent edinin. Bekleyen bir amaç yoluyla bir etkinlik gerçekleştirmek için etkinliği PendingIntent.getActivity () yoluyla alırsınız.

Bu, daha sonra gerçekleştirmek istediğiniz bir Niyet eylemidir. Buz üzerinde bir niyet koymayı düşünün. Gerekli olmasının nedeni, uygulamanızda geçerli bir Bağlamdan bir Amaç oluşturulması ve başlatılması gerektiğidir, ancak teknik olarak uygulamanın bağlamının dışında olduğunuz için (eylemi çalıştırmak istediğiniz sırada bir tanesinin bulunmadığı belirli durumlar vardır ( iki yaygın örnek bir Bildirim veya BroadcastReceiver'dan bir Etkinlik başlatmaktır.

Bağlamınız varken bir Etkinliği başlatmak için kullanmak istediğiniz bir PendingIntent oluşturarak (başka bir Etkinlik veya Hizmetin içinden), uygulamanızın bir bölümünü başlatmak için bu nesneyi harici bir şeye aktarabilirsiniz. sizin adınıza.

Bir PendingIntent, uygulamaların süreçleri çıktıktan sonra bile çalışması için bir araç sağlar. PendingIntent'i oluşturan uygulama öldürüldükten sonra bile, bu Niyet'in hala çalışabileceğini unutmamak önemlidir. Onunla gerçekleştirilecek bir Niyet ve hedef eylem açıklaması. Bu sınıfın örnekleri getActivity (Context, int, Intent, int), getBroadcast (Context, int, Intent, int), getService (Context, int, Intent, int); döndürülen nesne, sizin adınıza tanımladığınız işlemi daha sonra gerçekleştirebilmeleri için diğer uygulamalara teslim edilebilir.

Bir PendingIntent'i başka bir uygulamaya vererek, diğer uygulama kendinizmiş gibi (aynı izinler ve kimlikle) belirttiğiniz işlemi gerçekleştirme hakkını vermiş olursunuz. Bu nedenle, PendingIntent'i nasıl oluşturduğunuz konusunda dikkatli olmalısınız: örneğin, sağladığınız temel Niyet, sonuçta oraya ve başka hiçbir yere gönderilmediğinden emin olmak için bileşen adınız açıkça kendi bileşenlerinizden birine ayarlanacaktır.

Bir PendingIntent'in kendisi, sistem tarafından tutulan ve onu almak için kullanılan orijinal verileri tanımlayan bir token için bir referanstır. Bu, sahip olunan uygulamanın işlemi öldürülse bile, PendingIntent'in kendisinin kendisine verilen diğer işlemlerden kullanılabilir kalacağı anlamına gelir. Oluşturma uygulaması daha sonra aynı tür PendingIntent'i yeniden alırsa (aynı işlem, aynı Niyet eylemi, veriler, kategoriler ve bileşenler ve aynı bayraklar), hala geçerliyse aynı belirteci temsil eden bir PendingIntent alır ve bu nedenle kaldırmak için cancel () öğesini çağırın.


0

Bekleyen Niyet, belirli bir işi yapmak için diğer uygulamalara tüm izni veren bir niyettir. Ana etkinlik yok edildiğinde, Android OS izni geri alır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.