Perbedaan antara Intent dan PendingIntent

97

Saya membaca beberapa artikel dan keduanya tampaknya melakukan hal yang sama dan saya bertanya-tanya apa perbedaan antara memulai layanan seperti itu:

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

atau seperti itu:

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

Saat saya membaca, keduanya melakukan hal yang sama, jika dalam layanan Anda mengembalikan parameter START_STICKY;

pengguna3629316
sumber
Tidak ada bedanya. Apa yang membuatmu berpikir akan ada? Dalam kasus pertama Anda memulainya 'sekarang' dan dalam kasus kedua Anda hanya menjadwalkannya untuk waktu / data nanti.
Squonk
Kemungkinan duplikat dari What is an Android PendingIntent?
James Moore

Jawaban:

151

Maksud

Android Intent adalah objek yang membawa maksud, yaitu pesan dari satu komponen ke komponen lain baik di dalam atau di luar aplikasi. Maksud dapat mengkomunikasikan pesan di antara salah satu dari tiga komponen inti aplikasi - Aktivitas, Layanan, dan BroadcastReceivers.

Maksud itu sendiri, objek Intent, adalah struktur data pasif. Ini memegang deskripsi abstrak dari operasi yang akan dilakukan.

Misalnya: Anda memiliki Aktivitas yang perlu meluncurkan klien email dan mengirim email. Untuk melakukan ini, Aktivitas Anda akan mengirimkan Intent dengan tindakan ACTION_SEND, bersama dengan pemilih yang sesuai, ke Android Intent Resolver:

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

Pemilih yang ditentukan memberikan antarmuka yang tepat bagi pengguna untuk memilih cara mengirim data email Anda.

MAKSUD EKSPLISIT

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

MAKSUD IMPLISIT

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

// Starts Implicit Activity
   startActivity(i); 

Maksud Tertunda

PendingIntent adalah token yang Anda berikan ke aplikasi asing (mis. NotificationManager, AlarmManager, Home Screen AppWidgetManager, atau aplikasi pihak ketiga lainnya), yang memungkinkan aplikasi asing untuk menggunakan izin aplikasi Anda untuk mengeksekusi potongan kode yang telah ditentukan.

Dengan memberikan PendingIntent ke aplikasi lain, Anda memberinya hak untuk melakukan operasi yang telah Anda tentukan seolah-olah aplikasi lain itu adalah Anda sendiri (dengan izin dan identitas yang sama). Karena itu, Anda harus berhati-hati tentang cara membuat PendingIntent: hampir selalu, misalnya, Intent dasar yang Anda berikan harus memiliki nama komponen yang ditetapkan secara eksplisit ke salah satu komponen Anda sendiri, untuk memastikannya pada akhirnya dikirim ke sana dan tidak ke tempat lain.

Contoh untuk Pending Intent: http://android-pending-intent.blogspot.in/

Sumber: Maksud Android dan Maksud Tertunda Android

Semoga ini membantu.

Siddharth_Vyas
sumber
26

PendingIntentadalah pembungkus Intent. Aplikasi asing yang menerima PendingIntent, tidak tahu konten Intentyang dibungkusnya PendingIntent. Misi aplikasi asing adalah mengirimkan kembali maksud ke pemilik ketika beberapa kondisi terpenuhi (Misalnya: alarm dengan jadwal, atau pemberitahuan dengan klik ...). Ketentuan diberikan oleh pemilik tetapi diproses oleh aplikasi asing (Misalnya: alarm, notifikasi).

Jika aplikasi asing mengirimkan maksud ke aplikasi Anda, berarti aplikasi asing tersebut tahu tentang konten maksud tersebut. dan aplikasi asing membuat keputusan untuk mengirim maksud maka aplikasi Anda harus memproses maksud untuk memenuhi beberapa kondisi => aplikasi Anda mendapatkan sumber daya kinerja sistem.

HungNM2
sumber
5

Perbedaan sederhana lainnya:

  • Niat normal akan segera mati setelah aplikasi dimatikan.

  • Niat yang menunggu keputusan tidak pernah mati. Mereka akan hidup selama dibutuhkan oleh layanan alarm, layanan lokasi, atau layanan lainnya.

Zumry Mohamed
sumber
1

Memulai layanan secara teratur melalui AlarmManager

Seperti halnya aktivitas, sistem Android dapat menghentikan proses layanan kapan saja untuk menghemat sumber daya. Karena alasan ini, Anda tidak bisa begitu saja menggunakan a TimerTaskdalam layanan untuk memastikan bahwa itu dijalankan secara teratur.

Jadi, untuk penjadwalan Layanan yang benar gunakan AlarmManagerkelas.

MEMPERBARUI:

Jadi sebenarnya tidak ada perbedaan antara keduanya. Tetapi tergantung pada apakah Anda ingin memastikan pelaksanaan layanan atau tidak, Anda dapat memutuskan apa yang akan digunakan karena untuk yang pertama tidak ada jaminan dan untuk yang selanjutnya .

Info selengkapnya di AndroidServices .

Tuhanku
sumber
2
Ini sebenarnya tidak menjawab pertanyaan OP yaitu "apa perbedaan" antara memulai layanan secara langsung dan memulai layanan dengan alarm. Juga OP mungkin telah melihat artikel yang Anda tautkan karena kode dalam artikel tersebut hampir identik dengan apa yang telah diposting OP.
Squonk
Apakah maksud Anda memulai layanan dari AlarmManager lebih aman, dan lebih kecil kemungkinannya untuk dibunuh daripada dari suatu aktivitas? Saya pikir itu salah. Bisakah Anda jelaskan. @Bayu_joo Terlebih lagi, menurut saya konteks yang Anda teruskan saat membuat maksud untuk memulai layanan lebih penting. Menggunakan konteks aplikasi (getApplicationContext ()) daripada aktivitas (this), seharusnya lebih aman.
Parth Kapoor
@ Eu.D. Saya menyarankan Anda untuk menggunakan manajer alarm yang akan terpicu setiap kali X ... menjalankan tugas .. Mengapa? karena jika Anda menggunakan layanan, mungkin ditutup di beberapa titik dan Anda mungkin akan melewatkan beberapa pembaruan pada waktu tertentu (tidak diketahui). Untuk keraguan konteks, jangan pernah menggunakan getApplicationContext()atau menggunakannya saat Anda benar-benar menginginkannya, cukup baca - kapan-untuk-memanggil-aktivitas-konteks-atau-konteks aplikasi ( stackoverflow.com/questions/7298731/… ).
Ya Tuhan
1

Secara fungsional tidak ada perbedaan.

Arti dari PendingIntent adalah, Anda bisa menanganinya ke aplikasi lain yang nantinya bisa menggunakannya seolah-olah aplikasi lain itu sendiri. Berikut penjelasan terkait dari dokumentasi :

Dengan memberikan PendingIntent ke aplikasi lain, Anda memberinya hak untuk melakukan operasi yang telah Anda tentukan seolah-olah aplikasi lain itu adalah Anda sendiri (dengan izin dan identitas yang sama). Karena itu, Anda harus berhati-hati tentang cara membuat PendingIntent: hampir selalu, misalnya, Intent dasar yang Anda berikan harus memiliki nama komponen yang ditetapkan secara eksplisit ke salah satu komponen Anda sendiri, untuk memastikannya pada akhirnya dikirim ke sana dan tidak ke tempat lain.

PendingIntent itu sendiri hanyalah referensi ke token yang dikelola oleh sistem yang menjelaskan data asli yang digunakan untuk mengambilnya.

Jadi PendingIntent hanyalah referensi ke data yang mewakili Intent asli (yang digunakan untuk membuat PendingIntent).

kupsef
sumber
4
Mengatakan tidak ada perbedaan secara fungsional adalah salah. Jika fungsi keduanya sama lalu mengapa memiliki dua di tempat pertama? Perbedaan paling penting dalam PendingIntent itu dijalankan oleh komponen jarak jauh (Seperti NotificationManager) dengan izin yang sama seperti yang ada pada komponen yang menyerahkannya (Yang membuat notifikasi).
Aniket Thakur