android ContentProvider call方法的使用

总所周知,ContentProvider用于跨进程通信,可以通过继承ContentProvider实现query、insert、delete、update、getType方法,来让其他进程对本进程的数据库进行CRUD增删改查操作,一般这是涉及到数据大的时候,如果涉及的数据量很小,可以通过重写ContentProvider的call 方法来简单实现跨进程通信;

1、继承ContentProvider,重写必须实现的方法和call方法:

package com.example.myapplicationimport android.content.ContentProvider
import android.content.ContentValues
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.util.Logclass MyContentProvider: ContentProvider() {override fun onCreate(): Boolean {return true}override fun query(p0: Uri,p1: Array?,p2: String?,p3: Array?,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?): Int {return 0}override fun update(p0: Uri, p1: ContentValues?, p2: String?, p3: Array?): 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)}
}

2、模拟一个其他进程,比如服务进程:

package com.example.myapplicationimport android.app.Service
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.IBinder
import androidx.annotation.RequiresApiclass 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")}
}
        

3、找个地方开启这个服务进程:

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

4、打印结果,表明已经实现了跨进程通信,服务进程已经调用了ContentProvider的call方法:

2022-12-25 12:15:47.685 10970-18681/com.example.myapplication D/Alex: call(authority: String, method: onEvent, arg: String?, extras: Bundle?)
2022-12-25 12:15:47.685 10970-18681/com.example.myapplication D/Alex: call(method: onEvent, arg: String?, extras: Bundle?)

这里已经能看到传过来的method方法名“onEvent” , 其他参数都可以自定义哈。

好了,又可以愉快玩耍了。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部