Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
59 lines (52 loc) · 5.27 KB

File metadata and controls

59 lines (52 loc) · 5.27 KB
Copy raw file
Download raw file
Outline
Edit and raw actions

logo Plugin模块详细介绍

Plugin模块 是一个实现android插件化开发的框架。使用KJFrameForAndroid框架的Plugin模块,apk动态加载不再是难题,更重要的是可以轻松实现插件与APP项目之间的解耦。

写在前面

介绍
Plugin模块最初是作为一个独立的框架CJFrameForAndroid存在,后并入KJFrameForAndroid框架中,Plugin模块的设计思想参考了:Android动态加载库DL的设计,并做了更多功能上与稳定性上的测试与改进
如果看完本介绍后对插件化开发还是不太明白,你可以看看这几篇博客:Android插件化开发,初入殿堂CJFrameForAndroid原理介绍
原理
CJFrameForAndroid的实现原理是通过类加载器,动态加载存在于SD卡上的apk包中的Activity。通过使用一个托管所,插件Activity全部事务(包括声明周期与交互事件)将交由托管所来处理,间接实现插件的运行。
一句话描述:CJFrameForAndroid中的托管所,复制了插件中的Activity,来替代插件中的Activity与用户交互。

名词解释

APP项目:指要调用插件apk的那个已经安装到用户手机上的应用。
插件项目:指没有被安装且希望借助已经安装到手机上的项目运行的apk。
插件化:Activity继承自CJActivity,且与APP项目jar包冲突已经解决的插件项目称为已经被插件化。
Activity事务:在CJFrameForAndroid中,一个Activity的生命周期以及交互事件统称为Activity的事务。
托管所:指插件中的一个委派/代理Activity,通过这个Activity去处理插件中Activity的全部事务,从而表现为就像插件中的Activity在运行一样。

功能支持

  • Activity的动态加载:包括生命周期和交互事件、插件与APP之间的数据通信
  • Fragment的完美加载使用
  • 动态注册的BroadcastReceiver
  • 绑定式、启动式Service均可完美使用
  • 已成功模拟出launchMode的效果。(launchModer实际上是一个虚拟的,生命周期的调用还是一样的,仅仅模拟出了系统的BackStack)
  • 完美集成了KJFrameForAndroid中UILibrary的全部功能,支持注解式绑定控件

模块使用须知

●使用 CJFrameForAndroid 插件开发框架需要在你项目的AndroidManifest.xml文件中加入托管所的声明。

<activity android:name="org.kymjs.aframe.plugin.activity.CJProxyActivity" />  <!-- 如果使用了插件Activity,需要添加 -->
<service android:name="org.kymjs.aframe.plugin.service.CJProxyService" />  <!-- 如果使用了插件Service,需要添加 -->

●让插件应用中的Activity继承CJActivity,并且一切使用this调用的方法都使用that替代。例如this.setContentView();需要改为that.setContentView();
●插件中涉及到的Android权限,须在APP项目清单中具有声明。
●插件Activity跳转时,推荐使用CJActivityUtils类来辅助跳转。若一定要startActivity或startActivityForResult,在跳转过程中的Intent不能自己new,必须使用CJActivityUtils.getPluginIntent();
●在插件和APP两个工程中不能引用相同的jar包。解决办法是:在插件工程的项目中添加一个/cjlibs的文件夹,将需要调用的jar包放到这个文件夹中,并在插件项目目录下的.classpath中加入如下语句,系统会自动处理相关细节

<classpathentry kind="lib" path="cjlibs"/>

jar包调用

jar包下载
使用场景一 通常情况:在主APP工程中使用完整版KJFrameForAndroid.jar包;考虑到插件的大小应该越小越好,我们特意制作了精简版的CJPlugin.jar包,仅包含插件所比需功能与注解式绑定控件的功能。在插件工程中使用精简版选择CJPlugin.jar下载
使用场景二 适合插件工程较庞大时使用:在APP工程和插件工程中都使用KJFrameForAndroid的完整版jar包。好处在于开发插件工程时也可以得到KJFrameForAndroid完整版的全部功能支持。
使用场景三 只使用插件化模块:你可以在在APP工程和插件工程中都使用精简版CJPlugin.jar包。

注意事项

●APP项目和插件项目中,都需要使用到插件化的jar包。
●在项目中必须加入托管所声明。
●在开发插件的时候,必须继承CJ框架相应基类;
●在插件的Activity中,一切使用this的部分必须使用that来替代;
●在插件Activity跳转时,推荐使用CJActivityUtils类来辅助跳转;
●在Service启动的时候,必须使用CJServiceUtils来启动;
●在插件和APP两个工程中不能引用相同的jar包;

关于作者kymjs

blog:http://my.oschina.net/kymjs/blog
email:kymjs123@gmail.com
forum/bbs: http://tieba.baidu.com/f?kw=kym%BD%A9%CA%AC&fr=index

Morty Proxy This is a proxified and sanitized view of the page, visit original site.