Apa itu Android PendingIntent?

538

Saya seorang pemula untuk Android. Saya membaca Dokumentasi Android tetapi saya masih membutuhkan klarifikasi lagi. Adakah yang bisa memberi tahu saya apa itu sebenarnya PendingIntent?

Rakesh
sumber

Jawaban:

892

A PendingIntentadalah 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 Intentdengan izin sendiri. Tetapi jika Anda memberikan aplikasi asing PendingIntent, aplikasi itu akan mengeksekusi Anda Intentmenggunakan izin aplikasi Anda.

Lie Ryan
sumber
3
kecuali untuk notifikasi, di mana lagi Anda melihat menggunakan pendingIntents? Saya rasa saya hanya melihat notifikasi yang menggunakannya ...
pengembang android
4
@Johnny_D: artinya apa yang dikatakannya, secara umum, Anda ingin membuat Intent eksplisit yang nama komponennya adalah nama absolut yang jelas merujuk ke salah satu kelas Anda sendiri. Jika tidak, Intent dapat dikirim ke aplikasi lain, yang dapat menyebabkan masalah karena Intent itu akan berjalan di bawah izin aplikasi Anda.
Lie Ryan
3
@ LieRyan, apakah izin aplikasi di sini adalah izin yang kami tentukan dalam manifes? Misalnya. Izin INTERNET?
Diffy
2
Bukankah "penyerahan izin" ini benar-benar buruk dari sisi keamanan? Saya memiliki aplikasi A yang saya berikan beberapa izin. Lalu saya punya aplikasi B yang menggunakan izin jauh lebih sedikit. Jika aplikasi A dapat memulai sesuatu di aplikasi B melalui PendingIntent (mengizinkan semua izin dari A untuk berada di B sementara), tidak bisakah B melakukan apa pun di balik layar dengan izin itu? Misalnya, A mungkin memiliki izin untuk membaca kontak pengguna tetapi B tidak. Jika A mengirimkan PendingIntent ke B, B kemudian dapat membaca kontak dan melakukan sesuatu yang berbahaya (seperti mengirimnya ke server).
Tiago
6
@Tiago: Dalam kasus Anda, jika Aplikasi A yang istimewa memberi niat tertunda pada Aplikasi B sehingga B dapat mengirimkannya ketika ia ingin membaca data kontak. Merupakan tanggung jawab A untuk menanyakan kepada pengguna data kontak mana yang ingin diberikan oleh pengguna kepada B, dan hanya memberikan B data tersebut. Pending Intent adalah mekanisme eskalasi hak istimewa, dan sama seperti mekanisme eskalasi hak istimewa lainnya, dengan kekuatan besar datang tanggung jawab besar. Pengguna bertanggung jawab untuk memutuskan apakah aplikasi B dapat dipercaya untuk data kontak yang dipilih pengguna.
Lie Ryan
48

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.

Samuh
sumber
Saya pikir Intent juga semacam token yang kami berikan kepada beberapa aplikasi lain untuk melakukan tindakan atas nama aplikasi kami. Jadi, satu-satunya perbedaan antara Pending intent dan Intent adalah kehidupan proses aplikasi kami?
CopsOnRoad
40

Dalam kasus saya, tidak ada jawaban di atas atau dokumentasi resmi Google yang membantu saya untuk mengambil konsep PendingIntentkelas.

Dan kemudian saya menemukan video ini, Google I / O 2013, sesi Beyond the Blue Dot . Dalam video ini, mantan googler Jaikumar Ganesh menjelaskan apa PendingIntentitu, 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(...)   
    }
}
김준호
sumber
Setuju, itu cukup sederhana dan jelas untuk dipahami. Tapi itu tidak memberi tahu kami apa pun tentang izin yang diberikan PendingIntent ke aplikasi lain.
CopsOnRoad
35

Mengapa PendingIntent diperlukan? Saya sedang berpikir seperti

  1. Mengapa aplikasi penerima itu sendiri tidak dapat membuat Intentatau
  2. Mengapa kita tidak dapat menggunakan yang sederhana Intentuntuk tujuan yang sama.

MisalnyaIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Jika saya mengirim bluetoothIntentke 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 PendingIntentaplikasi penerima, tidak perlu android.permission.BLUETOOTH_ADMINuntuk mengaktifkan Bluetooth. Sumber .

Kiran
sumber
3
Contoh BluetoothIntent Anda sangat berharga. Terima kasih
Nicks
1
@Kiran - Jika menerima aplikasi dapat mengaktifkan Bluetooth (menggunakan Pending Intent) lalu mengapa aplikasi itu tidak memasukkan izin ini dalam Manifesnya? Sepertinya saya membuat aplikasi yang dapat melakukan panggilan tetapi saya tidak menyertakan izin CALL_PHONE karena saya ingin aplikasi lain mengirimi saya Pending Intent untuk melakukan panggilan ini. Apakah ini yang ingin Anda katakan?
CopsOnRoad
1
@CopsOnRoad Aplikasi penerima PendingIntent dapat berupa aplikasi umum yang menerima permintaan apa pun dan menjalankan permintaan atas nama pemohon. Perannya hanyalah perantara, karenanya tidak memiliki semua izin. Contoh jenis aplikasi perantara ini adalah manajer notifikasi, yang dapat meluncurkan aplikasi apa pun yang dimaksudkan dari pemberitahuan, tanpa memiliki izin.
Xiao-Feng Li
21

Niat yang tertunda adalah niat yang akan mulai di beberapa titik di masa depan. Niat normal dimulai segera ketika dilewatkan ke startActivity(Intent)atau StartService(Intent).

Arun P
sumber
13

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);
Oded Breiner
sumber
8
Tunduk karena Anda tidak benar-benar menjelaskan apa yang istimewa tentang maksud yang "masa depan" atau dapat digunakan oleh aplikasi lain
Vic
@ WhereDatApp.com dikatakan oleh Antoine de Saint Exupéry dan diterjemahkan oleh Lewis Galantière;)
Choletski
@Choletski terima kasih, saya tidak tahu tentang terjemahan 👍
Oded Breiner
13

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
TABUT
sumber
11

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

srinu
sumber
7

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.

Narendra Motwani
sumber
Saya sangat menyukai contoh sederhana dan contohnya, saya memahaminya dengan cukup baik dengan kata-kata itu.
Josema
Saya senang bahwa posting ini bermanfaat bagi Anda Josema
Narendra Motwani
ini persis sama dengan penjelasan Shakeeb Ayaz di atas. siapa yang menyalin dari siapa? :)
likejudo
5

PendingIntentpada dasarnya adalah objek yang membungkus Intentobjek 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);
Gowtham Subramaniam
sumber
4

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.

Omar Faroque Anik
sumber
3

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 PendingIntentuntuk mengirim siaran karena aplikasi musik Anda memiliki READ_EXTERNAL_STORAGEizin yang mana aplikasi notifikasi tidak. Notifikasi adalah layanan sistem (jadi ini adalah aplikasi asing).

Ashish Rawat
sumber
contoh yang bagus!
likejudo
2

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.

Zar E Ahmer
sumber
1
Bisakah Anda memberikan contoh kehidupan nyata untuk ini?
CopsOnRoad
0

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.

vikseln
sumber
0

Pending Intent adalah niat yang memberikan semua izin ke aplikasi lain untuk melakukan pekerjaan tertentu. Ketika aktivitas utama dihancurkan, OS Android mengambil kembali izin darinya.

Neimer
sumber