Sebagian besar jawaban sudah mencakup getContext()dan getApplicationContext()tetapi getBaseContext () jarang dijelaskan.
Metode getBaseContext()ini hanya relevan ketika Anda memiliki ContextWrapper. Android menyediakan ContextWrapperkelas yang dibuat di sekitar yang sudah ada Contextmenggunakan:
ContextWrapper wrapper = new ContextWrapper(context);
Manfaat menggunakan a ContextWrapperadalah memungkinkan Anda "memodifikasi perilaku tanpa mengubah Konteks asli". Misalnya, jika Anda memiliki aktivitas yang dipanggil myActivitymaka dapat membuat Viewtema yang berbeda dengan myActivity:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrappersangat kuat karena memungkinkan Anda menimpa sebagian besar fungsi yang disediakan dengan Contextmemasukkan 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()). ContextWrappersangat 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 ContextWrappermembungkus. Anda mungkin perlu mengakses konteks "basis" jika Anda perlu, misalnya, memeriksa apakah itu adalah Service, Activityatau 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();
}
}
}