Sebagian besar jawaban sudah mencakup getContext()
dan getApplicationContext()
tetapi getBaseContext () jarang dijelaskan.
Metode getBaseContext()
ini hanya relevan ketika Anda memiliki ContextWrapper
. Android menyediakan ContextWrapper
kelas yang dibuat di sekitar yang sudah ada Context
menggunakan:
ContextWrapper wrapper = new ContextWrapper(context);
Manfaat menggunakan a ContextWrapper
adalah memungkinkan Anda "memodifikasi perilaku tanpa mengubah Konteks asli". Misalnya, jika Anda memiliki aktivitas yang dipanggil myActivity
maka dapat membuat View
tema yang berbeda dengan myActivity
:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
sangat kuat karena memungkinkan Anda menimpa sebagian besar fungsi yang disediakan dengan Context
memasukkan kode untuk mengakses sumber daya (misalnya openFileInput()
, getString()
), berinteraksi dengan komponen lain (misalnya sendBroadcast()
, registerReceiver()
), meminta izin (misalnya checkCallingOrSelfPermission()
) dan menyelesaikan lokasi sistem file (misalnya getFilesDir()
). 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 adalah Service
, Activity
atau Application
:
public class CustomToast {
public void makeText(Context context, int resId, int duration) {
while (context instanceof ContextWrapper) {
context = context.baseContext();
}
if (context instanceof Service)) {
throw new RuntimeException("Cannot call this from a service");
}
...
}
}
Atau jika Anda perlu memanggil versi metode yang "tidak dibuka":
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}