一下文章只是本来自己的总结,不一定对(我就一刚毕业的大学生, 错了也很正常)

android 插件分两类:

1:安装应用的插件方式: 这种方式的插件的程序也是需要安装在手机上的, 插件可以有也可以没有launcher的Activity(好多文章都说插件不要提供启动的Acitivity的入口,经本人试验,提供了也没出错)。

2:不用安装的插件方式:主体思想是找到具体目录下的APK文件,利用反射机制找到实例化对应的类,调用对应的方法。详情见另一篇我转载的博客:http://892848153.iteye.com/admin/blogs/1979440。

下面这段来自:http://songyuanlin.blog.51cto.com/6114055/1109634

主应用和插件之间的交互: 一般使用android:sharedUserId属性,插件可以方便的获取主应用的资源、数据库等。主应用可以用Intent方式启动具体插件,同时带有map类型参数或Json串参数,在插件apk中解析具体参数,实现相关逻辑。 每个插件以单独的apk形式发布,这样可以在主程序中灵活知道是否有新的插件,提示用户下载。因为插件apk没有启动的入口launcher,所以插件apk清单描述Action为非Launcher,Category为Default。 一般开发流程 1、插件程序清单 同主程序的清单文件一样,sharedUserId必须有而且要和主程序的一样。 插件的activity意图过滤描述必须是这样的,如下: <intent-filter> <action /> <category android:name=”android.intent.category.DEFAULT”/> </intent-filter> 插件中的这些配置的作用是让主程序可以用PakcageManager得到这个文件的信息,这样主程序就知道这个文件中的类,也只能调用这些类的方法了。 2、插件程序的功能 插件可以包含任意类,和一个普通的apk工程一样。 插件向主程序提供调用的类,也必须是个activity,其方法没有返回值,有且仅有一个Context参数, 框架(这是某个框架?)会反射这个方法,并将主程序的context句柄传入。
  1. publicclassMainActivityextendsActivity{
  2. //预定义的action
  3. publicstaticfinalStringACTION_PLUGIN="com.intsig.mainApp.PLUGIN";
  4. @Override
  5. publicvoidonCreate(BundlesavedInstanceState){
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.main);
  8. try{
  9. //查找符合这个action的所有activity即插件,若插件使用的是其他组件换成对应的方法
  10. List<ResolveInfo>infos=getPackageManager().queryIntentActivities(
  11. newIntent(ACTION_PLUGIN),PackageManager.MATCH_DEFAULT_ONLY);
  12. ActivityInfopluginInfo;
  13. for(ResolveInfoinfo:infos){
  14. pluginInfo=info.activityInfo;
  15. //根据插件的安装路径获得ClassLoader
  16. ClassLoadercl=newPathClassLoader(pluginInfo.applicationInfo.sourceDir,getClassLoader());
  17. //获得插件类的实例
  18. MyInterfaceplugin=(MyInterface)cl.loadClass(pluginInfo.name).newInstance();
  19. plugin.test();
  20. }
  21. }catch(Exceptione){
  22. e.printStackTrace();
  23. }
  24. }
  25. }

一个插件就是一个向主程序提供功能的库,它和android中的库项目不同的地方就是库项目如果更新了,那么主程序也需要更新,而插件就不用,只需要更新插件程序就可以了,省流量。

插件向主程序提供功能有三中方式:

1:在用反射方式调用插件中的方法时,提供具体的对象,具体的方法名

详情见文章:http://892848153.iteye.com/blog/1976988

2:可以把插件提供的对象,方法,写到一个XML文件中,就想Spring的插件方式一样。

详情见文章:http://songyuanlin.blog.51cto.com/6114055/1109634

3:采用接口的方式,写一个Interface文件,然后插件实现它.

详情见文章:http://blog.csdn.net/neoimale/article/details/7495116

个人觉得第三种最好用。

最后发现一个插件框架apkplug

参考文章:http://blog.csdn.net/neoimale/article/details/7495116

http://www.cnblogs.com/hangxin1940/archive/2011/12/14/2288169.html

http://songyuanlin.blog.51cto.com/6114055/1109634

http://blog.csdn.net/mingli198611/article/details/8858076

更多相关文章

  1. 吐血整理:推荐几款顶级好用的IDEA插件
  2. GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
  3. Android动态加载技术三个关键问题详解
  4. Android(安卓)SAX方式解析XML文件
  5. win32到android,missingfile导致的闪退
  6. Android动态快捷方式兼容性问题
  7. Android(安卓)解决依赖冲突问题
  8. android studio项目打包无法勾选v1 、v2 引出的解决项目中gradle
  9. Android三种绑定Service方式的demo

随机推荐

  1. 禁止ScrollView内的控件改变之后自动滚动
  2. Android(安卓)动态切换全屏和非全屏模式
  3. 最新[Android地图sdk] 踩坑经验分享 Dist
  4. adb 指令uninstall卸载android app 处理
  5. android backlight
  6. Android(安卓)获取包名,版本信息及Version
  7. 短视频平台源码Android(安卓)页面自动跳
  8. Re-installation failed 的解决办法
  9. android内核,busybox编译
  10. Android: 用Instrumentation类发送鼠标或