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 ProgressDialog
dan Toast
.... yang membawa saya ke pertanyaan ini:
Apa perbedaan aktual antara konteks aktivitas dan konteks aplikasi, meskipun berbagi kata 'Konteks'?
android
android-context
t0mm13b
sumber
sumber
Jawaban:
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.
sumber
getApplicationContext
, cukup menarik, ketika saya berubah menjadithis
, 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 ...Saya menemukan tabel ini sangat berguna untuk memutuskan kapan harus menggunakan berbagai jenis Konteks:
Artikel asli di sini .
sumber
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
ApplicationContext
atauActivity
langsung, daripada menggunakan Konteks kelas induk. Di tempat kedua, dokumen harus menentukan konteks yang akan digunakan atau tidak secara eksplisit.sumber
Alasan saya pikir adalah yang
ProgressDialog
melekat pada aktivitas yang menopangProgressDialog
sebagai dialog tidak dapat tetap setelah aktivitas dihancurkan sehingga perlu dilewatithis
(ActivityContext) yang juga akan hancur dengan aktivitas sedangkan ApplicationContext tetap bahkan setelah aktivitas mendapat hancur.sumber
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.
sumber
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
sumber
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
sumber