override fun getCount(): Int {
println(“Server: getCount”)
return 100
}
}
ContentProvider定义
接着注册并定义一个运行在服务端进程的 ContentProvider 对象:
class BinderProvider : ContentProvider() {
override fun onCreate(): Boolean = true
override fun query(
uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?
): Cursor {
return BinderCursor.binderCursor
}
override fun getType(uri: Uri): String? = null
override fun insert(uri: Uri, values: ContentValues?): Uri? = null
override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int = 0
override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int = 0
}
这里 query 方法中返回的 Cursor 对象是一个 BinderCursor.binderCursor, BinderCursor 继承自 MatrixCursor 类,其内保存有服务端 Binder 对象:
class BinderCursor private constructor() : MatrixCursor(arrayOf(“service”)) {
companion object {
private const val KEY_BINDER_COUNT = “key_binder Android开源项目《ali1024.coding.net/public/P7/Android/git》 _count”
val binderCursor = BinderCursor()
fun getCountService(cursor: Cursor?): IBinder? {
return cursor?.extras?.getBinder(KEY_BINDER_COUNT)
}
}
private val mBinderExtra = Bundle()
init {
mBinderExtra.putBinder(KEY_BINDER_COUNT, CountServiceImpl())
}
override fun getExtras(): Bundle {
return mBinderExtra
} 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》开源
}
然后在 Manifest 中注册:
Client进程
客户端进程通过以下方法可以获取到 Binder 代理对象,并远程调用服务端接口:
最后
说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。