OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主中注冊。像Service,ContentProvider等组件眼下没有什么好的解决方法。仅仅能在宿主中注冊。

可是像Activity,显然是有解决方法的。就是使用Fragment取代Activity,Activity仅仅是作为一个放Fragment的容器,那么不仅在插件中不用再清单文件里注冊,就连宿主的注冊问题也一并攻克了。那么,解决方式呢,没错,就是之前写的一篇博文Android使用Fragment打造万能页面切换框架

在阅读下文前,请务必先阅读该文章。

可是使用该页面切换框架也带来一个问题。就是该框架中是通过反射调用Fragment,可是在宿主中假设直接使用反射,会报java.lang.ClassNotFoundException的错误。我们必须使用OpenAtlas提供的插件的ClassLoader来载入,为了支持OpenAtlas。我对该框架进行了改动,使其支持OpenAtlas

在配置类CoreConfig中添加两个变量。控制是否启用OpenAtlas,以及用于设置和获得ClassLoader。并提供静态的getter和setter方法

/**
* Atlas支持 start
*/
private static boolean isOpenAtlas=false;
private static ClassLoader mBundleClassLoader =null; public static boolean isOpenAtlas() {
return isOpenAtlas;
} public static void setIsOpenAtlas(boolean isOpenAtlasFlag) {
isOpenAtlas = isOpenAtlasFlag;
} public static ClassLoader getBundleClassLoader() {
return mBundleClassLoader;
} public static void setBundleClassLoader(ClassLoader classLoader) {
mBundleClassLoader = classLoader;
}
/**
* Atlas支持 end
*/

改动原来的核心函数。推断CoreConfig中的布尔变量。是否启用了OpenAtlas,默认是不启用的。假设启用了,则通过getBundleClassLoader函数获得ClassLoader,可是前提是你调用了setBundleClassLoader函数设置了ClassLoader,返回的才不是空

/**
* Atlas的支持 start
*/
if (CoreConfig.isOpenAtlas()){
ClassLoader bundleClassLoader = CoreConfig.getBundleClassLoader();
if(bundleClassLoader==null){
Log.d(TAG, "OpenAtlas bundle ClassLoader is null!");
return null;
}
fragment = (BaseFragment) CoreConfig.getBundleClassLoader().loadClass(corePage.getClazz()).newInstance();
}else{
fragment = (BaseFragment) Class.forName(corePage.getClazz()).newInstance();
}
/**
* Atlas的支持 end
*/

之后在宿主中调用的时候,记得开启OpenAtlas的支持。并设置ClassLoader,而ClassLoader的获取是通过Atlas的成员函数getBundleClassLoader()来获取,该函数须要传递一个參数,该參数就是相应插件的包名,也就是之前生成的插件信息列表的json中的pkgName

之后的开发就是正常程序的开发了。可是注意一点,就是宿主的入口Activity必须继承页面切换框架中的BaseActivity,而且不须要调用setContentView进行页面设置。直接使用openPage函数打开Fragment就可以。插件中的Fragment必须继承页面切换框架中的BaseFragment,而且记得在宿主Application中调用 CoreConfig.init(this);进行该框架的初始化。

然后在宿主中调用。记得设置ClassLoader和开启OpenAtlas的支持。Fragment的配置文件page.json 不须要拷到宿主中

CoreConfig.setIsOpenAtlas(true);
ClassLoader bundleClassLoader = Atlas.getInstance().getBundleClassLoader("com.lizhangqu.fragment");
CoreConfig.setBundleClassLoader(bundleClassLoader);
openPage("test", null, CoreAnim.none);

而插件中,不应该将该框架打包进去,仅仅是编译的时候提供,详细的适配工作见上一篇文章Android插件化开发之Atlas插件适配

最后,提供一个例子源代码

http://download.csdn.net/detail/sbsujjbcy/9031679

Android插件化开发之解决OpenAtlas组件在宿主的注冊问题的更多相关文章

  1. Android插件化(五):OpenAtlasの四大组件的Hack

    Android插件化(五):OpenAtlasの四大组件的Hack   转 https://www.300168.com/yidong/show-2776.html 核心提示:引言到目前为止,我们已经 ...

  2. Android插件化开发

    客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...

  3. Android 插件化开发(四):插件化实现方案

    在经过上面铺垫后,我们可以尝试整体实现一下插件化了.这里我们先介绍一下最简单的实现插件化的方案. 一.最简单的插件化实现方案 最简单的插件化实现方案,对四大组件都是适用的,技术面涉及如下: 1). 合 ...

  4. Android插件化开发---执行未安装apk中的Service

    欢迎各位增加我的Android开发群[257053751​] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...

  5. Android插件化开发,初入殿堂

    好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架CJFrameForAndroid. 好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架C ...

  6. Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突

    Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突 转 https://www.300168.com/yidong/show-2791.html   核心提示:引言And ...

  7. Android 插件化开发(一):Java 反射技术介绍

    写在前面:学习插件化开发推荐书籍<Android 插件化开发指南>,本系列博客所整理知识部分内容出自此书. 在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到J ...

  8. 《Android插件化开发指南》面世

    本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...

  9. 【我的Android进阶之旅】Android插件化开发学习资料

    1.目前开源的插件开发框架大致有哪些? 1. 任玉刚 的 dynamic-load-apk Github 地址:https://github.com/singwhatiwanna/dynamic-lo ...

随机推荐

  1. 低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode

           这篇文章主要讲的是在低版本兼容的ActionBar中实现自定义的ActionProvider,ShareActionProvider的使用方法,如何实现分离式ActionBar,外加在分 ...

  2. 如何进行Logstash logstash-input-jdbc插件的离线安装

    我们单位的服务器位于隔离区,不允许链接互联网,因此整理了在ELK集群上离线安装Logstash的jdbc input插件的方法,供大家参考. 总体思路是需要一台中转的机器,这台机器需要能够访问互联网, ...

  3. 短址服务 api

    1  is.gd 他这个api简单: http://is.gd/api.php?longurl= 后面加网址就可以返回短址 2 Google URL Shortener API api地址: http ...

  4. django时区设置以及全球用户如何各自显示当地时间

    在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ 如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即 ...

  5. TCP/IP协议体系结构简介

    1.TCP/IP协议栈 四层模型 TCP/IP这个协议遵守一个四层的模型概念:应用层.传输层.互联层和网络接口层. 网络接口层:模型的基层是网络接口层.负责数据帧的发送和接收,帧是独立的网络信息传输单 ...

  6. [数学] 将长为L的木棒随机折成3段,则3段构成三角形的概率

    1.题目 如题,将长为L的木棒随机折成3段,则3段构成三角形的概率是多少? 2.解析 这个与其说是编程题目,倒不如说是个数学题目.可能是你没有见过,或者没有过这种解题思想.(还是那句,一回生两回熟,类 ...

  7. 在PC上像普通winform程序调试WINCE程序

    在PC上像普通winform程序调试WINCE程序 步骤: 1. 在VS2008中到 工具→选项→设备工具→设备,选择对应的平台,另存为新的名称,如CEDesktopRun,关闭VS2008.(如果不 ...

  8. ajax hash缓存

    hash 模拟url路由 function hashdone(){        var hash;        hash=(!window.location.hash)?"#one&qu ...

  9. vue嵌套路由总结

    嵌套路由就是在一个被路由过来的页面下可以继续使用路由,嵌套也就是路由中的路由的意思. 比如在vue中,我们如果不使用嵌套路由,那么只有一个<router-view>,但是如果使用,那么在一 ...

  10. 由易信界面——谈谈fragment 状态的保存

    看看我要实现的效果: 其实,这种左右界面切换保存布局方式,不只是易信界面这么用罢了.这更是大多数app布局的主流,而在android平台上面,随着谷歌大力推荐fragment的使用,用fragment ...