Content Provider: mi ez, a komponens architektúrája és működési elve

Szerző: IT Sectr Megjelenés: 2026-06-17 Olvasási idő: 8 perc

Content Provider — egy Android komponens, amely egységes interfészt biztosít az alkalmazások közötti adathozzáféréshez. Elvonatkoztatja a fizikai tárolást (SQLite, fájlok, hálózati források), és biztonságos információcserét tesz lehetővé a ContentResolver segítségével. A Android Developer Guide, 2026 szerint a Content Provider az Android alkalmazás négy alapvető komponensének egyike az Activity, Service és BroadcastReceiver mellett. Feladata, hogy az adatokat elérhetővé tegye más alkalmazások számára az olvasási és írási engedélyek ellenőrzésével.

Főbb pontok

  • Content Provider — szabványos Android komponens az alkalmazások közötti adatcseréhez a ContentResolver interfészen keresztül.
  • URI (content://) azonosítja a táblát vagy rekordot, és minden CRUD művelethez használatos a szolgáltatónál.
  • UriMatcher — egy segédosztály, amely elemzi a bejövő URI-kat, és meghatározza, melyik tábla vagy sor került lekérdezésre.
  • Engedélyek olvasáshoz és íráshoz a manifestben kerülnek beállításra, és telepítéskor a felhasználótól kérjük őket.
  • CursorLoader vagy Room a Content Provider-rel aszinkron adatbetöltést biztosít a szolgáltatótól a UI szál blokkolása nélkül.

Mi az a Content Provider?

Content Provider — egy Android komponens, amely kezeli a hozzáférést egy központosított adattárolóhoz, és más alkalmazások számára elérhetővé teszi azokat egy egységes szerződéses interfészen keresztül. Elrejti a tárolás implementációs részleteit: az adatok tárolhatók SQLite-ban, fájlrendszeren, felhőben, vagy lehetnek hálózati kérés eredményei.

Az Android beépített Content Provider-eket tartalmaz a rendszeradatokhoz — ContactsContract, MediaStore, CalendarContract, CallLog. Harmadik féltől származó alkalmazások is létrehozhatják saját szolgáltatóikat a biztonságos adatcseréhez. Minden szolgáltató regisztrálva van az AndroidManifest.xml-ben az authority — az URI első részét képező egyedi karakterlánc — megadásával.

Hogyan működik a Content Provider

A Content Provider a kliens-szerver modell szerint működik. A szolgáltató szerverként működik, amely hat kötelező metódust implementál: query, insert, update, delete, getType és onCreate. A kliens (másik alkalmazás) a ContentResolver-en keresztül fér hozzá a szolgáltatóhoz, amely az Android IPC mechanizmusán keresztül továbbítja a hívásokat a szolgáltató megfelelő metódusaihoz.

URI és authority

Minden Content Provider-t egy URI azonosít a content:// séma szerint. Például content://com.example.app.provider/items. Az első rész authority (com.example.app.provider) a szolgáltató osztályához van kötve a manifestben. A /items útvonal egy táblára, a /items/5 pedig egy adott ID=5 rekordra mutat.

A hívás folyamata

Amikor egy alkalmazás meghívja a ContentResolver.query(URI)-t, az Android ellenőrzi a hívó csomag engedélyeit, megtalálja a szolgáltatót az authority alapján, és elindítja a folyamatát, ha még nem fut. A szolgáltató végrehajtja a lekérdezést, és visszaad egy Cursor-t — egy objektumot, amely tartalmazza az eredményt, és lehetővé teszi a kliens számára a rekordokon keresztüli iterálást.

A Content Provider fő metódusai

A ContentProvider osztály hat absztrakt metódus implementálását igényli. Minden metódus fogad egy URI-t, és a művelet típusának megfelelő eredményt ad vissza. A rendszer ezeket a metódusokat bármely folyamatból meghívhatja, ezért azoknak szálbiztosaknak kell lenniük, és nem blokkolhatják a végrehajtást hosszú ideig.

query metódus

A query metódus fogad egy URI-t, egy oszloptömböt (projection), egy selection karakterláncot argumentumokkal és a rendezési sorrendet. Visszaad egy Cursor-t adatokkal. Az implementációban az URI-t az UriMatcher segítségével kell elemezni, és a megfelelő SQL lekérdezést végrehajtani az adatbázison.

insert, update, delete metódusok

Ezek a metódusok módosítják az adatokat a tárolóban. Az insert fogadja a ContentValues-t — kulcs-érték párokat — és visszaadja az új rekord URI-ját. Az update és delete a selection-t fogadja a rekordok szűréséhez, és visszaadja az érintett sorok számát. Az adatok módosítása után a szolgáltatónak értesítenie kell erről a ContentResolver.notifyChange-en keresztül.

MetódusCélVisszatérési érték
queryAdatok lekérése URI alapjánCursor vagy null
insertÚj rekord hozzáadásaAz új rekord URI-ja
updateMeglévő rekordok frissítéseint (sorok száma)
deleteRekordok törléseint (sorok száma)
getTypeMIME típus URI-hozString
onCreateA szolgáltató inicializálásaboolean

ContentResolver és URI Androidban

ContentResolver — egy egységes hozzáférési pont az összes Content Provider-rel való munkához a rendszerben. A kliens alkalmazás soha nem hívja meg közvetlenül a szolgáltató metódusait — csak a ContentResolver-en keresztül, amelyet az Android a kontextusból szerez. A CRUD műveletek a ContentResolver-ben ugyanazokkal a nevekkel rendelkeznek, mint a szolgáltatónál, de közvetlen referenciák helyett URI-t fogadnak.

UriMatcher

A bejövő URI-k elemzéséhez a szolgáltatón belül a UriMatcher használatos. Lehetővé teszi az URI numerikus kóddal való összerendelését — például a content://authority/items URI 1-es kódot ad, a content://authority/items/# pedig 2-es kódot. Ez kiküszöböli az URI karakterlánc manuális elemzésének szükségességét minden metódusban.

kotlin
// ContentResolver használata névjegyek eléréséhez
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("Névjegyek", "Név: $name")
    }
}

A Cursor-t használat után be kell zárni — a fenti példában ezt a use (Kotlin kiterjesztő függvény) teszi. Ha a Cursor nincs bezárva, memóriaszivárgás lép fel, mert referenciát tart a Binder poolban lévő adatokra. UI forgatókönyvekhez használja a CursorLoader-t vagy a Room-ot LiveData/Flow-val.

Content Provider példa Kotlinban

A saját Content Provider létrehozása a ContentProvider osztályból való származtatással kezdődik. A szolgáltató SQLite adatbázissal dolgozik az SQLiteOpenHelper segítségével, és az UriMatcher-t használja a lekérdezés típusának meghatározásához. Tekintsünk egy minimális implementációt a jegyzetek listájának kezelésére.

Regisztráció a manifestben

A szolgáltató regisztrálása az AndroidManifest.xml-ben az application tagon belül történik. Az authorities attribútum egy egyedi azonosítót állít be, az exported pedig meghatározza, hogy más alkalmazások hozzáférhetnek-e a szolgáltatóhoz. exported=true nélkül a szolgáltató csak az Ön alkalmazásán belül érhető el.

kotlin
// Példa Content Provider jegyzetekhez
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 kihagyva a rövidség kedvéért
}

Az osztály létrehozása után a szolgáltatót regisztrálni kell a manifestben az android:authorities és android:exported (true, ha a szolgáltató nyilvános) attribútumokkal. A rendszer a szolgáltató egy példányát az első hozzáféréskor hozza létre — ez a UI szálon történik, ezért az onCreate-nek gyorsan kell végrehajtódnia.

Adatvédelem engedélyeken keresztül

A Content Provider lehetővé teszi az adatokhoz való hozzáférés kezelését két szinten: olvasási engedélyek és írási engedélyek. Ezek a manifestben az android:readPermission és android:writePermission attribútumokkal kerülnek beállításra. Ha a kliens alkalmazás nem rendelkezik a megfelelő engedéllyel, a rendszer SecurityException kivétellel elutasítja a hívást.

URI szintű engedély

Az Android támogatja az ideiglenes engedélyeket a FLAG_GRANT_READ_URI_PERMISSION és FLAG_GRANT_WRITE_URI_PERMISSION jelzőkön keresztül. Ez akkor hasznos, amikor egy alkalmazás egy fájl URI-ját Intent-en keresztül továbbítja egy másik alkalmazásnak — a fogadó csak az adott URI-hoz fér hozzá korlátozott ideig. A rendszer visszavonja az ideiglenes engedélyt a fogadó alkalmazás befejezése után.

A rendszerszolgáltatók esetében az Android megköveteli a konkrét engedélyek megadását az alkalmazás manifestjében. Például a névjegyek eléréséhez READ_CONTACTS, a naptárhoz READ_CALENDAR szükséges. Az Android 6-tól kezdve ezek az engedélyek futásidőben kérvényezendők, nem telepítéskor.

Gyakran Ismételt Kérdések

Mi az a Content Provider Androidban?

Content Provider — egy Android komponens, amely szabványos interfészt biztosít az alkalmazások közötti adatcseréhez a ContentResolver-en keresztül. Elvonatkoztatja a tárolási módot (SQLite, fájlok, hálózat), és biztonságos adathozzáférést biztosít az olvasási és írási engedélyek ellenőrzésével.

Mi az authority a Content Provider-ben?

Authority — a szolgáltató egyedi azonosító karakterlánca, amely az AndroidManifest.xml-ben van megadva. Ez képezi a content://authority/path URI első részét, és a rendszer a ContentResolver hívásoknak a megfelelő szolgáltatóhoz való irányításához használja. Az authority-nek egyedinek kell lennie az eszköz összes alkalmazása között.

Hogyan működik az UriMatcher a Content Provider-ben?

UriMatcher az URI-kat numerikus kódokkal rendeli össze. A addURI-n keresztül ad hozzá mintákat, majd a match meghívásával kapja meg a kódot a bejövő URI-hoz. Ez lehetővé teszi a query, insert, update, delete metódusokban annak meghatározását, hogy melyik tábla vagy rekord került lekérdezésre, és a megfelelő művelet végrehajtását az adatbázison.

Be kell zárni a Cursor-t a ContentResolver-rel való munka után?

Igen, a Cursor-t használat után be kell zárni. Ha a Cursor nincs bezárva, memóriaszivárgás lép fel, mert Binder referenciát tart a szolgáltató adataihoz. Kotlinban használja a use függvényt az automatikus záráshoz, Java-ban pedig a try-with-resources vagy a cursor.close() hívást a finally blokkban.

Miben különbözik a Content Provider a SQLiteDatabase-től?

Content Provider — egy komponens az alkalmazások közötti adathozzáféréshez, míg a SQLiteDatabase egy alkalmazás belső tárolója. A Content Provider URI interfészt és engedélyellenőrzést biztosít, a SQLiteDatabase pedig közvetlenül az adatbázissal dolgozik operációs rendszer szintű biztonsági mechanizmusok nélkül.

Összefoglalás

  • Content Provider — a szabványos Android komponens a biztonságos adatcseréhez az alkalmazások között egy egységes ContentResolver interfészen keresztül.
  • A content://authority/path/id séma URI-ja azonosítja a szolgáltatót, táblát és konkrét rekordot — minden szegmensnek szigorú célja van.
  • UriMatcher leegyszerűsíti a bejövő URI-k elemzését a szolgáltatón belül, kiküszöbölve a karakterláncok manuális elemzését minden CRUD metódusban.
  • A szolgáltató az AndroidManifest.xml-ben kerül regisztrálásra az authorities és exported attribútumokkal — ez az a rendszermechanizmus, amely nélkül a szolgáltató nem működik.
  • ContentValues kulcs-érték párok halmazaként kerülnek átadásra az insert és update számára, a Cursor pedig a query-ből kerül visszaadásra az eredményeken való iteráláshoz.
  • A readPermission és writePermission engedélyek a manifestben szabályozzák az adatokhoz való hozzáférést, a FLAG_GRANT_URI_PERMISSION pedig ideiglenes hozzáférést biztosít egy adott URI-hoz.
  • A Content Provider-ből történő aszinkron adatbetöltéshez használja a CursorLoader-t, a Room-ot ContentProvider-rel vagy a LoaderManager-t — ez megakadályozza a UI szál blokkolását.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is