Pertanyaan Apa itu 'Konteks' di Android?


Dalam pemrograman Android, apa sebenarnya itu Context kelas dan untuk apa digunakan?

Saya membacanya di situs pengembang, tetapi saya tidak dapat memahaminya dengan jelas.


1576
2017-08-26 06:12


asal


Jawaban:


Sederhananya:

Seperti namanya, itu konteks keadaan saat aplikasi / objek. Ini memungkinkan objek yang baru dibuat memahami apa yang telah terjadi. Biasanya Anda memanggilnya untuk mendapatkan informasi mengenai bagian lain dari program Anda (aktivitas dan paket / aplikasi).

Anda bisa mendapatkan konteks dengan memohon getApplicationContext(), getContext(), getBaseContext() atau this (ketika di kelas yang memanjang dari Context, seperti kelas Aplikasi, Aktivitas, Layanan dan IntentService).

Penggunaan konteks yang khas:

  • Membuat objek baru: Membuat tampilan baru, adaptor, pendengar:

    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
    
  • Mengakses sumber daya umum standar: Layanan seperti LAYOUT_INFLATER_SERVICE, SharedPreferences:

    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext().getSharedPreferences(*name*, *mode*);
    
  • Mengakses komponen secara implisit: Mengenai penyedia konten, siaran, maksud

    getApplicationContext().getContentResolver().query(uri, ...);
    

1239
2017-08-26 06:32



Definisi Konteks ::

  • Konteks mewakili data lingkungan
  • Ini menyediakan akses ke hal-hal seperti database

Istilah yang lebih sederhana ::

  • Pertimbangkan Person-X adalah CEO dari perusahaan peranti lunak baru.

  • Ada arsitek utama yang hadir di perusahaan, arsitek utama ini melakukan semua pekerjaan di perusahaan yang melibatkan seperti database, UI dll.

  • Sekarang CEO Menyewa Pengembang baru.

  • Arsiteklah yang mengatakan tanggung jawab dari yang baru dipekerjakan orang berdasarkan keterampilan orang baru itu apakah dia mau bekerja di Database atau UI dll.

Istilah yang lebih sederhana ::

  • Ini seperti akses aktivitas android ke sumber daya aplikasi.

  • Ini mirip dengan ketika Anda mengunjungi hotel, Anda ingin sarapan, makan siang & makan malam di timing yang cocok, kan?

  • Ada banyak hal lain yang Anda sukai selama waktu tinggal. Apa kabar dapatkan ini?

  • Anda meminta orang layanan kamar untuk membawa barang-barang ini untuk Anda.

  • Di sini orang-orang ruang-layanan adalah konteks mengingat Anda adalah aktivitas tunggal dan hotel menjadi aplikasi Anda, akhirnya sarapan, makan siang & makan malam harus menjadi sumber daya.


Hal-hal yang melibatkan konteks adalah:

  1. Memuat sumber daya.
  2. Peluncuran aktivitas baru.
  3. Membuat tampilan.
  4. memperoleh layanan sistem.

Konteks adalah kelas dasar untuk Aktivitas, Layanan, Aplikasi .... dll

Cara lain untuk menggambarkan ini: Pertimbangkan konteks sebagai remote dari TV & saluran di televisi adalah sumber daya, layanan, menggunakan maksud dll - - - Di sini bertindak jarak jauh sebagai akses untuk mendapatkan akses ke semua sumber daya yang berbeda ke latar depan.

  • Jadi, Remote memiliki akses ke saluran seperti sumber daya, layanan, menggunakan maksud dll ....
  • Demikian juga ..... Siapa pun yang memiliki akses ke remote secara alami memiliki akses ke semua hal seperti sumber daya, layanan, menggunakan maksud dll

Metode berbeda yang dapat Anda gunakan untuk mendapatkan konteks

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • atau this (ketika di kelas aktivitas)

Contoh:

TextView TV=new TextView(this);

this -> mengacu pada konteks aktivitas saat ini.


408
2017-08-20 05:25



Sumber


Topik Konteks di Android tampaknya membingungkan bagi banyak orang. Orang hanya tahu bahwa Konteks diperlukan cukup sering untuk melakukan hal-hal dasar di Android. Orang terkadang panik karena mereka mencoba melakukan beberapa operasi yang membutuhkan Konteks dan mereka tidak tahu cara "mendapatkan" Konteks yang tepat. Saya akan mencoba untuk mengungkap ide Konteks di Android. Penanganan masalah sepenuhnya berada di luar cakupan posting ini, tetapi saya akan mencoba memberikan gambaran umum sehingga Anda memiliki rasa Konteks dan cara menggunakannya. Untuk memahami apa Konteks, mari kita lihat kode sumber:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java

Apa sebenarnya Konteksnya? 

Nah, dokumentasi itu sendiri memberikan penjelasan yang agak mudah: Kelas Konteks adalah "Antarmuka informasi global tentang lingkungan aplikasi".

Kelas Konteks itu sendiri dinyatakan sebagai kelas abstrak, yang implementasinya disediakan oleh OS Android. Dokumentasi lebih lanjut memberikan bahwa Konteks "... memungkinkan akses ke sumber daya dan kelas khusus aplikasi, serta up-panggilan untuk operasi tingkat aplikasi seperti meluncurkan kegiatan, penyiaran dan menerima maksud, dll".

Anda bisa mengerti dengan baik, sekarang, mengapa namanya Context. Itu karena itu hanya itu. Konteks menyediakan tautan atau pengait, jika Anda mau, untuk suatu Kegiatan, Layanan, atau komponen apa pun lainnya, dengan demikian menautkannya ke sistem, memungkinkan akses ke lingkungan aplikasi global. Dengan kata lain: Konteks menyediakan jawaban untuk pertanyaan komponen "di mana sih saya dalam kaitannya dengan aplikasi secara umum dan bagaimana cara mengakses / berkomunikasi dengan sisa aplikasi?" Jika ini semua tampaknya agak membingungkan, cepat lihat metode yang diekspos oleh kelas Konteks memberikan beberapa petunjuk lebih lanjut tentang sifat aslinya.

Berikut ini contoh acak dari metode tersebut:

  1. getAssets() 
  2. getResources()
  3. getPackageManager()
  4. getString()
  5. getSharedPrefsFile()

Apa kesamaan semua metode ini? Mereka semua memungkinkan siapa pun yang memiliki akses ke Konteks untuk dapat mengakses berbagai sumber daya aplikasi.

Konteks, dengan kata lain, menghubungkan komponen yang memiliki referensi ke seluruh lingkungan aplikasi. Aset (folder think '/ aset' dalam proyek Anda), misalnya, tersedia di seluruh aplikasi, dengan ketentuan bahwa Aktivitas, Layanan atau apa pun yang tahu cara mengakses sumber daya tersebut. Sama berlaku untuk getResources() yang memungkinkan untuk melakukan hal-hal seperti getResources().getColor() yang akan menghubungkan Anda ke dalam colors.xml sumber daya (tidak pernah mengingat bahwa aapt memungkinkan akses ke sumber daya melalui kode java, itu adalah masalah yang terpisah).

Hasilnya adalah itu Context adalah apa yang memungkinkan akses ke sumber daya sistem dan apa yang menghubungkan komponen ke "aplikasi lebih besar". Mari kita lihat subclass dari Context, kelas-kelas yang memberikan implementasi abstrak Context kelas. Kelas yang paling jelas adalah Activity kelas. Activitymewarisi dari ContextThemeWrapper, yang mewarisi dari ContextWrapper, yang mewarisi dari Context diri. Kelas-kelas tersebut berguna untuk melihat untuk memahami sesuatu pada level yang lebih dalam, tetapi untuk saat ini cukup untuk mengetahui hal itu ContextThemeWrapper dan ContextWrapper cukup banyak seperti yang mereka dengar. Mereka menerapkan elemen abstrak dari Context kelas itu sendiri dengan "membungkus" konteks (konteks aktual) dan mendelegasikan fungsi-fungsi tersebut ke konteks itu.  Contoh sangat membantu - dalam ContextWrapper kelas, metode abstrak getAssets dari Context kelas diimplementasikan sebagai berikut:

@Override
    public AssetManager getAssets() {
        return mBase.getAssets();
    }

mBase hanyalah sebuah bidang yang ditetapkan oleh konstruktor untuk konteks tertentu. Jadi konteksnya dibungkus dan ContextWrapper mendelegasikan penerapan metode getAssets ke konteks itu. Mari kembali untuk memeriksa Activity kelas yang akhirnya mewarisi dari Context untuk melihat bagaimana semua ini bekerja.

Anda mungkin tahu apa itu Aktivitas, tetapi untuk meninjau - pada dasarnya 'satu hal yang dapat dilakukan oleh pengguna. Ini membutuhkan menyediakan jendela untuk menempatkan UI yang berinteraksi dengan pengguna '. Pengembang yang mengenal API lain dan bahkan non-pengembang mungkin menganggapnya sebagai "layar." Itu tidak akurat secara teknis, tetapi itu tidak masalah untuk tujuan kami. Jadi bagaimana caranya Activity dan Context berinteraksi dan apa yang sebenarnya terjadi dalam hubungan warisan mereka?

Sekali lagi, ada baiknya untuk melihat contoh spesifik. Kita semua tahu cara meluncurkan Aktivitas. Asalkan Anda memiliki "konteks" dari mana Anda memulai kegiatan, Anda cukup menelepon startActivity(intent), di mana Intent menggambarkan konteks dari mana Anda memulai suatu Kegiatan dan Kegiatan yang ingin Anda mulai. Ini familiar startActivity(this, SomeOtherActivity.class).

Dan apa this? this adalah Kegiatan Anda karena Activity kelas mewarisi dari Context. Scoop lengkapnya seperti ini: Saat Anda menelepon startActivity, akhirnya Activity kelas mengeksekusi sesuatu seperti ini:

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode);

Jadi itu memanfaatkan execStartActivity dari Instrumentation kelas (sebenarnya dari kelas batin dalam Instrumentation bernama ActivityResult).

Pada titik ini, kita mulai mengintip sistem internal.

Di sinilah OS benar-benar menangani semuanya. Jadi bagaimana Instrumentasi memulai Aktivitas dengan tepat? Nah, param itu this dalam execStartActivity metode di atas adalah Aktivitas Anda, yaitu Konteks, dan execStartActivity memanfaatkan konteks ini.

Ikhtisar 30.000 adalah ini: kelas Instrumentasi menyimpan lintasan daftar Kegiatan yang dipantau untuk melakukan pekerjaannya. Daftar ini digunakan untuk mengkoordinasikan semua kegiatan dan memastikan semuanya berjalan lancar dalam mengelola aliran kegiatan.

Ada beberapa operasi yang belum sepenuhnya saya pelajari yang mengaitkan masalah untaian dan proses. Pada akhirnya, itu ActivityResult menggunakan operasi asli - ActivityManagerNative.getDefault().startActivity() yang menggunakan Context yang kamu lewatkan ketika kamu menelepon startActivity. Konteks yang Anda lewati digunakan untuk membantu dalam "resolusi maksud" jika diperlukan. Maksud resolusi adalah proses dimana sistem dapat menentukan target niat jika tidak diberikan. (Lihat panduan di sini untuk lebih jelasnya).

Dan agar Android dapat melakukan ini, perlu akses ke informasi yang disediakan oleh Context. Khususnya, sistem perlu mengakses ke a ContentResolver sehingga dapat "menentukan jenis data intent MIME". Seluruh ini tentang bagaimana startActivity menggunakan konteks agak rumit dan saya tidak sepenuhnya memahami internal sendiri. Poin utama saya adalah hanya untuk menggambarkan bagaimana sumber daya aplikasi-lebar perlu diakses untuk melakukan banyak operasi yang penting untuk sebuah aplikasi. Context adalah apa yang menyediakan akses ke sumber daya ini.  Contoh yang lebih sederhana mungkin Views. Kita semua tahu apa yang Anda buat Lihat kustom dengan memperluas RelativeLayout atau yang lainnya View kelas, Anda harus menyediakan konstruktor yang membutuhkan Context sebagai sebuah argumen. Ketika Anda instantiate kustom Anda Lihat Anda lulus dalam konteks.  Mengapa? Karena Tampilan harus dapat memiliki akses ke tema, sumber daya, dan rincian konfigurasi Tampilan lainnya. Lihat konfigurasi sebenarnya adalah contoh yang bagus. Setiap Konteks memiliki berbagai parameter (bidang dalam Context’) Yang diatur oleh OS itu sendiri untuk hal-hal seperti dimensi atau kerapatan layar. Sangat mudah untuk melihat mengapa informasi ini penting untuk menyiapkan Tampilan, dll.

Satu kata terakhir:  Untuk beberapa alasan, orang-orang yang baru mengenal Android (dan bahkan orang-orang yang tidak terlalu baru) tampaknya benar-benar melupakan pemrograman berorientasi objek ketika menyangkut Android. Untuk beberapa alasan, orang mencoba membengkokkan pengembangan Android mereka ke paradigma yang telah dipikirkan sebelumnya atau perilaku yang dipelajari.

Android memiliki paradigma itu sendiri dan pola tertentu yang sebenarnya cukup konsisten jika melepaskan gagasan yang telah Anda pahami sebelumnya dan hanya membaca dokumentasi dan panduan dev. Namun, poin saya yang sebenarnya, sementara "mendapatkan konteks yang tepat" kadang-kadang bisa rumit, orang-orang panik tidak adil karena mereka mengalami situasi di mana mereka membutuhkan konteks dan berpikir mereka tidak memilikinya. Sekali lagi, Java adalah bahasa berorientasi objek dengan desain pewarisan.

Anda hanya "memiliki" konteks di dalam Kegiatan Anda karena aktivitas Anda sendiri mewarisi dari Konteks. Tidak ada keajaiban untuk itu (kecuali untuk semua hal yang OS lakukan dengan sendirinya untuk mengatur berbagai parameter dan dengan benar "mengkonfigurasi" konteks Anda). Jadi, letakkan masalah memori / kinerja di samping (misalnya memegang referensi ke konteks ketika Anda tidak perlu atau melakukannya dengan cara yang memiliki konsekuensi negatif pada memori, dll), Konteks adalah objek seperti yang lain dan dapat diedarkan sama seperti POJO (Plain Old Java Object). Terkadang Anda mungkin perlu melakukan hal-hal cerdas untuk mengambil konteks itu, tetapi kelas Java reguler yang memanjang dari apa-apa selain Objek itu sendiri dapat ditulis dengan cara yang memiliki akses ke konteks; hanya mengekspos metode publik yang mengambil konteks dan kemudian menggunakannya di kelas yang diperlukan. Ini tidak dimaksudkan sebagai perawatan menyeluruh pada Konteks atau internal Android, tapi saya harap itu membantu dalam sedikit menjelaskan Konteks.


255
2018-04-30 13:44



Konteks adalah pegangan untuk sistem; ia menyediakan layanan seperti menyelesaikan sumber daya, memperoleh akses ke basis data dan preferensi, dan seterusnya. Konteks adalah seperti pegangan ke lingkungan aplikasi Anda saat ini sedang berjalan masuk. Objek aktivitas mewarisi objek Konteks.

Untuk informasi lebih lanjut, lihat Pengantar pengembangan Android dengan Android Studio - Tutorial.


100
2017-08-26 06:33



Selama Anda berpikir, berpikirlah besar.

Antarmuka ke informasi global tentang lingkungan aplikasi. Ini adalah kelas abstrak yang penerapannya disediakan oleh sistem Android.

Ini memungkinkan akses ke sumber daya dan kelas khusus aplikasi, serta up-panggilan untuk operasi tingkat aplikasi seperti meluncurkan aktivitas, menyiarkan dan menerima maksud, dll.

Activity diagram


64
2017-12-28 08:05



ANDROID DAN KONTEKS

Jika Anda melihat melalui berbagai API Android, Anda akan perhatikan bahwa banyak dari mereka mengambil android.content.Context objek sebagai parameter. Anda juga akan melihat bahwa Aktivitas atau Layanan biasanya digunakan sebagai Konteks. Ini berfungsi karena kedua kelas ini meluas dari Konteks.

Apa Konteks tepatnya?

Sesuai dokumentasi referensi Android, itu adalah entitas yang mewakili berbagai data lingkungan. Ini menyediakan akses ke lokal file, basis data, loader kelas yang terkait dengan lingkungan, layanan termasuk layanan tingkat sistem, dan banyak lagi. Sepanjang buku ini, dan di hari-ke-Anda hari pengodean dengan Android, Anda akan melihat Konteks sering lewat. Dari: "Android in Practice" book.


57
2018-04-28 10:14



Android Konteks adalah Antarmuka yang memungkinkan akses ke sumber daya khusus aplikasi dan kelas dan informasi tentang lingkungan aplikasi.

Jika aplikasi android Anda adalah aplikasi web,   konteks Anda akan menjadi sesuatu   mirip dengan ServletContext (saya tidak membuat perbandingan yang tepat di sini)

Aktivitas dan layanan Anda juga memperluas Konteks untuk mewarisi semua metode tersebut untuk mengakses informasi lingkungan tempat aplikasi dijalankan.


36
2017-08-26 06:40



Contoh Sederhana untuk dipahami context di android:

Setiap bos memiliki asisten untuk dijaga, untuk melakukan semua tugas yang kurang penting dan memakan waktu. Jika sebuah file atau secangkir kopi diperlukan, asisten sedang dalam pelarian. Beberapa bos hampir tidak tahu apa yang sedang terjadi di kantor, jadi mereka bertanya kepada asisten mereka tentang hal ini juga. Mereka melakukan beberapa pekerjaan sendiri tetapi untuk kebanyakan hal lain mereka membutuhkan bantuan dari asisten mereka.

Dalam skenario ini,

Boss - adalah aplikasi Android

Asisten - adalah konteks

File / Secangkir kopi - adalah sumber daya

Kami biasanya menyebut konteks ketika kami perlu mendapatkan informasi tentang berbagai bagian aplikasi kami seperti Aktivitas, Aplikasi, dll.

Beberapa operasi (hal-hal di mana asisten diperlukan) di mana konteksnya terlibat:

Memuat sumber daya umum Menciptakan tampilan dinamis Menampilkan pesan Toast Peluncuran Aktivitas dll. Berbagai cara untuk mendapatkan konteks:

getContext()

getBaseContext()

getApplicationContext()

this

26
2018-05-02 12:37