Apa perbedaan antara getContext()
, getApplicationContext()
, getBaseContext()
, dan " this
"?
Meskipun ini adalah pertanyaan sederhana, saya tidak dapat memahami perbedaan mendasar di antara mereka. Tolong beri beberapa contoh mudah jika memungkinkan.
android
this
android-context
iCurious
sumber
sumber
Jawaban:
View.getContext()
: Mengembalikan konteks tampilan saat ini berjalan masuk. Biasanya Aktivitas saat ini aktif.Activity.getApplicationContext()
: Mengembalikan konteks untuk seluruh aplikasi (proses semua Aktivitas berjalan di dalam). Gunakan ini alih-alih konteks Aktivitas saat ini jika Anda memerlukan konteks terkait dengan siklus hidup seluruh aplikasi, bukan hanya Aktivitas saat ini.ContextWrapper.getBaseContext()
: Jika Anda memerlukan akses ke Konteks dari dalam konteks lain, Anda menggunakan ContextWrapper. Konteks yang dirujuk dari dalam bahwa ContextWrapper diakses melalui getBaseContext ().sumber
this
dangetContext()
tidak selalu sama misalnya di kelas Activity, Anda dapat menggunakanthis
karenaActivity
mewarisi dariContext
tetapi metodegetContext()
tidak diActivity
kelas. @mikedroid @KCRajuSebagian besar jawaban sudah mencakup
getContext()
dangetApplicationContext()
tetapi getBaseContext () jarang dijelaskan.Metode
getBaseContext()
ini hanya relevan ketika Anda memilikiContextWrapper
. Android menyediakanContextWrapper
kelas yang dibuat di sekitar yang sudah adaContext
menggunakan:Manfaat menggunakan a
ContextWrapper
adalah memungkinkan Anda "memodifikasi perilaku tanpa mengubah Konteks asli". Misalnya, jika Anda memiliki aktivitas yang dipanggilmyActivity
maka dapat membuatView
tema yang berbeda denganmyActivity
:ContextWrapper
sangat kuat karena memungkinkan Anda menimpa sebagian besar fungsi yang disediakan denganContext
memasukkan kode untuk mengakses sumber daya (misalnyaopenFileInput()
,getString()
), berinteraksi dengan komponen lain (misalnyasendBroadcast()
,registerReceiver()
), meminta izin (misalnyacheckCallingOrSelfPermission()
) dan menyelesaikan lokasi sistem file (misalnyagetFilesDir()
).ContextWrapper
sangat berguna untuk mengatasi masalah khusus perangkat / versi atau untuk menerapkan penyesuaian satu kali untuk komponen seperti Tampilan yang memerlukan konteks.Metode getBaseContext () dapat digunakan untuk mengakses "base" Konteks yang
ContextWrapper
membungkus. Anda mungkin perlu mengakses konteks "basis" jika Anda perlu, misalnya, memeriksa apakah itu adalahService
,Activity
atauApplication
:Atau jika Anda perlu memanggil versi metode yang "tidak dibuka":
sumber
ContextWrapper
adalah salah satu keputusan terburuk yang pernah dibuat oleh pengembang kerangka kerja Android. Ketika mereka menyadari bahwa mereka menciptakan seluruh keluarga Object God, bukannya melakukan hal yang benar dan refactoring kode menuju Single Responsibility, mereka menambahkan hack jelek yang memungkinkan untuk mengubah perilaku Konteks dengan memperdalam pohon warisan. Rekayasa perangkat lunak buruk paling jelek. Bagi kami, pengembang, IMHO tidak ada yang boleh menggunakangetBaseContext()
atauContextWrapper
. Jika Anda melakukannya - itu adalah "bau kode" yang sangat besar.CustomToast
kode lengkap . THANKS :)))sumber
Pertanyaan "apa Konteksnya" adalah salah satu pertanyaan paling sulit di dunia Android.
Konteks mendefinisikan metode yang mengakses sumber daya sistem, mengambil aset statis aplikasi, memeriksa izin, melakukan manipulasi UI, dan banyak lagi. Intinya,
Context
adalah contoh anti-pola Obyek Allah dalam produksi.Ketika sampai pada jenis yang
Context
harus kita gunakan, itu menjadi sangat rumit karena kecuali sebagai Obyek Allah, hierarki pohonContext
subclass melanggar Prinsip Pergantian Liskov secara brutal.Posting blog ini mencoba merangkum
Context
penerapan kelas dalam situasi yang berbeda.Biarkan saya menyalin tabel utama dari pos itu untuk kelengkapan:
sumber
Context
memberikan informasi tentangActvity
atauApplication
ke komponen yang baru dibuat.Relevan
Context
harus disediakan untuk komponen yang baru dibuat (apakah konteks aplikasi atau konteks aktivitas)Karena
Activity
merupakan subkelas dariContext
, seseorang dapat menggunakanthis
untuk mendapatkan konteks aktivitas itusumber
Dari dokumen ini
Saya mengerti bahwa Anda harus menggunakan:
sumber
getApplicationContext ()
getContext () dan getBaseContext ()
ini
sumber
A
Context
adalah:sumber