Perbedaan antara Konteks Aktivitas dan Konteks Aplikasi

233

Ini membuat saya bingung, saya menggunakan ini di Android 2.1-r8 SDK:

ProgressDialog.show(getApplicationContext(), ....);

dan juga di

Toast t = Toast.makeText(getApplicationContext(),....);

menggunakan getApplicationContext()crash ProgressDialogdan Toast.... yang membawa saya ke pertanyaan ini:

Apa perbedaan aktual antara konteks aktivitas dan konteks aplikasi, meskipun berbagi kata 'Konteks'?

t0mm13b
sumber
Ini adalah apa yang saya temukan stackoverflow.com/questions/1561803/ ... ....
t0mm13b
14
Ini akan membantu menjernihkan beberapa hal: Konteks, Konteks Apa?
toobsco42

Jawaban:

250

Keduanya adalah instance dari Konteks , tetapi instance aplikasi terikat pada siklus hidup aplikasi, sementara instance Activity terikat pada siklus hidup suatu Activity. Dengan demikian, mereka memiliki akses ke berbagai informasi tentang lingkungan aplikasi.

Jika Anda membaca dokumen di getApplicationContext ini mencatat bahwa Anda hanya boleh menggunakan ini jika Anda memerlukan konteks yang siklus hidupnya terpisah dari konteks saat ini. Ini tidak berlaku di salah satu contoh Anda.

Konteks Aktivitas mungkin memiliki beberapa informasi tentang aktivitas saat ini yang diperlukan untuk menyelesaikan panggilan tersebut. Jika Anda menampilkan pesan kesalahan yang tepat, mungkin dapat menunjukkan apa yang dibutuhkannya.

Namun secara umum, gunakan konteks aktivitas kecuali Anda memiliki alasan kuat untuk tidak melakukannya.

Cheryl Simon
sumber
1
Saya mendapat 'java.lang.reflect.InvocationTargetException' saat menggunakan getApplicationContext, cukup menarik, ketika saya berubah menjadi this, itu tidak crash dan berfungsi seperti yang diharapkan .... jadi jika keduanya adalah contoh dari Context, mengapa kita tidak bekerja dan yang lainnya tidak? Info ini akan membantu orang lain, saya harap ... :) terima kasih atas jawaban cepat Anda ...
t0mm13b
2
Saya perlu melihat stacktrace pengecualian penuh untuk dapat mengatakan apa pun. Namun, seperti yang saya katakan contoh konteks memiliki informasi yang berbeda. Agaknya untuk menampilkan dialog atau bersulang di layar memerlukan informasi tentang Aktivitas yang hanya dimiliki oleh instance Aktivitas.
Cheryl Simon
74
Saya akan mengatakan menggunakan konteks aplikasi kecuali Anda memiliki alasan yang bagus juga (yaitu untuk dialog atau bersulang). Sangat mudah untuk mengalami kebocoran memori menggunakan konteks aktivitas dalam situasi yang berbeda jadi sebaiknya aman :) android-developers.blogspot.com/2009/01/…
Dori
10
Dave Smith telah memposting entri blog yang sangat bagus untuk memahami penggunaan konteks, lihat di sini . Pastikan Anda juga membaca komentar!
ChrLipp
1
Masalahnya, bahkan Dianna Hackborn merekomendasikan untuk menggunakan konteks aktivitas. stackoverflow.com/questions/5228160/... Tapi dia sepertinya tidak sepenuhnya yakin tentang ini.
JacksOnF1re
178

Saya menemukan tabel ini sangat berguna untuk memutuskan kapan harus menggunakan berbagai jenis Konteks:

masukkan deskripsi gambar di sini

  1. Aplikasi BISA memulai suatu Kegiatan dari sini, tetapi itu mengharuskan tugas baru dibuat. Ini mungkin cocok dengan kasus penggunaan khusus, tetapi dapat membuat perilaku tumpukan tidak standar dalam aplikasi Anda dan umumnya tidak direkomendasikan atau dianggap praktik yang baik.
  2. Ini legal, tetapi inflasi akan dilakukan dengan tema default untuk sistem yang Anda jalankan, bukan apa yang didefinisikan dalam aplikasi Anda.
  3. Diizinkan jika penerima nol, yang digunakan untuk mendapatkan nilai saat ini dari siaran permanen, di Android 4.2 dan di atasnya.

Artikel asli di sini .

CommonSenseCode
sumber
bagaimana dengan mendapatkan sumber daya? Saya pikir Anda sebaiknya menambahkannya ke meja Anda. dan Anda dapat mengakses sumber daya dengan konteks aplikasi.
Amir Ziarati
Kita dapat memulai aktivitas dari konteks Aplikasi
Duy Phan
Artikel juga dapat ditemukan di sini: wundermanthompsonmobile.com/2013/06/context
Lifes
34

Ini jelas kekurangan desain API. Di tempat pertama, Konteks Kegiatan dan konteks Aplikasi adalah objek yang sama sekali berbeda, sehingga parameter metode di mana konteks digunakan harus menggunakan ApplicationContextatau Activitylangsung, daripada menggunakan Konteks kelas induk. Di tempat kedua, dokumen harus menentukan konteks yang akan digunakan atau tidak secara eksplisit.

lucas
sumber
25
Sangat setuju. Google menjatuhkan bola yang satu ini. Ini benar-benar berantakan.
Søren Boisen
@ SørenBoisen android sdk berantakan total
CommonSenseCode
Mereka sadar akan kekacauan itu, dan yakin mereka berjuang keras untuk memperbaikinya sebanyak mungkin.
pasignature
15

Alasan saya pikir adalah yang ProgressDialogmelekat pada aktivitas yang menopang ProgressDialogsebagai dialog tidak dapat tetap setelah aktivitas dihancurkan sehingga perlu dilewati this(ActivityContext) yang juga akan hancur dengan aktivitas sedangkan ApplicationContext tetap bahkan setelah aktivitas mendapat hancur.

pengguna2779311
sumber
3

Gunakan getApplicationContext () jika Anda memerlukan sesuatu yang terkait dengan Konteks yang akan memiliki cakupan global.

Jika Anda menggunakan Activity, maka instance Activity baru akan memiliki referensi, yang memiliki referensi implisit ke Activity lama, dan Activity lama tidak dapat berupa sampah yang dikumpulkan.

Dhiraj Himani
sumber
2

Saya pikir ketika semuanya membutuhkan layar untuk ditampilkan (tombol, dialog, tata letak ...) kita harus menggunakan aktivitas konteks, dan semuanya tidak perlu layar untuk ditampilkan atau diproses (roti bakar, layanan telepon, hubungi ...) kami dapat menggunakan konteks aplikasi

Dmobile
sumber
1

Anda dapat melihat perbedaan antara dua konteks ketika Anda meluncurkan aplikasi Anda langsung dari layar beranda vs ketika aplikasi Anda diluncurkan dari aplikasi lain melalui niat berbagi.

Berikut adalah contoh praktis apa yang dimaksud dengan "perilaku tumpukan tidak standar", yang disebutkan oleh @CommonSenseCode, artinya:

Misalkan Anda memiliki dua aplikasi yang saling berkomunikasi, App1 dan App2 .

Luncurkan App2: MainActivity dari launcher. Kemudian dari MainActivity meluncurkan App2: SecondaryActivity . Di sana, baik menggunakan konteks aktivitas atau konteks aplikasi, kedua aktivitas hidup dalam tugas yang sama dan ini tidak masalah (mengingat bahwa Anda menggunakan semua mode peluncuran standar dan flag maksud). Anda dapat kembali ke MainActivity dengan menekan kembali dan di aplikasi terbaru Anda hanya memiliki satu tugas.

Misalkan sekarang Anda berada di App1 dan meluncurkan App2: MainActivity dengan maksud berbagi (ACTION_SEND atau ACTION_SEND_MULTIPLE). Kemudian dari sana cobalah untuk meluncurkan App2: SecondaryActivity (selalu dengan semua mode peluncuran standar dan bendera maksud). Yang terjadi adalah:

  • jika Anda meluncurkan App2: SecondaryActivity dengan konteks aplikasi di Android <10 Anda tidak dapat meluncurkan semua aktivitas dalam tugas yang sama . Saya telah mencoba dengan android 7 dan 8 dan SecondaryActivity selalu diluncurkan dalam tugas baru (saya kira karena App2: SecondaryActivity diluncurkan dengan konteks aplikasi App2 tetapi Anda berasal dari App1 dan Anda tidak meluncurkan aplikasi App2 secara langsung Mungkin di bawah tenda android mengenalinya dan menggunakan FLAG_ACTIVITY_NEW_TASK). Ini bisa baik atau buruk tergantung pada kebutuhan Anda, karena aplikasi saya buruk.
    Di Android 10 aplikasi mogok dengan pesan
    "Memanggil startActivity () dari luar konteks Aktivitas memerlukan bendera FLAG_ACTIVITY_NEW_TASK. Apakah ini yang benar-benar yang Anda inginkan?" .
    Jadi untuk membuatnya bekerja di Android 10 Anda harus menggunakan FALG_ACTIVITY_NEW_TASK dan Anda tidak dapat menjalankan semua aktivitas dalam tugas yang sama.
    Seperti yang Anda lihat, tingkah lakunya berbeda antara versi android, aneh.

  • jika Anda meluncurkan App2: SecondaryActivity dengan konteks aktivitas semuanya berjalan dengan baik dan Anda dapat menjalankan semua aktivitas dalam tugas yang sama yang menghasilkan navigasi backstack linier.

Saya harap saya telah menambahkan beberapa informasi yang berguna

DSoldo
sumber