360插件化方案RePlugin学习笔记-插件使用宿主中的类
使用场景1:插件的xml布局中有以宿主的全类名作为节点的时候
在application配置RePluginConfig时,有一行代码是:
// 允许“插件使用宿主类”。默认为“关闭”c.setUseHostClassIfNotFound(true);
这行代码设置为true时,插件项目中找不到该类,会在宿主项目中查找。
使用场景2:插件代码中用到宿主项目的类及类中的字段、内部类等的时候
宿主项目类
/*** Created by qby on 2018/2/23 0023.* 演示“插件”使用“宿主”类*/class SpUtil {companion object {fun builder(): SpBuilder {return SpBuilder()}}class SpBuilder {var sp: SharedPreferences? = nullvar str: String? = nullfun getSp(context: Context): SpBuilder {if (sp == null) {synchronized(SpUtil::class.java) {if (sp == null) {sp = context.applicationContext.getSharedPreferences("testReplugin", Context.MODE_PRIVATE)}}}return this}fun putString(key: String, value: String): SpBuilder {sp!!.edit().putString(key, value).apply()return this}fun getString(key: String, defValue: String): SpBuilder {str = sp!!.getString(key, defValue)return this}}
}
在跳转到插件页面之前存储:
SpUtil.builder().getSp(this).putString("first","测试")
在跳转到插件页面之后取值,插件代码(使用反射)
//获取宿主类加载器val hostClassLoader = RePlugin.getHostClassLoader()//获取SpUtil类val clazz = hostClassLoader.loadClass("com.test.qby.myapplication.utils.SpUtil")//取得内部类,只有一个SpBuilder val declaredClass = clazz.declaredClasses[0]//初始化SpBuilder 对象val newInstance = declaredClass.newInstance()//得到getSp方法val method0 = declaredClass.getDeclaredMethod("getSp",Context::class.java)//调用getSp方法,将值赋给spmethod0.invoke(newInstance, RePlugin.getHostContext())//得到getString方法val method1 = declaredClass.getDeclaredMethod("getString",String::class.java,String::class.java)//调用getString方法,将值赋给strmethod1.invoke(newInstance, "first", "默认")//得到getStr方法val method2 = declaredClass.getDeclaredMethod("getStr")//调用getStr方法,获取str值val get = method2.invoke(newInstance)//弹出提示Toast.makeText(this, get.toString(), Toast.LENGTH_SHORT).show()
使用场景3:插件调用宿主类中的方法
其实这个应该算是通信方式,通过场景2中的反射可以实现,还可以通过aidl进程中通信方式在宿主项目中暴露一些方法,供插件调用。
以在宿主中存储,在插件中通过aidl取值为例。
宿主项目在main下新建包,在包下新建aidl文件,结构如下图:
如图所示,新建ISpImpl类继承ISp.Stub,代码如下:
/*** Created by qby on 2018/2/24 0024.* AIDL 实现类*/class ISpImpl : ISp.Stub() {@Throws(RemoteException::class)override fun getString(key: String, defValue: String): String? {return SpUtil.builder().getSp(SampleApplication.getContext()).getString(key, defValue).str}
}
暴露出getString方法,在SampleApplication中注册全局的IBinder,在其他地方注册也行,但要在你调用aidl前注册:
//注册全局IBinder,host为自定义注册的名字
RePlugin.registerGlobalBinder("host", ISpImpl())
插件项目中新建与宿主项目下包名一致的aidl,结构如下图:
代码中调用:
//根据名字获取注册的IBinder
val globalBinder = RePlugin.getGlobalBinder("host")//获取ISp实现类
val asInterface = ISp.Stub.asInterface(globalBinder)try {//调用方法,获取返回值val string = asInterface.getString("first", "尝试")//弹出提示Toast.makeText(this, string.toString(), Toast.LENGTH_SHORT).show()} catch (e: RemoteException) {//捕获异常e.printStackTrace()
}
用到反射的地方写起来代码比较多,真正用的时候还是要抽取放到工具类里,优化一下代码。
以上仅个人学习记录,如有疏漏或谬误,欢迎留言交流!
360插件化方案RePlugin学习笔记-插件使用宿主中的类相关推荐
- Java快速入门学习笔记7 | Java语言中的类与对象
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- 360 java插件设置_360插件化方案RePlugin初体验
前天跟朋友聊天提到他们要做个跟360插件化方案类似的框架,领导让他们先了解一下360的实现思路,我也就跟着尝试了一下. RePlugin 是一套完整的.稳定的.适合全面使用的,占坑类插件化方案,由36 ...
- 滴滴插件化方案 VirtualApk 源码解析
本文已在我的公众号hongyangAndroid原创首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/75000580 本文 ...
- 爱奇艺开源轻量级插件化方案 Neptune
爱奇艺近日开源了其轻量级插件化方案 Neptune,项目地址:https://github.com/iqiyi/Neptune 插件化框架可以在主程序不重新安装的情况下,针对单个业务模块进行动态加载达 ...
- Cordova插件使用和开发学习笔记
Cordova插件使用和开发学习笔记 1. Cordova插件开发 1.1 环境搭建 1.2 插件初始化 1.3 插件完善 1.4 plugin.xml 2. Cordova插件使用 2.1 创建项目 ...
- Android插件化原理解析——ContentProvider的插件化
目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...
- Android 插件化原理解析——Service的插件化
在 Activity生命周期管理 以及 广播的管理 中我们详细探讨了Android系统中的Activity.BroadcastReceiver组件的工作原理以及它们的插件化方案,相信读者已经对Andr ...
- 插件化原理解析——ContentProvider的插件化
目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...
- 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “插件包“ 中的 Element[] dexElements )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
最新文章
- NeurIPS 2020 大变动,领域主席可拒稿20%,作者即评审,布局远程会议!
- react-native侧滑
- 《Linux From Scratch》第一部分:介绍 第一章:介绍-1.3. 更新日志
- s5-11 距离矢量路由选择协议
- react中实现异步请求的方法一,react-thunk
- Linux 本地密码正确无法登录,记一次无法正常本地登陆Linux服务器(确定密码正确)...
- java println 数组_java 数组输出
- 我的《野蛮生长》书摘
- 游戏化设计:平台用户激励系统——互联网平台建设...
- LVS小型系统架构搭建笔记
- Linux 命令(33)—— uname 命令
- 软件工程 四则运算(结对编程)
- kafka创耳机_生产环境一键创建kafka集群
- python cpk 计算
- Qos介绍及功能->分类标记->流量管理(令牌桶)->拥塞管理与拥塞避免
- 【基础】Premultiplied Alpha Blending/Alpha预乘/透明图片黑边
- access行列转换。
- Qt Quick事件处理之鼠标 键盘 定时器
- 大地测量控制点坐标转换技术规范
- C# 如何在Excel表格中插入、编辑和删除批注(三)删除Excel批注