Jawaban:
A PendingIntent
adalah token yang Anda berikan ke aplikasi asing (mis NotificationManager
. AlarmManager
, Layar Utama AppWidgetManager
, atau aplikasi pihak ketiga lainnya), yang memungkinkan aplikasi asing untuk menggunakan izin aplikasi Anda untuk mengeksekusi sepotong kode yang telah ditentukan .
Jika Anda memberi Intent aplikasi asing, itu akan mengeksekusi Anda Intent
dengan izin sendiri. Tetapi jika Anda memberikan aplikasi asing PendingIntent
, aplikasi itu akan mengeksekusi Anda Intent
menggunakan izin aplikasi Anda.
Intent Pending adalah token yang Anda berikan ke beberapa aplikasi untuk melakukan tindakan atas nama aplikasi Anda terlepas dari apakah proses aplikasi Anda hidup atau tidak.
Saya pikir dokumentasinya cukup terperinci: Pending Intent docs .
Pikirkan saja kasus-kasus penggunaan untuk Pending Intents like (Broadcasting Intents, alarm penjadwalan) dan dokumentasi akan menjadi lebih jelas dan bermakna.
Dalam kasus saya, tidak ada jawaban di atas atau dokumentasi resmi Google yang membantu saya untuk mengambil konsep PendingIntent
kelas.
Dan kemudian saya menemukan video ini, Google I / O 2013, sesi Beyond the Blue Dot . Dalam video ini, mantan googler Jaikumar Ganesh menjelaskan apa PendingIntent
itu, dan hal itulah yang memberi saya gambaran besar tentang ini.
Di bawah ini hanya transkripsi video di atas ( dari 15:24 ).
Jadi apa maksud yang tertunda?
Ini adalah tanda bahwa proses aplikasi Anda akan memberikan kepada proses lokasi, dan proses lokasi akan menggunakannya untuk membangunkan aplikasi Anda ketika suatu peristiwa yang menarik terjadi . Jadi ini pada dasarnya berarti bahwa aplikasi Anda di latar belakang tidak harus selalu berjalan. Ketika sesuatu yang menarik terjadi, kami akan membangunkan Anda. Ini menghemat banyak baterai.
Penjelasan ini menjadi lebih jelas dengan potongan kode ini (yang termasuk dalam slide sesi).
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(...)
}
}
Mengapa PendingIntent diperlukan? Saya sedang berpikir seperti
Intent
atauIntent
untuk tujuan yang sama.MisalnyaIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Jika saya mengirim bluetoothIntent
ke aplikasi lain, yang tidak memiliki izin android.permission.BLUETOOTH_ADMIN
, aplikasi penerima itu tidak dapat mengaktifkan Bluetooth dengan startActivity(bluetoothIntent)
.
Keterbatasan tersebut diatasi dengan menggunakan PendingIntent
. Dengan PendingIntent
aplikasi penerima, tidak perlu android.permission.BLUETOOTH_ADMIN
untuk mengaktifkan Bluetooth. Sumber .
Niat masa depan yang dapat digunakan aplikasi lain.
Dan inilah contoh untuk membuatnya:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
ANALOGI PAJAK
Maksud
Maksud biasanya digunakan untuk memulai Layanan. Sebagai contoh:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);
Ini seperti ketika Anda memanggil taksi:
Myself = CurrentClass
Taxi Driver = ServiceClass
Intent yang tertunda
Anda perlu menggunakan sesuatu seperti ini:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);
Sekarang Pihak Ketiga ini akan memulai layanan yang bertindak atas nama Anda. Analogi kehidupan nyata adalah Uber atau Lyft yang sama-sama perusahaan taksi.
Anda mengirim permintaan tumpangan ke Uber / Lyft. Mereka kemudian akan melanjutkan dan memanggil salah satu driver mereka atas nama Anda.
Karena itu:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
PendingIntent adalah token yang Anda berikan ke aplikasi lain (mis. Manajer Pemberitahuan, Manajer Alarm atau aplikasi pihak ketiga lainnya), yang memungkinkan aplikasi lain ini untuk menggunakan izin aplikasi Anda untuk menjalankan bagian kode yang telah ditentukan. Untuk melakukan siaran melalui niat yang tertunda maka dapatkan PendingIntent melalui PendingIntent.getBroadcast (). Untuk melakukan aktivitas melalui niat yang tertunda Anda menerima aktivitas melalui PendingIntent.getActivity ().
Apa itu Intent?
Intent adalah perintah khusus di Android yang memungkinkan Anda mengirim perintah ke OS Android untuk melakukan sesuatu yang spesifik. Pikirkan itu seperti tindakan yang perlu dilakukan. Ada banyak tindakan yang dapat dilakukan seperti mengirim email, atau melampirkan foto ke email atau bahkan meluncurkan aplikasi. Alur kerja logis untuk membuat maksud biasanya sebagai berikut: a. Buat Intent b. Tambahkan opsi Intent -> Ex. jenis niat apa yang kami kirimkan ke OS atau atribut apa pun yang terkait dengan maksud itu, seperti string teks atau sesuatu yang diteruskan bersama maksud tersebut c. Jalankan Intent
Contoh Kehidupan Nyata: Katakanlah saya bangun di pagi hari dan saya "BERHARAP" untuk pergi ke kamar kecil. Pertama-tama saya harus BERPIKIR tentang pergi ke kamar kecil, tetapi itu TIDAK benar-benar membawa saya ke kamar kecil. Saya kemudian harus memberitahu otak saya untuk keluar dari tempat tidur terlebih dahulu, kemudian berjalan ke kamar mandi, dan kemudian melepaskan, kemudian pergi dan cuci tangan saya, kemudian pergi dan bersihkan tangan saya. Begitu saya tahu ke mana saya akan pergi, KIRIM perintah untuk memulai dan tubuh saya mengambil tindakan.
Apa yang dimaksud dengan Pending Intents?
Melanjutkan dari contoh kehidupan nyata, katakanlah saya ingin mandi tetapi saya ingin mandi SETELAH saya menyikat gigi dan sarapan. Jadi saya tahu saya tidak akan mandi sampai setidaknya 30-40 menit. Masih ada di kepala saya bahwa saya perlu menyiapkan pakaian saya, dan kemudian berjalan menaiki tangga kembali ke kamar mandi, lalu menanggalkan pakaian dan kemudian mandi. Namun ini tidak akan terjadi sampai 30-40 menit telah berlalu. Saya sekarang memiliki niat untuk mandi. PENDINGAN selama 30-40 menit.
Itu adalah perbedaan antara Intent Pending dan Intent Reguler. Maksud Biasa dapat dibuat tanpa Pending Intent, namun untuk membuat Pending Intent Anda harus memiliki pengaturan Intent Biasa terlebih dahulu.
PendingIntent
pada dasarnya adalah objek yang membungkus Intent
objek lain . Kemudian dapat diteruskan ke aplikasi asing di mana Anda memberikan aplikasi itu hak untuk melakukan operasi, yaitu, jalankan maksud seolah-olah itu dieksekusi dari proses aplikasi Anda sendiri (izin dan identitas yang sama). Untuk alasan keamanan, Anda harus selalu menyampaikan maksud eksplisit ke PendingIntent daripada implisit.
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
Dalam bahasa yang mudah,
1. Deskripsi tindakan Maksud dan Sasaran yang harus dilakukan. Pertama, Anda harus membuat maksud dan kemudian Anda harus melewati kelas java tertentu yang ingin Anda jalankan, ke Intent.
2. Anda bisa memanggil kelas-kelas java yang merupakan kelas tindakan kelas Anda dengan PendingIntent.getActivity, PendingIntent.getActivities (Konteks, int, Maksud [], int), PendingIntent.getBroadcast (Konteks, int, Intent, int), dan PendingIntent. getService (Konteks, int, Intent, int); Di sini Anda melihat Intent yang berasal dari langkah 1
3. Anda harus ingat bahwa ... Dengan memberikan PendingIntent ke aplikasi lain, Anda memberikannya hak untuk melakukan operasi yang telah Anda tentukan.
Itulah yang saya pelajari setelah lama membaca.
PendingIntent membungkus Intent umum dengan token yang Anda berikan ke aplikasi asing untuk dieksekusi dengan izin Anda. Untuk misalnya:
Notifikasi aplikasi musik Anda tidak dapat memutar / menjeda musik jika Anda tidak memberikan
PendingIntent
untuk mengirim siaran karena aplikasi musik Anda memilikiREAD_EXTERNAL_STORAGE
izin yang mana aplikasi notifikasi tidak. Notifikasi adalah layanan sistem (jadi ini adalah aplikasi asing).
Seperti namanya .. PendingIntent
Anda dapat menunggu (melakukannya setelah beberapa waktu) itu. Ini berfungsi sebagai maksud lain .. itu adalah cara memberikan tugas Anda ke beberapa aplikasi lain untuk melakukan atas nama Anda.
Sebuah Tertunda Intent menentukan sebuah tindakan untuk mengambil di masa depan. Ini memungkinkan Anda meneruskan Intent di masa mendatang ke aplikasi lain dan memungkinkan aplikasi untuk mengeksekusi Intent itu seolah-olah memiliki izin yang sama dengan aplikasi Anda, apakah aplikasi Anda masih ada atau tidak ketika Intent tersebut pada akhirnya dipanggil.
Ini adalah token yang Anda berikan ke aplikasi asing yang memungkinkan aplikasi asing untuk menggunakan izin aplikasi Anda untuk mengeksekusi sepotong kode yang telah ditentukan.
Jika Anda memberi Intent aplikasi asing, dan aplikasi itu mengirim / menyiarkan Intent yang Anda berikan, mereka akan mengeksekusi Intent dengan izin mereka sendiri. Tetapi jika Anda sebaliknya memberikan Inting Intent pada aplikasi asing yang Anda buat menggunakan izin Anda sendiri, aplikasi itu akan mengeksekusi Intent yang terkandung menggunakan izin aplikasi Anda.
Untuk melakukan siaran melalui niat yang tertunda maka dapatkan PendingIntent melalui PendingIntent.getBroadcast (). Untuk melakukan aktivitas melalui niat yang tertunda Anda menerima aktivitas melalui PendingIntent.getActivity ().
Ini adalah tindakan Intent yang ingin Anda lakukan, tetapi di lain waktu. Anggap saja itu Intent. Alasan diperlukannya adalah karena Intent harus dibuat dan diluncurkan dari Konteks yang valid dalam aplikasi Anda, tetapi ada kasus-kasus tertentu di mana seseorang tidak tersedia pada saat Anda ingin menjalankan tindakan karena Anda secara teknis berada di luar konteks aplikasi (yang dua contoh umum meluncurkan Aktivitas dari Notifikasi atau BroadcastReceiver.
Dengan membuat PendingIntent yang ingin Anda gunakan untuk meluncurkan, katakanlah, suatu Kegiatan saat Anda memiliki Konteks untuk melakukannya (dari dalam Kegiatan atau Layanan lain) Anda dapat meneruskan objek itu ke sesuatu yang eksternal agar dapat meluncurkan bagian dari aplikasi Anda atas nama Anda.
PendingIntent menyediakan sarana bagi aplikasi untuk bekerja, bahkan setelah prosesnya keluar. Penting untuk dicatat bahwa bahkan setelah aplikasi yang menciptakan PendingIntent telah dimatikan, Intent masih dapat berjalan. Deskripsi tujuan dan tindakan target untuk dilakukan dengannya. Contoh kelas ini dibuat dengan getActivity (Konteks, int, Intent, int), getBroadcast (Konteks, int, Intent, int), getService (Konteks, int, Intent, int); objek yang dikembalikan dapat diserahkan ke aplikasi lain sehingga mereka dapat melakukan tindakan yang Anda jelaskan atas nama Anda di lain waktu.
Dengan memberikan PendingIntent ke aplikasi lain, Anda memberikannya hak untuk melakukan operasi yang telah Anda tentukan seolah-olah aplikasi lain itu adalah diri Anda sendiri (dengan izin dan identitas yang sama). Karena itu, Anda harus berhati-hati tentang cara membuat PendingIntent: sering kali, misalnya, basis Intent yang Anda pasok akan menetapkan nama komponen secara eksplisit ke salah satu komponen Anda sendiri, untuk memastikan akhirnya dikirim ke sana dan ke tempat lain.
PendingIntent sendiri hanyalah referensi ke token yang dikelola oleh sistem yang menggambarkan data asli yang digunakan untuk mengambilnya. Ini berarti bahwa, bahkan jika proses aplikasi miliknya dimatikan, PendingIntent itu sendiri akan tetap dapat digunakan dari proses lain yang telah diberikan itu. Jika aplikasi pembuat nanti mengambil kembali jenis PendingIntent yang sama (operasi yang sama, tindakan Intent yang sama, data, kategori, dan komponen, dan bendera yang sama), itu akan menerima PendingIntent yang mewakili token yang sama jika itu masih valid, dan dapat dengan demikian panggilan batal () untuk menghapusnya.