El uso del método de llamada de Android ContentProvider

Como todos sabemos, ContentProvider se usa para la comunicación entre procesos. Puede implementar métodos de consulta, inserción, eliminación, actualización y getType al heredar ContentProvider para permitir que otros procesos realicen operaciones CRUD en la base de datos de este proceso. Generalmente, esto implica datos grandes En este momento, si la cantidad de datos involucrada es pequeña, simplemente puede implementar la comunicación entre procesos reescribiendo el método de llamada de ContentProvider;

1. Herede ContentProvider y reescriba los métodos y los métodos de llamada que deben implementarse:

package com.example.myapplication

import android.content.ContentProvider
import android.content.ContentValues
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.util.Log

class MyContentProvider: ContentProvider() {

    override fun onCreate(): Boolean {
        return true
    }

    override fun query(
        p0: Uri,
        p1: Array<out String>?,
        p2: String?,
        p3: Array<out String>?,
        p4: String?
    ): Cursor? {
        return null

    }

    override fun getType(p0: Uri): String? {
        return null
    }

    override fun insert(p0: Uri, p1: ContentValues?): Uri? {
        return null
    }

    override fun delete(p0: Uri, p1: String?, p2: Array<out String>?): Int {
        return 0
    }

    override fun update(p0: Uri, p1: ContentValues?, p2: String?, p3: Array<out String>?): Int {
        return 0
    }

    override fun call(method: String, arg: String?, extras: Bundle?): Bundle? {
        Log.d("Alex", "call(method: $method, arg: String?, extras: Bundle?)")
        return super.call(method, arg, extras)
    }

    override fun call(authority: String, method: String, arg: String?, extras: Bundle?): Bundle? {
        Log.d("Alex", "call(authority: String, method: $method, arg: String?, extras: Bundle?)")
        return super.call(authority, method, arg, extras)
    }
}
<provider
            android:name=".MyContentProvider"
            android:authorities="com.example.myapplication.MyContentProvider"
            android:exported="true"/>

2. Simule otro proceso, como un proceso de servicio:

package com.example.myapplication

import android.app.Service
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.IBinder
import androidx.annotation.RequiresApi

class Myservice: Service() {

    companion object {
        const val URI: String = "content://com.example.myapplication.MyContentProvider/"
    }

    @RequiresApi(Build.VERSION_CODES.Q)
    override fun onCreate() {
        super.onCreate()
        // contentResolver通过Context实例可以拿到
        contentResolver.call(Uri.parse(URI), "onEvent", "", null)
    }

    override fun onBind(p0: Intent?): IBinder? {
        TODO("Not yet implemented")
    }
}
        <service
            android:name=".Myservice"
            android:process=":myservice"></service>

3. Encuentre un lugar para iniciar el proceso de servicio:

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
        // TODO: Use the ViewModel
        activity?.startService(Intent(activity, Myservice::class.java))

    }

4. Imprima el resultado, indicando que se ha realizado la comunicación entre procesos y que el proceso de servicio ha llamado al método de llamada de ContentProvider:

2022-12-25 12:15:47.685 10970-18681/com.example.myapplication D/Alex: call(autoridad: Cadena, método: onEvent, arg: String?, extras: Bundle?) 2022-12-25 12
: 15:47.685 10970-18681/com.example.myapplication D/Alex: call(método: onEvent, arg: String?, extras: Bundle?)

Aquí ya puede ver el nombre del método "onEvent" pasado, y se pueden personalizar otros parámetros.

Bueno, puedes divertirte de nuevo.

Supongo que te gusta

Origin blog.csdn.net/msn465780/article/details/128434269
Recomendado
Clasificación