Saya tidak dapat menemukan jawaban yang memuaskan untuk ini, jadi di sini kita mulai: apa masalahnya Activity/Service.getApplication()
dan Context.getApplicationContext()
?
Dalam aplikasi kita, keduanya mengembalikan objek yang sama. Dalam ActivityTestCase
Namun, mengejek aplikasi akan membuat getApplication()
datang kembali dengan pura-pura, tapi getApplicationContext
masih akan kembali contoh konteks yang berbeda (satu disuntikkan oleh Android). Apakah itu bug? Apakah itu disengaja?
Saya bahkan tidak mengerti perbedaannya. Apakah ada case di luar test suite di mana kedua panggilan dapat kembali dengan objek yang berbeda? Kapan dan mengapa? Selain itu, mengapa getApplication
didefinisikan Activity
dan Service
, tetapi tidak pada Context
? Bukankah seharusnya selalu ada contoh aplikasi yang valid tersedia dari mana saja ?
Application
objek di aplikasi Anda.Jawaban:
Pertanyaan yang sangat menarik. Saya pikir itu terutama makna semantik, dan mungkin juga karena alasan historis.
Meskipun dalam implementasi Aktivitas dan Layanan Android saat ini,
getApplication()
dangetApplicationContext()
mengembalikan objek yang sama, tidak ada jaminan bahwa ini akan selalu menjadi kasus (misalnya, dalam implementasi vendor tertentu).Jadi, jika Anda ingin kelas Aplikasi yang Anda daftarkan di Manifest, Anda tidak boleh memanggil
getApplicationContext()
dan melemparkannya ke aplikasi Anda, karena itu mungkin bukan instance aplikasi (yang jelas-jelas Anda alami dengan kerangka tes).Mengapa
getApplicationContext()
ada di tempat pertama?getApplication()
hanya tersedia di kelas Aktivitas dan kelas Layanan, sedangkangetApplicationContext()
dinyatakan dalam kelas Konteks.Itu sebenarnya berarti satu hal: ketika menulis kode di penerima siaran, yang bukan konteks tetapi diberi konteks dalam metode onReceive, Anda hanya dapat menelepon
getApplicationContext()
. Yang juga berarti bahwa Anda tidak dijamin memiliki akses ke aplikasi Anda di BroadcastReceiver.Saat melihat kode Android, Anda melihat bahwa ketika dilampirkan, suatu kegiatan menerima konteks dasar dan aplikasi, dan itu adalah parameter yang berbeda.
getApplicationContext()
delegasi itu panggilan untukbaseContext.getApplicationContext()
.Satu hal lagi: dokumentasi mengatakan bahwa itu sebagian besar kasus, Anda tidak perlu subkelas Aplikasi:
Saya tahu ini bukan jawaban yang tepat dan tepat, tetapi tetap saja, apakah itu menjawab pertanyaan Anda?
sumber
android.app.Application
sangat membantu penuh. Sebagai contoh, saya punya masalah tak berujung menginisialisasi database. Setelah pindah keApplication.onCreate
sana bekerja seperti pesona. Sekarang saya melakukan inisialisasi seluruh sistemApplication
dan saya tidak akan menulis Aplikasi lain tanpa.Bandingkan
getApplication()
dangetApplicationContext()
.getApplication
mengembalikanApplication
objek yang akan memungkinkan Anda untuk mengelola keadaan aplikasi global Anda dan menanggapi beberapa situasi perangkat sepertionLowMemory()
danonConfigurationChanged()
.getApplicationContext
mengembalikan konteks aplikasi global - perbedaan dari konteks lain adalah bahwa misalnya, konteks aktivitas dapat dihancurkan (atau jika tidak tersedia) oleh Android ketika aktivitas Anda berakhir. Konteks Aplikasi tetap tersedia selama objek Aplikasi Anda ada (yang tidak terikat pada spesifikActivity
) sehingga Anda dapat menggunakan ini untuk hal-hal seperti Pemberitahuan yang memerlukan konteks yang akan tersedia untuk jangka waktu yang lebih lama dan independen dari objek UI sementara.Saya kira itu tergantung pada apa kode Anda lakukan apakah ini mungkin atau mungkin tidak sama - meskipun dalam penggunaan normal, saya berharap mereka berbeda.
sumber
Application
adalah sebuahContext
(mewarisi dari itu), dan pada saat runtime, kedua metode kembali contoh yang sama. Jadi apa bedanya?Activity
konteks danApplication
konteks. Saya sedang mempertimbangkan perbedaan antaraApplication
(yang merupakan konteks aplikasi global dan unik) dan apa pun yanggetApplicationContext
dikembalikan. Yang terakhir itu sebenarnya non-fungsional sebelum Android 1.6; dulu selalu kembalinull
.Tampaknya ada hubungannya dengan pembungkus konteks. Sebagian besar kelas berasal dari
Context
sebenarnyaContextWrapper
, yang pada dasarnya mendelegasikan ke konteks lain, mungkin dengan perubahan oleh pembungkus.Konteksnya adalah abstraksi umum yang mendukung ejekan dan proksi. Karena banyak konteks terikat pada objek seumur hidup terbatas seperti
Activity
, maka perlu ada cara untuk mendapatkan konteks yang berumur panjang, untuk tujuan seperti mendaftar untuk pemberitahuan di masa mendatang. Itu dicapai olehContext.getApplicationContext()
. Implementasi logis adalah mengembalikanApplication
objek global , tetapi tidak ada yang mencegah implementasi konteks dari mengembalikan pembungkus atau proksi dengan masa hidup yang sesuai sebagai gantinya.Aktivitas dan layanan lebih khusus dikaitkan dengan suatu
Application
objek. Kegunaan dari ini, saya percaya, adalah bahwa Anda dapat membuat dan mendaftar dalam manifes kelas kustom yang berasal dariApplication
dan memastikan bahwaActivity.getApplication()
atauService.getApplication()
akan mengembalikan objek spesifik dari tipe tertentu itu, yang dapat Anda lemparkan keApplication
kelas turunan Anda dan gunakan untuk apa pun tujuan khusus.Dengan kata lain,
getApplication()
dijamin untuk mengembalikanApplication
objek, sementaragetApplicationContext()
bebas untuk mengembalikan proxy.sumber
Untuk menjawab pertanyaan, getApplication () mengembalikan objek Aplikasi dan getApplicationContext () mengembalikan objek Konteks. Berdasarkan pengamatan Anda sendiri, saya akan berasumsi bahwa Konteks keduanya identik (yaitu di belakang layar kelas Aplikasi memanggil fungsi yang terakhir untuk mengisi bagian Konteks dari kelas dasar atau beberapa tindakan setara terjadi). Seharusnya tidak terlalu penting fungsi mana yang Anda panggil jika Anda hanya memerlukan sebuah Konteks.
sumber