使用场景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学习笔记-插件使用宿主中的类相关推荐

  1. Java快速入门学习笔记7 | Java语言中的类与对象

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  2. 360 java插件设置_360插件化方案RePlugin初体验

    前天跟朋友聊天提到他们要做个跟360插件化方案类似的框架,领导让他们先了解一下360的实现思路,我也就跟着尝试了一下. RePlugin 是一套完整的.稳定的.适合全面使用的,占坑类插件化方案,由36 ...

  3. 滴滴插件化方案 VirtualApk 源码解析

    本文已在我的公众号hongyangAndroid原创首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/75000580 本文 ...

  4. 爱奇艺开源轻量级插件化方案 Neptune

    爱奇艺近日开源了其轻量级插件化方案 Neptune,项目地址:https://github.com/iqiyi/Neptune 插件化框架可以在主程序不重新安装的情况下,针对单个业务模块进行动态加载达 ...

  5. Cordova插件使用和开发学习笔记

    Cordova插件使用和开发学习笔记 1. Cordova插件开发 1.1 环境搭建 1.2 插件初始化 1.3 插件完善 1.4 plugin.xml 2. Cordova插件使用 2.1 创建项目 ...

  6. Android插件化原理解析——ContentProvider的插件化

    目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...

  7. Android 插件化原理解析——Service的插件化

    在 Activity生命周期管理 以及 广播的管理 中我们详细探讨了Android系统中的Activity.BroadcastReceiver组件的工作原理以及它们的插件化方案,相信读者已经对Andr ...

  8. 插件化原理解析——ContentProvider的插件化

    目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...

  9. 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “插件包“ 中的 Element[] dexElements )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  10. 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. NeurIPS 2020 大变动,领域主席可拒稿20%,作者即评审,布局远程会议!
  2. react-native侧滑
  3. 《Linux From Scratch》第一部分:介绍 第一章:介绍-1.3. 更新日志
  4. s5-11 距离矢量路由选择协议
  5. react中实现异步请求的方法一,react-thunk
  6. Linux 本地密码正确无法登录,记一次无法正常本地登陆Linux服务器(确定密码正确)...
  7. java println 数组_java 数组输出
  8. 我的《野蛮生长》书摘
  9. 游戏化设计:平台用户激励系统——互联网平台建设...
  10. LVS小型系统架构搭建笔记
  11. Linux 命令(33)—— uname 命令
  12. 软件工程 四则运算(结对编程)
  13. kafka创耳机_生产环境一键创建kafka集群
  14. python cpk 计算
  15. Qos介绍及功能->分类标记->流量管理(令牌桶)->拥塞管理与拥塞避免
  16. 【基础】Premultiplied Alpha Blending/Alpha预乘/透明图片黑边
  17. access行列转换。
  18. Qt Quick事件处理之鼠标 键盘 定时器
  19. 大地测量控制点坐标转换技术规范
  20. C# 如何在Excel表格中插入、编辑和删除批注(三)删除Excel批注

热门文章

  1. 【JVM】Java IDEA 配置项目的JVM运行内存大小
  2. Arcgis使用教程(九)ARCGIS空间数据符号化
  3. 5款高质量app界面ui设计实例欣赏
  4. 使用git push没有报错,但是远程仓库没有更新的问题
  5. 杂牌蓝牙在2003系统使用新驱动的破解方法!
  6. 10 本 O'Reilly 出版的免费好书
  7. meebo FireFox add-on
  8. 项目进度管理__计划评审技术之标准正态分布表
  9. 手机通讯终端软件硬件测试,浅谈基于SWP方案的近场通信终端测试及其方法探究...
  10. Latex 多图片排版--排版代码生成器