Content Provider: apa itu, arsitektur komponen dan prinsip kerja

Penulis: IT Sectr Diterbitkan: 2026-06-17 Waktu membaca: 8 mnt

Content Provider — adalah komponen Android yang menyediakan antarmuka terpadu untuk akses data antar aplikasi. Ia mengabstraksi penyimpanan fisik (SQLite, file, sumber jaringan) dan memastikan pertukaran informasi yang aman melalui ContentResolver. Menurut Android Developer Guide, 2026, Content Provider adalah salah satu dari empat komponen utama aplikasi Android bersama dengan Activity, Service, dan BroadcastReceiver. Tugasnya adalah membuat data tersedia bagi aplikasi lain dengan kontrol izin baca dan tulis.

Poin Utama

  • Content Provider — komponen Android standar untuk pertukaran data antar aplikasi melalui antarmuka ContentResolver.
  • URI (content://) mengidentifikasi tabel atau rekaman dan digunakan untuk semua operasi CRUD dengan penyedia.
  • UriMatcher — kelas pembantu yang mengurai URI masuk dan menentukan tabel atau baris mana yang diminta.
  • Izin baca dan tulis ditetapkan dalam manifes dan diminta dari pengguna saat pemasangan.
  • CursorLoader atau Room dengan Content Provider menyediakan pemuatan data asinkron dari penyedia tanpa memblokir thread UI.

Apa itu Content Provider?

Content Provider — adalah komponen Android yang mengelola akses ke penyimpanan data terpusat dan menyediakannya kepada aplikasi lain melalui antarmuka kontrak terpadu. Ia menyembunyikan detail implementasi penyimpanan: data dapat disimpan di SQLite, sistem file, cloud, atau menjadi hasil permintaan jaringan.

Android menyertakan Content Provider bawaan untuk data sistem — ContactsContract, MediaStore, CalendarContract, CallLog. Aplikasi pihak ketiga juga dapat membuat penyedia mereka sendiri untuk pertukaran data yang aman. Setiap penyedia didaftarkan di AndroidManifest.xml dengan menentukan authority — string unik yang membentuk bagian pertama URI.

Bagaimana Content Provider Bekerja

Content Provider bekerja berdasarkan model klien-server. Penyedia bertindak sebagai server yang mengimplementasikan enam metode wajib: query, insert, update, delete, getType, dan onCreate. Klien (aplikasi lain) mengakses penyedia melalui ContentResolver yang meneruskan panggilan ke metode penyedia yang sesuai melalui mekanisme IPC Android.

URI dan authority

Setiap Content Provider diidentifikasi oleh URI skema content://. Misalnya, content://com.example.app.provider/items. Bagian pertama authority (com.example.app.provider) terikat ke kelas penyedia di manifes. Jalur /items menunjuk ke tabel, dan /items/5 — ke rekaman tertentu dengan ID=5.

Proses pemanggilan

Ketika aplikasi memanggil ContentResolver.query(URI), Android memeriksa izin paket pemanggil, menemukan penyedia berdasarkan authority, dan memulai prosesnya jika belum berjalan. Penyedia menjalankan kueri dan mengembalikan Cursor — objek yang berisi hasil dan memungkinkan klien untuk melakukan iterasi melalui rekaman.

Metode Utama Content Provider

Kelas ContentProvider memerlukan implementasi enam metode abstrak. Setiap metode menerima URI dan mengembalikan hasil yang sesuai dengan jenis operasi. Sistem memanggil metode ini dari proses mana pun, sehingga harus thread-safe dan tidak memblokir eksekusi untuk waktu yang lama.

Metode query

Metode query menerima URI, array kolom projection, string selection dengan argumen, dan urutan pengurutan. Mengembalikan Cursor dengan data. Dalam implementasi, URI perlu diurai menggunakan UriMatcher dan menjalankan kueri SQL yang sesuai ke database.

Metode insert, update, delete

Metode ini mengubah data di penyimpanan. insert menerima ContentValues — pasangan kunci-nilai — dan mengembalikan URI rekaman baru. update dan delete menerima selection untuk memfilter rekaman dan mengembalikan jumlah baris yang terpengaruh. Setelah mengubah data, penyedia harus memberi tahu melalui ContentResolver.notifyChange.

MetodeTujuanKembalian
queryMendapatkan data berdasarkan URICursor atau null
insertMenambahkan rekaman baruURI rekaman baru
updateMemperbarui rekaman yang adaint (jumlah baris)
deleteMenghapus rekamanint (jumlah baris)
getTypeTipe MIME untuk URIString
onCreateInisialisasi penyediaboolean

ContentResolver dan URI di Android

ContentResolver — adalah titik akses tunggal untuk bekerja dengan semua Content Provider di sistem. Aplikasi klien tidak pernah memanggil metode penyedia secara langsung — hanya melalui ContentResolver, yang diperoleh Android dari konteks. Operasi CRUD di ContentResolver memiliki nama yang sama seperti di penyedia, tetapi menerima URI sebagai pengganti referensi langsung.

UriMatcher

Untuk mengurai URI masuk di dalam penyedia, digunakan UriMatcher. Ini memungkinkan pencocokan URI dengan kode numerik — misalnya, URI content://authority/items menghasilkan kode 1, dan content://authority/items/# — kode 2. Ini menghilangkan kebutuhan penguraian manual string URI di setiap metode.

kotlin
// Menggunakan ContentResolver untuk mengakses kontak
val uri = ContactsContract.Contacts.CONTENT_URI
val cursor = contentResolver.query(
    uri,
    arrayOf(ContactsContract.Contacts.DISPLAY_NAME),
    null, null, null
)
cursor?.use {
    while (it.moveToNext()) {
        val name = it.getString(it.getColumnIndexOrThrow(
            ContactsContract.Contacts.DISPLAY_NAME
        ))
        Log.d("Kontak", "Nama: $name")
    }
}

Cursor harus ditutup setelah digunakan — dalam contoh di atas, use (fungsi ekstensi Kotlin) melakukannya. Jika Cursor tidak ditutup, akan terjadi kebocoran memori karena ia memegang referensi ke data di kumpulan Binder. Untuk skenario UI, gunakan CursorLoader atau Room dengan LiveData/Flow.

Contoh Content Provider di Kotlin

Membuat Content Provider sendiri dimulai dengan mewarisi kelas ContentProvider. Penyedia bekerja dengan database SQLite melalui SQLiteOpenHelper dan menggunakan UriMatcher untuk menentukan jenis kueri. Mari kita lihat implementasi minimal untuk mengelola daftar catatan.

Pendaftaran di manifes

Penyedia didaftarkan di AndroidManifest.xml di dalam tag application. Atribut authorities menetapkan pengidentifikasi unik, dan exported menentukan apakah aplikasi lain dapat mengakses penyedia. Tanpa exported=true, penyedia hanya dapat diakses di dalam aplikasi Anda.

kotlin
// Contoh Content Provider untuk catatan
class NotesProvider : ContentProvider() {

    companion object {
        const val AUTHORITY = "com.example.app.notes"
        const val NOTES_PATH = "notes"
        const val NOTES_URI = "content://$AUTHORITY/$NOTES_PATH"
        const val NOTES_ID = "content://$AUTHORITY/$NOTES_PATH/#"

        private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply {
            addURI(AUTHORITY, NOTES_PATH, 1)
            addURI(AUTHORITY, "$NOTES_PATH/#", 2)
        }
    }

    override fun query(uri: Uri, projection: Array<String>?,
        selection: String?, args: Array<String>?, sort: String?): Cursor? {
        return when (uriMatcher.match(uri)) {
            1 -> dbHelper.readableDatabase.query(TABLE_NOTES,
                projection, selection, args, null, null, sort)
            2 -> dbHelper.readableDatabase.query(TABLE_NOTES,
                projection, "_id=?", arrayOf(uri.lastPathSegment), null, null, null)
            else -> throw IllegalArgumentException("Unknown URI: $uri")
        }
    }

    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        val id = dbHelper.writableDatabase.insert(TABLE_NOTES, null, values)
        context?.contentResolver?.notifyChange(uri, null)
        return ContentUris.withAppendedId(uri, id)
    }

    override fun delete(uri: Uri, selection: String?, args: Array<String>?): Int {
        val count = dbHelper.writableDatabase.delete(TABLE_NOTES, selection, args)
        context?.contentResolver?.notifyChange(uri, null)
        return count
    }

    // getType, update, onCreate dihilangkan untuk singkatnya
}

Setelah membuat kelas, penyedia harus didaftarkan di manifes dengan atribut android:authorities dan android:exported (true jika penyedia bersifat publik). Sistem membuat instance penyedia pada akses pertama — ini terjadi di thread UI, sehingga onCreate harus dijalankan dengan cepat.

Melindungi Data melalui Izin

Content Provider memungkinkan pengelolaan akses ke data pada dua tingkat: izin baca dan izin tulis. Ini ditetapkan di manifes dengan atribut android:readPermission dan android:writePermission. Jika aplikasi klien tidak memiliki izin yang sesuai, sistem akan menolak panggilan dengan SecurityException.

Izin tingkat URI

Android mendukung izin sementara melalui flag FLAG_GRANT_READ_URI_PERMISSION dan FLAG_GRANT_WRITE_URI_PERMISSION. Ini berguna ketika aplikasi mengirimkan URI file ke aplikasi lain melalui Intent — penerima hanya mendapatkan akses ke URI tertentu untuk waktu terbatas. Sistem mencabut izin sementara setelah aplikasi penerima selesai.

Untuk penyedia sistem, Android memerlukan penetapan izin konkret di manifes aplikasi. Misalnya, untuk akses ke kontak diperlukan READ_CONTACTS, untuk kalender — READ_CALENDAR. Mulai Android 6, izin ini diminta saat runtime, bukan saat pemasangan.

Pertanyaan yang Sering Diajukan

Apa itu Content Provider di Android?

Content Provider — adalah komponen Android yang menyediakan antarmuka standar untuk pertukaran data antar aplikasi melalui ContentResolver. Ia mengabstraksi metode penyimpanan (SQLite, file, jaringan) dan menyediakan akses aman ke data dengan kontrol izin baca dan tulis.

Apa itu authority di Content Provider?

Authority — adalah string pengidentifikasi unik penyedia yang ditentukan di AndroidManifest.xml. Ini membentuk bagian pertama URI content://authority/path dan digunakan oleh sistem untuk merutekan panggilan ContentResolver ke penyedia yang tepat. Authority harus unik di antara semua aplikasi di perangkat.

Bagaimana cara kerja UriMatcher di Content Provider?

UriMatcher mencocokkan URI dengan kode numerik. Anda menambahkan pola melalui addURI, lalu memanggil match untuk mendapatkan kode URI yang masuk. Ini memungkinkan dalam metode query, insert, update, delete untuk menentukan tabel atau rekaman mana yang diminta dan menjalankan operasi yang sesuai pada database.

Apakah Cursor harus ditutup setelah bekerja dengan ContentResolver?

Ya, Cursor harus ditutup setelah digunakan. Jika Cursor tidak ditutup, akan terjadi kebocoran memori karena ia memegang referensi Binder ke data penyedia. Di Kotlin, gunakan fungsi use untuk penutupan otomatis, dan di Java — try-with-resources atau panggilan cursor.close() di blok finally.

Apa perbedaan Content Provider dengan SQLiteDatabase?

Content Provider — adalah komponen untuk akses data antar aplikasi, sementara SQLiteDatabase adalah penyimpanan internal satu aplikasi. Content Provider menyediakan antarmuka URI dan kontrol izin, sedangkan SQLiteDatabase bekerja langsung dengan database tanpa mekanisme keamanan di tingkat sistem operasi.

Kesimpulan

  • Content Provider — adalah komponen Android standar untuk pertukaran data aman antar aplikasi melalui antarmuka ContentResolver terpadu.
  • URI skema content://authority/path/id mengidentifikasi penyedia, tabel, dan rekaman tertentu — setiap segmen memiliki tujuan yang ketat.
  • UriMatcher menyederhanakan penguraian URI masuk di dalam penyedia, menghilangkan penguraian manual string di setiap metode CRUD.
  • Penyedia didaftarkan di AndroidManifest.xml dengan atribut authorities dan exported — ini adalah mekanisme sistem tanpa yang penyedia tidak akan berfungsi.
  • ContentValues diteruskan ke insert dan update sebagai kumpulan pasangan kunci-nilai, dan Cursor dikembalikan dari query untuk iterasi melalui hasil.
  • Izin readPermission dan writePermission di manifes mengontrol akses ke data, dan FLAG_GRANT_URI_PERMISSION memberikan akses sementara ke URI tertentu.
  • Untuk pemuatan data asinkron dari Content Provider, gunakan CursorLoader, Room dengan ContentProvider, atau LoaderManager — ini mencegah pemblokiran thread UI.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga