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.