Dalam berbagai bit kode Android yang pernah saya lihat:
public class MyActivity extends Activity {
public void method() {
mContext = this; // since Activity extends Context
mContext = getApplicationContext();
mContext = getBaseContext();
}
}
Namun saya tidak dapat menemukan penjelasan yang layak tentang mana yang lebih disukai, dan dalam keadaan apa yang harus digunakan.
Menunjuk dokumentasi tentang hal ini, dan panduan tentang apa yang mungkin pecah jika yang salah dipilih, akan sangat dihargai.
android
android-context
Alnitak
sumber
sumber
Jawaban:
Saya setuju bahwa dokumentasi jarang mengenai Konteks di Android, tetapi Anda dapat mengumpulkan beberapa fakta dari berbagai sumber.
Posting blog ini di blog resmi pengembang Android Google ditulis sebagian besar untuk membantu mengatasi kebocoran memori, tetapi juga memberikan beberapa informasi yang baik tentang konteks:
Membaca artikel sedikit lebih jauh menceritakan tentang perbedaan antara keduanya dan kapan Anda mungkin ingin mempertimbangkan untuk menggunakan Konteks aplikasi (
Activity.getApplicationContext()
) daripada menggunakan konteks Aktivitasthis
). Pada dasarnya konteks Aplikasi dikaitkan dengan Aplikasi dan akan selalu sama sepanjang siklus hidup aplikasi Anda, di mana konteks Aktivitas dikaitkan dengan aktivitas dan mungkin dapat dihancurkan berkali-kali karena aktivitas dihancurkan selama perubahan orientasi layar dan seperti itu.Saya tidak dapat menemukan apa pun tentang kapan harus menggunakan getBaseContext () selain pos dari Dianne Hackborn, salah satu insinyur Google yang bekerja pada Android SDK:
Itu dari posting di newsgroup android-pengembang , Anda mungkin ingin mempertimbangkan untuk mengajukan pertanyaan Anda di sana, karena beberapa orang yang bekerja pada monitor Android sebenarnya yang newsgroup dan menjawab pertanyaan.
Jadi secara keseluruhan tampaknya lebih baik menggunakan konteks aplikasi global bila memungkinkan.
sumber
Don't use getBaseContext()
. Bisakah seseorang mengklarifikasi ini?Inilah yang saya temukan mengenai penggunaan
context
:1). Di dalam
Activity
dirinya sendiri, gunakanthis
untuk menggembungkan tata letak dan menu, mendaftarkan menu konteks, membuat widget, memulai kegiatan lain, membuat yang baru diIntent
dalam , membuatActivity
preferensi, atau metode lain yang tersedia diActivity
.Kembangkan tata letak:
Mengembang menu:
Daftarkan menu konteks:
Widget Instantiate:
Mulai sebuah
Activity
:Instansiasi preferensi:
2). Untuk kelas aplikasi-lebar, gunakan
getApplicationContext()
karena konteks ini ada untuk umur aplikasi.Ambil nama paket Android saat ini:
Bind kelas aplikasi-lebar:
3). Untuk Pendengar dan jenis kelas Android lainnya (misalnya ContentObserver), gunakan subtitusi Konteks seperti:
di mana
this
ataucontext
adalah konteks kelas (Aktivitas, dll).Activity
substitusi konteks:Substitusi konteks pendengar:
ContentObserver
substitusi konteks:4). Untuk
BroadcastReceiver
(termasuk penerima inline / tertanam), gunakan konteks penerima itu sendiri.Eksternal
BroadcastReceiver
:Inline / tertanam
BroadcastReceiver
:5). Untuk Layanan, gunakan konteks layanan itu sendiri.
6). Untuk Toasts, umumnya digunakan
getApplicationContext()
, tetapi jika memungkinkan, gunakan konteks yang dilewatkan dari Aktivitas, Layanan, dll.Gunakan konteks aplikasi:
Gunakan konteks yang diteruskan dari sumber:
Dan terakhir, jangan gunakan
getBaseContext()
seperti yang disarankan oleh pengembang kerangka Android.UPDATE: Tambahkan contoh
Context
penggunaan.sumber
OuterClass.this
; lihat komentar di stackoverflow.com/questions/9605459/…Saya membaca utas ini beberapa hari yang lalu, bertanya pada diri sendiri pertanyaan yang sama. Keputusan saya setelah membaca ini sederhana: selalu gunakan applicationContext.
Namun, saya mengalami masalah dengan ini, saya menghabiskan beberapa jam untuk menemukannya, dan beberapa detik untuk menyelesaikannya ... (mengubah satu kata ...)
Saya menggunakan LayoutInflater untuk mengembang tampilan yang mengandung Spinner.
Jadi, inilah dua kemungkinan:
1)
2)
Lalu, saya melakukan sesuatu seperti ini:
Apa yang saya perhatikan: Jika Anda membuat LinearLayout Anda dengan applicationContext, maka ketika Anda mengklik pemintal dalam aktivitas Anda, Anda akan memiliki pengecualian yang tidak tertangkap, berasal dari mesin virtual Dalvik (bukan dari kode Anda, itu sebabnya saya telah menghabiskan banyak waktu untuk menemukan di mana kesalahan saya ...).
Jika Anda menggunakan baseContext, maka tidak apa-apa, menu konteks akan terbuka dan Anda dapat memilih di antara pilihan Anda.
Jadi, inilah kesimpulan saya: Saya kira (saya belum mengujinya lebih lanjut) daripada baseContext diperlukan ketika berhadapan dengan contextMenu dalam Aktivitas Anda ...
Tes telah dilakukan pengkodean dengan API 8, dan diuji pada HTC Desire, android 2.3.3.
Saya harap komentar saya sejauh ini tidak membuat Anda bosan, dan berharap yang terbaik untuk Anda semua. Selamat coding ;-)
sumber
Pertama, saya setuju bahwa kita harus menggunakan appcontext bila memungkinkan. lalu "ini" dalam aktivitas. Saya tidak pernah memiliki kebutuhan untuk basecontext.
Dalam tes saya, dalam banyak kasus mereka dapat dipertukarkan. Dalam kebanyakan kasus, alasan Anda ingin memahami suatu konteks adalah untuk mengakses file, preferensi, basis data dll. Data ini pada akhirnya dicerminkan sebagai file dalam folder data pribadi aplikasi Anda (/ data / data /). Apa pun konteks yang Anda gunakan, mereka akan dipetakan ke folder / file yang sama sehingga Anda OK.
Itu yang saya amati. Mungkin ada kasus yang harus Anda bedakan.
sumber
Dalam beberapa kasus, Anda dapat menggunakan konteks Aktivitas di atas konteks aplikasi saat menjalankan sesuatu di utas. Ketika utas menyelesaikan eksekusi dan Anda harus mengembalikan hasilnya kembali ke aktivitas pemanggil, Anda perlu konteks itu dengan seorang pawang.
sumber
Dengan kata-kata sederhana
getApplicationContext()
seperti nama metode yang disarankan akan membuat aplikasi Anda mengetahui detail aplikasi yang luas yang dapat Anda akses dari mana saja di aplikasi. Jadi Anda dapat menggunakan ini dalam penjilidan layanan, pendaftaran siaran dll.Application context
Akan hidup sampai aplikasi keluar.getActivity()
atauthis
akan membuat aplikasi Anda mengetahui layar saat ini yang terlihat juga detail tingkat aplikasi yang disediakan olehapplication context
. Jadi apa pun yang Anda ingin tahu tentang layar saat ini sukaWindow
ActionBar
Fragementmanger
dan tersedia dengan konteks ini. Pada dasarnya danActivity
luaskanContext
. Konteks ini akan hidup sampai komponen (aktivitas) saat ini hidupsumber
Apa itu Konteks? Saya pribadi suka menganggap Konteks sebagai keadaan aplikasi Anda pada waktu tertentu. Konteks aplikasi mewakili konfigurasi global atau basis dari aplikasi Anda dan Kegiatan atau Layanan dapat membangun atasnya dan mewakili contoh konfigurasi Aplikasi Anda atau keadaan transitif untuk itu.
Jika Anda melihat sumber untuk android.content.Context, Anda melihat bahwa Konteks adalah kelas abstrak dan komentar di kelas adalah sebagai berikut:
Antarmuka ke informasi global tentang lingkungan aplikasi. Ini adalah kelas abstrak yang implementasinya disediakan oleh sistem Android. Hal ini memungkinkan akses ke
application-specific
sumber daya dan kelas, serta panggilan untukapplication-level
operasi seperti meluncurkan kegiatan, menyiarkan dan menerima maksud, dll. Apa yang saya ambil dari ini adalah bahwa Konteks menyediakan implementasi umum untuk mengakses tingkat aplikasi serta tingkat sistem sumber daya. Sumber daya tingkat aplikasi mungkin mengakses hal-hal seperti sumber daya String[getResources()]
atau aset[getAssets()]
dan sumber daya tingkat sistem adalah apa pun yang Anda aksesContext.getSystemService().
Faktanya, perhatikan komentar pada metode dan mereka tampaknya memperkuat gagasan ini:
getSystemService()
: Kembalikan gagang kesystem-level
layanan dengan nama. Kelas objek yang dikembalikan bervariasi menurut nama yang diminta.getResources()
: Kembalikan contoh Sumber Daya untuk paket aplikasi Anda.getAssets()
: Kembalikan contoh Sumber Daya untuk paket aplikasi Anda. Mungkin pantas untuk menunjukkan bahwa dalam kelas abstrak Konteks, semua metode di atas adalah abstrak! Hanya satu instance dari getSystemService (Class) yang memiliki implementasi dan yang memanggil metode abstrak. Ini berarti, implementasi untuk ini harus disediakan sebagian besar oleh kelas implementasi, yang meliputi:Melihat dokumentasi API, hierarki kelas terlihat seperti ini:
Konteks
| - ContextWrapper
| - - Aplikasi
| - - ContextThemeWrapper
| - - - - Aktivitas
| - - Layanan
| - - - IntentService
Karena kita tahu bahwa
Context
itu sendiri tidak memberikan wawasan apa pun, kita bergerak turun pohon dan melihatContextWrapper
dan menyadari bahwa tidak ada banyak juga di sana. Karena Aplikasi meluasContextWrapper
, tidak banyak yang bisa dilihat di sana karena tidak menimpa implementasi yang disediakan olehContextWrapper
. Ini berarti bahwa implementasi untuk Konteks disediakan oleh OS dan disembunyikan dariAPI
. Anda dapat melihat implementasi konkret untuk Konteks dengan melihat sumber untuk kelas ContextImpl.sumber
Saya hanya menggunakan ini dan
getBaseContext
ketika memanggang darionClick
(noob sangat hijau untuk Java dan android). Saya menggunakan ini ketika clicker saya langsung dalam aktivitas dan harus digunakangetBaseContext
dalam clicker batin anonim. Saya kira itu adalah tipuannyagetBaseContext
, mungkin mengembalikan konteks kegiatan di mana kelas batin bersembunyi.sumber
MyActivity.this
. Menggunakan konteks dasar seperti yang Anda gambarkan mungkin tidak akan menyebabkan masalah tetapi itu salah.