Yanıtlar:
Bir PendingIntent
yabancı bir uygulamaya verdikleri bir belirteç (örneğin NotificationManager
, AlarmManager
, Ana Ekran AppWidgetManager
veya 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, Intent
kendi izinlerinizle yürütür . Ancak, yabancı başvuruya a verirseniz PendingIntent
, bu başvuru Intent
başvurunuzun iznini kullanarak yürütür .
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.
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 PendingIntent
olduğ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(...)
}
}
Neden PendingIntent gerekli? Gibi düşünüyordum
Intent
veyaIntent
ş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 PendingIntent
alıcı uygulama, gerek yok android.permission.BLUETOOTH_ADMIN
Bluetooth etkinleştirme. Kaynak .
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);
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
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.
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.
PendingIntent
temelde başka bir nesneyi saran bir Intent
nesnedir. 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);
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.
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,
PendingIntent
yayın göndermeye vermediyseniz, müzik uygulamanızınREAD_EXTERNAL_STORAGE
bildirim uygulamasının izin vermediği için müzik çalamaz / duraklatamaz . Bildirim bir sistem hizmetidir (bu yüzden yabancı bir uygulama).
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.
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.