Android进程间通信之ContentProvider小技巧
最近做VOIP项目 , 使用到多进程 . 在通话模块进程中 , 来电时需要到主进程查询联系人信息 , 进行显示 , 通过CSipSmiple的多进程配置保存 , 学到了一个ContentProvider的进行进程间通信的小技巧 , 为此写了个小的案例
案例
主进程的MainActivity的产生一个随机数 R , 远端进程的RemoteActiviy通过进程间通信获取 R , 并进行显示
代码
ContentProvider的创建和一般的创建一致 , 主要看增删改查等方法 , 这里只实现了query方法 :
IPCProvider
override fun query(uri: Uri?, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor {
// 创建一张虚拟的表 , 设置 name , value 两个字段
val mc = MatrixCursor(arrayOf(fieldName, fieldValue))
if (uriMatcher.match(uri) == ipc) {
val field = uri?.lastPathSegment
var value: String?
value = when (field) {
// 获取主进程MainActivity产生的随机数
IPCWrapper.VALUE -> MainActivity.value.toString()
else -> "-1"
}
// 将获取到的随机数添加到虚拟的表中
mc.addRow(arrayOf(field, value))
}
return mc
}
使用方式和一般的ContentProvider使用方式一样 , 这里进行了简单的实现 :
IPCWrapper
fun getLocalValue(context: Context, field: String?): String? {
logi("getLocalValue : " + field)
// 通过指定的字段生产Uri
val uri = getIPCUriForField(field)
// 进行查询 , 如果需要携带一些条件的话 , 可以放在selection参数中
val cursor = context.contentResolver.query(uri, null, null, null, null)
var value: String? = null
if (cursor != null) {
cursor.moveToFirst()
// 获取主进程MainActivity产生的随机数
value = cursor.getString(1)
cursor.close()
}
return value
}
private fun getIPCUriForField(field: String?): Uri {
return Uri.withAppendedPath(IPCProvider.ipcUriBase, field ?: "")
}