Perbedaan antara getContext (), getApplicationContext (), getBaseContext () dan “this”


Jawaban:


528
  • 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 ().


59
dan bagaimana dengan "ini"?
CooL i3oY

16
+ CooL i3oY sama dengan getContext
Mikey

13
sebenarnya saya bingung bahwa apa definisi konteks yang tepat ??
Ravi

11
"ini" dan getContext () keduanya sama
KCRaju

43
thisdan getContext()tidak selalu sama misalnya di kelas Activity, Anda dapat menggunakan thiskarena Activitymewarisi dari Contexttetapi metode getContext()tidak di Activitykelas. @mikedroid @KCRaju
nandan

92

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();
    }
  }
}

17
Saya akan mengatakan, ini adalah jawaban yang paling penting setelah jawaban yang diterima.
0leg

4
Saya akan mengatakan bahwa keberadaan ContextWrapperadalah 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 menggunakan getBaseContext()atau ContextWrapper. Jika Anda melakukannya - itu adalah "bau kode" yang sangat besar.
Vasiliy

Saya ingin melihat CustomToastkode lengkap . THANKS :)))
Alston

39

getApplicationContext () - Mengembalikan konteks untuk semua aktivitas yang berjalan dalam aplikasi.

getBaseContext () - Jika Anda ingin mengakses Konteks dari konteks lain dalam aplikasi, Anda dapat mengakses.

getContext () - Mengembalikan tampilan konteks hanya aktivitas berjalan saat ini.


1
Tolong sertakan huruf A dan B ke dalam definisi Anda tentang konteks dengan konteksnya, tidak jelas dalam jawaban mana konteks diakses.
Semoga bermanfaat

29

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, Contextadalah contoh anti-pola Obyek Allah dalam produksi.

Ketika sampai pada jenis yang Contextharus kita gunakan, itu menjadi sangat rumit karena kecuali sebagai Obyek Allah, hierarki pohon Contextsubclass melanggar Prinsip Pergantian Liskov secara brutal.

Posting blog ini mencoba merangkum Contextpenerapan kelas dalam situasi yang berbeda.

Biarkan saya menyalin tabel utama dari pos itu untuk kelengkapan:

+----------------------------+-------------+----------+---------+-----------------+-------------------+
|                            | Application | Activity | Service | ContentProvider | BroadcastReceiver |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
| Show a Dialog              | NO          | YES      | NO      | NO              | NO                |
| Start an Activity          | NO¹         | YES      | NO¹     | NO¹             | NO¹               |
| Layout Inflation           | NO²         | YES      | NO²     | NO²             | NO²               |
| Start a Service            | YES         | YES      | YES     | YES             | YES               |
| Bind to a Service          | YES         | YES      | YES     | YES             | NO                |
| Send a Broadcast           | YES         | YES      | YES     | YES             | YES               |
| Register BroadcastReceiver | YES         | YES      | YES     | YES             | NO³               |
| Load Resource Values       | YES         | YES      | YES     | YES             | YES               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
  1. Aplikasi BISA memulai suatu Kegiatan dari sini, tetapi itu mengharuskan tugas baru dibuat. Ini mungkin cocok dengan kasus penggunaan khusus, tetapi dapat membuat perilaku tumpukan tidak standar dalam aplikasi Anda dan umumnya tidak direkomendasikan atau dianggap praktik yang baik.
  2. Ini legal, tetapi inflasi akan dilakukan dengan tema default untuk sistem yang Anda jalankan, bukan apa yang didefinisikan dalam aplikasi Anda.
  3. Diizinkan jika penerima nol, yang digunakan untuk mendapatkan nilai saat ini dari siaran permanen, di Android 4.2 dan di atasnya.

tangkapan layar


Posting blog luar biasa yang ditautkan dengan Anda!
lejonl

28

Contextmemberikan informasi tentang Actvityatau Applicationke komponen yang baru dibuat.

Relevan Contextharus disediakan untuk komponen yang baru dibuat (apakah konteks aplikasi atau konteks aktivitas)

Karena Activitymerupakan subkelas dari Context, seseorang dapat menggunakan thisuntuk mendapatkan konteks aktivitas itu


Di mana penjelasan Anda tentang baseContext?
IgorGanapolsky

1

Dari dokumen ini

Saya mengerti bahwa Anda harus menggunakan:

Coba gunakan aplikasi konteks daripada aktivitas konteks


0

getApplicationContext ()

ini digunakan untuk level aplikasi dan merujuk ke semua aktivitas.

getContext () dan getBaseContext ()

kemungkinan besar sama. Ini hanya disebut aktivitas saat ini yang hidup.

ini

adalah merujuk objek kelas saat ini selalu.


0

A Contextadalah:

  • kelas abstrak yang implementasinya disediakan oleh sistem Android.
  • Ini memungkinkan akses ke sumber daya dan kelas khusus aplikasi, serta panggilan untuk operasi tingkat aplikasi seperti meluncurkan aktivitas, menyiarkan dan menerima maksud, dll.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.