perbedaan dan kapan menggunakan getApplication (), getApplicationContext (), getBaseContext () dan someClass.this

121

Aku baru untuk android dan aku mencoba untuk memahami perbedaan antara getApplication(), getApplicationContext(), getBaseContext(), getContext()dan someClass.thisdan terutama ketika menggunakan metode ini dalam baris kode berikut:

Saat saya meluncurkan toast, apa perbedaannya dan dalam kasus apa saya menggunakannya?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

sama dengan maksud:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);
Pheonix7
sumber
mereka hanya menangani konteks dan baseContext. tetapi saya ingin memahami semua penggunaannya dalam 2 konteks. terima kasih
Pheonix7

Jawaban:

215

Toast dan Intent , keduanya membutuhkan referensi ke konteks . Dan getApplication , getApplicationContext , LoginActivity.this dan getBaseContext , semuanya menawarkan referensi ke konteksnya.

Sekarang yang membingungkan adalah deklarasi konteks yang berbeda dan penggunaan spesifiknya. Untuk mempermudah, Anda harus menghitung dua jenis konteks yang tersedia di framework Android.

  1. Konteks Aplikasi
  2. Konteks Aktivitas

Konteks aplikasi melekat pada siklus hidup aplikasi dan akan selalu sama sepanjang masa pakai aplikasi. Jadi, jika Anda menggunakan Toast , Anda dapat menggunakan konteks aplikasi atau bahkan konteks aktivitas (keduanya) karena toast dapat dimunculkan dari mana saja dalam aplikasi Anda dan tidak dilampirkan ke jendela.

Kegiatan konteks melekat dengan kehidupan-siklus aktivitas dan dapat hancur jika aktivitas ini onDestroy()dinaikkan. Jika ingin meluncurkan aktivitas baru, Anda harus menggunakan konteks aktivitas dalam Maksudnya sehingga aktivitas peluncuran baru terhubung ke aktivitas saat ini (dalam istilah tumpukan aktivitas). Namun, Anda dapat menggunakan konteks aplikasi juga untuk meluncurkan aktivitas baru, tetapi kemudian Anda perlu menyetel tanda Intent.FLAG_ACTIVITY_NEW_TASKuntuk memperlakukannya sebagai tugas baru.

Sekarang mengacu pada kasus Anda:

LoginActivity.this meskipun mengacu pada kelas Anda sendiri yang memperluas kelas Aktivitas tetapi kelas dasar (Aktivitas) juga memperluas kelas Konteks, sehingga dapat digunakan untuk menawarkan konteks aktivitas.

getApplication() meskipun mengacu pada objek Aplikasi tetapi kelas Aplikasi memperluas kelas Konteks, sehingga dapat digunakan untuk menawarkan konteks aplikasi.

getApplicationContext() menawarkan konteks aplikasi.

getBaseContext() menawarkan konteks aktivitas.

Tips: Setiap kali Anda perlu memanipulasi Viewskemudian pergi untuk Kegiatan-Context , lain Aplikasi-Konteks akan cukup.

waqaslam
sumber
11
jadi jika saya melakukannya dengan benar, someClass.this, getBaseContext dan getContext () adalah konteks aktivitas sedangkan getApplicationContext () dan getApplication () adalah konteks aplikasi?
Pheonix7
konteksnya hanyalah informasi tentang lingkungan kan?
berkomitmenandroider
Ya, ini seperti kotak pasir yang menampung aplikasi
waqaslam
@committedandroider karena konteks aktivitas berisi info tambahan untuk tema yang dipilih, jadi saat tampilan dibuat dalam kode, tema yang benar akan diterapkan secara otomatis. Untuk info lebih lanjut, Anda dapat membaca ini
waqaslam
@waqaslam merujuk ke Kelas sdk android, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; dan getBaseContext()merupakan metode ContextWrapper, sehingga getBaseContext() offers activity context.serta Application Contextterlalu ... tidak itu?
Bhuro
26

Jawaban oleh Waqas sangat jelas dan lengkap, namun saya ingin lebih memperjelas perbedaan antara menggunakan thisvs getBaseContext(), atau getApplication()vs getApplicationContext(). Keduanya Activitydan Applicationtidak memperpanjang Contextdirinya sendiri, tetapi ContextWrapper, yang merupakan a

"Penerapan proxy Contextyang hanya mendelegasikan semua panggilannya ke yang lain Context".

Konteks "nyata" itulah yang Anda dapatkan dengan menggunakan getBaseContext().

Jadi meskipun this(untuk Activity) dan getBaseContext()keduanya memberikan konteks aktivitas, mereka

  • (a) tidak mengacu pada objek yang sama ( this != getBaseContext()) dan
  • (b) memanggil konteks melalui thissedikit kurang efisien, karena panggilan melewati tingkat tipuan ekstra. Saya ragu itu membuat perbedaan praktis.

Logika yang sama berlaku untuk getApplication()vs getApplicationContext().

AlexR
sumber
Sejauh yang getBaseContext()diketahui, Pengembang Android Google menyarankan ini: "Jangan gunakan getBaseContext (), cukup gunakan Konteks yang Anda miliki." Jadi, pada dasarnya, mereka menyarankan Anda menggunakan thisuntuk Aktivitas.
ChuongPham
ini adalah penjelasan paling jelas yang getBaseContextsaya temukan di Internet. Terima kasih!!
q126y
6
LoginActivity.this 

baris di atas adalah Aktivitas yang merupakan Konteks .. ini digunakan ketika Anda membuat beberapa AlertDialogs ... Di beberapa tempat Anda wajib menggunakan Konteks Aktivitas ...

getApplication()

Sama di sini metode make text membutuhkan Context dan Application itu sendiri yang diimplementasikan Context

getApplicationContext()

ini adalah cara yang paling disukai karena ini Contextaktif sampai Aplikasi dimatikan.

getBaseContext()

Konteks ini tersedia untuk widget dan Tampilan ..

Tapi semuanya memberikan objek Konteks dan tidak ada yang lain ..

ngesh
sumber
jadi dalam pesan bersulang atau saat membuat maksud, semuanya memiliki efek yang sama meskipun menggunakan getApplicationContext () adalah yang paling benar?
Pheonix7
1
@Hassan Samii: Untuk Toast, Anda dapat menggunakan getApplicationContext()untuk semua situasi, tetapi sebaiknya Anda gunakan thissaat membuat Toast dalam suatu Aktivitas.
ChuongPham
0

Class.this digunakan jika kelas Anda memperluas Aktivitas getapplication () digunakan referensi aplikasi dan aplikasi memperluas konteks aplikasi getbasecontext () merujuk konteks konteks aktivitas merujuk ke konteks siklus hidup aktivitas applicationcontext merujuk ke siklus hidup aplikasi Anda

chandrakant Chaturvedi
sumber