Android插件化开发之解决OpenAtlas组件在宿主的注冊问题
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插件适配
最后,提供一个例子源代码
Android插件化开发之解决OpenAtlas组件在宿主的注冊问题的更多相关文章
- Android插件化(五):OpenAtlasの四大组件的Hack
Android插件化(五):OpenAtlasの四大组件的Hack 转 https://www.300168.com/yidong/show-2776.html 核心提示:引言到目前为止,我们已经 ...
- Android插件化开发
客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...
- Android 插件化开发(四):插件化实现方案
在经过上面铺垫后,我们可以尝试整体实现一下插件化了.这里我们先介绍一下最简单的实现插件化的方案. 一.最简单的插件化实现方案 最简单的插件化实现方案,对四大组件都是适用的,技术面涉及如下: 1). 合 ...
- Android插件化开发---执行未安装apk中的Service
欢迎各位增加我的Android开发群[257053751] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...
- Android插件化开发,初入殿堂
好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架CJFrameForAndroid. 好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架C ...
- Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突
Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突 转 https://www.300168.com/yidong/show-2791.html 核心提示:引言And ...
- Android 插件化开发(一):Java 反射技术介绍
写在前面:学习插件化开发推荐书籍<Android 插件化开发指南>,本系列博客所整理知识部分内容出自此书. 在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到J ...
- 《Android插件化开发指南》面世
本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...
- 【我的Android进阶之旅】Android插件化开发学习资料
1.目前开源的插件开发框架大致有哪些? 1. 任玉刚 的 dynamic-load-apk Github 地址:https://github.com/singwhatiwanna/dynamic-lo ...
随机推荐
- C#多线程读写同一文件处理
在多线程访问读写同一个文件时,经常遇到异常:“文件正在由另一进程使用,因此该进程无法访问此文件”. 多线程访问统一资源的异常, 解决方案1,保证读写操作单线程执行,可以使用lock 解决方案2,使用S ...
- 深入理解多线程(二)—— Java的对象模型
上一篇文章中简单介绍过synchronized关键字的方式,其中,同步代码块使用monitorenter和monitorexit两个指令实现,同步方法使用ACC_SYNCHRONIZED标记符实现.后 ...
- CATEGORICAL, ORDINAL AND INTERVAL VARIABLES
WHAT IS THE DIFFERENCE BETWEEN CATEGORICAL, ORDINAL AND INTERVAL VARIABLES? In talking about variabl ...
- 单页面应用SPA和多页面应用MPA
单页面应用(SinglePage Web Application,SPA) 只有一张Web页面的应用,是一种从Web服务器加载的富客户端,单页面跳转仅刷新局部资源 ,公共资源(js.css等)仅需加载 ...
- 关于XSHM(Cross-Site History Manipulation)
http://blog.chinaunix.net/uid-27070210-id-3255407.html 乍一看,好像和以前 css history hack 差不多,其实原理还是不一样的.浏览器 ...
- ConcurrentHashMap和HashMap的区别
(1)ConcurrentHashMap对整个桶数组进行了分段,而HashMap则没有 (2)ConcurrentHashMap在每一个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而 ...
- CF 329B(Biridian Forest-贪心-非二分)
B. Biridian Forest time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- webAR涉及的技术【转】
1.技术体系 1.1技术体系整理 其中绿色底色的代表Demo中表现出的能力比较成熟,可以直接应用. 脑图地址:http://naotu.baidu.com/file/3392a895a90397252 ...
- ElasticSearch客户端注解使用介绍
The best elasticsearch highlevel java rest api-----bboss 1.ElasticSearch客户端bboss提供了一系列注解 @ESId 用于标识 ...
- Matplotlib绘图双纵坐标轴设置及控制设置时间格式
双y轴坐标轴图 今天利用matplotlib绘图,想要完成一个双坐标格式的图. fig=plt.figure(figsize=(20,15)) ax1=fig.add_subplot(111) ax1 ...