Niyet ve PendingIntent arasındaki farklar


98

Bazı makaleleri okudum ve ikisi de aynı şeyi yapıyor gibi görünüyor ve hizmeti bu şekilde başlatmak arasındaki farkın ne olduğunu merak ediyordum:

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

veya bunun gibi:

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

Okuduğum gibi, bu ikisi aynı şeyi yapıyor, eğer hizmette bir START_STICKY parametresi döndürürseniz;


Fark yok. Olacağını düşündüren nedir? İlk durumda, onu 'şimdi' başlatıyorsunuz ve ikincisinde, daha sonraki bir zaman / veri için planlıyorsunuz.
Squonk

Yanıtlar:


154

Amaç

Bir Android Niyeti, bir amaç taşıyan bir nesnedir, yani bir bileşenden başka bir bileşene, uygulamanın içinde veya dışında bir mesaj. Amaçlar, bir uygulamanın üç temel bileşeninden (Etkinlikler, Hizmetler ve Yayın Alıcılar) herhangi biri arasında mesajlar iletebilir.

Niyetin kendisi, bir Amaç nesnesi, pasif bir veri yapısıdır. Gerçekleştirilecek bir işlemin özet bir tanımını içerir.

Örneğin: bir e-posta istemcisi başlatması ve bir e-posta göndermesi gereken bir Etkinliğiniz olduğunu varsayalım. Bunu yapmak için Etkinliğiniz ACTION_SEND, uygun seçiciyle birlikte eylemle birlikte Android Intent Resolver'a bir Niyet gönderir :

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

Belirtilen seçici, kullanıcının e-posta verilerinizi nasıl göndereceğini seçmesi için uygun arayüzü sağlar.

AÇIKLAMA AMAÇLARI

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

İMPLİK NEDENLERİ

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

// Starts Implicit Activity
   startActivity(i); 

Bekleyen Niyet

Bir PendingIntent, yabancı bir uygulamaya (örneğin, NotificationManager, AlarmManager, Home Screen AppWidgetManager veya diğer 3. taraf uygulamaları) verdiğiniz ve yabancı 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 .

Başka bir uygulamaya bir PendingIntent vererek, ona belirttiğiniz işlemi diğer uygulama kendinizmiş gibi (aynı izin ve kimlikle) gerçekleştirme hakkını vermiş olursunuz. Bu nedenle, PendingIntent'i nasıl oluşturduğunuz konusunda dikkatli olmalısınız: neredeyse her zaman, örneğin, sağladığınız temel Amaç bileşen adı, sonuçta oraya gönderilmesini ve başka hiçbir yere gönderilmemesini sağlamak için açıkça kendi bileşenlerinizden birine ayarlanmış olmalıdır.

Bekleyen Amaç Örneği: http://android-pending-intent.blogspot.in/

Kaynak: Android Amaçları ve Android Bekleyen Amaçları

Bu yardımcı olur umarım.


26

PendingIntentbir paketleyicidir Intent. PendingIntentİçeriğini alan yabancı uygulama , Intenthangi içeriğin kapsadığını bilmiyor PendingIntent. Yabancı uygulamanın misyonu, bazı koşullar karşılandığında niyeti sahibine geri göndermektir (Örneğin: programlı alarm veya tıklama ile bildirim). Koşullar sahibi tarafından verilir ancak yabancı uygulama tarafından işlenir (Örneğin: alarm, bildirim).

Yabancı uygulama, uygulamanıza niyet gönderdiyse, yabancı uygulamanın amacın içeriğini bildiği anlamına gelir. ve yabancı uygulama niyet gönderme kararı verir, ardından uygulamanız bazı koşulları karşılamak için niyeti işlemelidir => uygulamanız sistemin performans kaynağını alır.


5

Başka bir basit fark:

  • Uygulama öldürüldüğünde normal niyet ölür.

  • Bekleyen niyetler asla ölmez. Alarm servisi, konum servisi veya diğer servisler tarafından ihtiyaç duyulduğu sürece hayatta kalacaklar.


1

AlarmManager aracılığıyla hizmetleri düzenli olarak başlatma

Aktivitelerde olduğu gibi, Android sistemi kaynakları korumak için herhangi bir zamanda bir hizmet sürecini sonlandırabilir. Bu nedenle TimerTask, düzenli olarak yürütüldüğünden emin olmak için hizmette a kullanamazsınız .

Bu nedenle, Hizmetin doğru planlanması için AlarmManagersınıfı kullanın .

GÜNCELLEME:

Yani ikisi arasında gerçek bir fark yok. Ama hizmetin yürütülmesini sağlamak isteyip istemediğinize bağlı olarak, ne gibi kullanmaya karar verebilir eski konusunda hiçbir garanti yoktur ve için sonradan öyle.

AndroidServices'te daha fazla bilgi .


2
Bu aslında OP'nin bir hizmeti doğrudan başlatma ile bir hizmeti bir alarmla başlatma arasındaki "fark nedir" sorusuna cevap vermez. Ayrıca OP, muhtemelen bağlantı kurduğunuz makaleyi görmüştür, çünkü makaledeki kod, OP'nin yayınladıklarıyla neredeyse aynıdır.
Squonk

AlarmManager'dan bir hizmet başlatmanın daha güvenli olduğunu ve bir faaliyetten daha az öldürülme olasılığının daha düşük olduğunu mu söylüyorsunuz? Ben yanlış olduğunu düşünüyorum. Açıklayabilir misin. @Evleneceksen Dahası, hizmeti başlatmak için bir niyet oluştururken geçirdiğiniz bağlamın daha önemli olduğunu düşünüyorum. Bir etkinlikten (bu) ziyade uygulamanın bağlamını (getApplicationContext ()) kullanmak daha güvenli olmalıdır.
Parth Kapoor

@ Eu.Dr. X ... görevi her yürüttüğünde tetiklenecek olan alarm yöneticisini kullanmanızı tavsiye ederim .. Neden? çünkü hizmetleri kullanıyorsanız, bir noktada kapalı olabilir ve belirli bir zamanda bazı güncellemeleri atlayabilirsiniz (bilinmeyen). Bağlamdan şüphe getApplicationContext()duymak için, kesinlikle istediğiniz zaman kullanmayın veya kullanmayın, sadece - when-to-call-activity-context-or-application-context ( stackoverflow.com/questions/7298731/… ) okuyun.
My God

1

İşlevsel olarak hiçbir fark yoktur.

PendingIntent'in anlamı, onu daha sonra diğer uygulama kendinizmiş gibi kullanabileceğiniz başka bir uygulamaya aktarabilmenizdir. Dokümantasyondaki ilgili açıklama :

Başka bir uygulamaya bir PendingIntent vererek, ona belirttiğiniz işlemi diğer uygulama kendinizmiş gibi (aynı izin ve kimlikle) gerçekleştirme hakkını vermiş olursunuz. Bu nedenle, PendingIntent'i nasıl oluşturduğunuz konusunda dikkatli olmalısınız: neredeyse her zaman, örneğin, sağladığınız temel Amaç bileşen adı, sonuçta oraya gönderilmesini ve başka hiçbir yere gönderilmemesini sağlamak için açıkça kendi bileşenlerinizden birine ayarlanmış olmalıdır.

Bir PendingIntent'in kendisi, onu almak için kullanılan orijinal verileri açıklayan sistem tarafından tutulan bir belirteç için bir referanstır.

Dolayısıyla PendingIntent, orijinal Niyeti (PendingIntent'i oluşturmak için kullanılan) temsil eden verilere yalnızca bir referanstır.


4
İşlevsel olarak bir fark olmadığını söylemek yanlıştır. Her ikisinin de fonksiyonları aynıysa neden iki tane 1. sırada olsun? PendingIntent'teki en önemli fark, onu teslim eden bileşenin izinleriyle (bildirimi oluşturan) aynı izinlere sahip uzak bileşen (NotificationManager gibi) tarafından yürütülür.
Aniket Thakur
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.