android插件式开发(如QQ表情、微信表情等)
我在学习时找到了一个框架:android-application-plug-ins-frame-work
主要介绍:
介绍
这个框架的初衷,是为了方便让程序模块化、插件化,将一个apk应用拆分为多个apk。
不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。
在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,结果就是每次插件的更新,都必须以整个程序的更新为代价)
都能干啥
框架的思想,主要是通过apk清单文件中的sharedUserId属性来吧多个apk融合为单一的dalvik虚拟机,也就是融合为一个进程,这样就变相逾越了android框架中不同apk权限不同无法互通的鸿沟(rpc啦什么的其它的毕竟不如这个来的实在)。
从最简单的皮肤插件到复杂的涉及数据库的拓展功能,从普通activity跳转到把插件的activity转变为view并附加到主程序中的拓展功能,都是可以通过本框架来实现的,当然,本框架只是提供了一种途径,如何编码还得靠自己。
本人能力有限,可能有一些错误、疏漏或者不足之处,请不吝指教,我的博客地址在左下角,或者我的邮箱,都可以联系到我。
ps:下面会以腾讯微信为例,这里声明一下,本人没有对微信安卓客户端进行任意形式的反编译与破解工作,只是看球半天进行简单的猜测而已。
框架结构
本插件框架由三个包组成:
- org.igeek.android.pluginframework 这个包种类是框架的主要操作类
- PluginBuilder 组装插件
- PluginDescription 组装用户自定义的插件描述
- PluginInvoke 插件功能调用
- PluginSearch 查找插件
- org.igeek.android.pluginframework.annotation 未来可能会考虑使用注解
- PluginDescription 用于用户自定义描述类的注解
- PluginFeature 用于插件类的注解
- PluginMethod 用于插件类方法的注解
- org.igeek.android.pluginframework.beans 框架内部使用的一些beans
- Plugin 插件包
- PluginFeature 插件类
- PluginFeatureMethod 插件方法
- org.igeek.android.pluginframework.util 一些工具类
- XMLParse 插件包
如何使用
以腾讯微信为例,虽然从表面来看,它是插件化的多种功能的一种集成。但是,这都是虚的,每次更新时你会发现,哪怕一个小小的功能添加,都会让用户更新整个程序,截至目前(2011-12-17),微信让我更新到3.5,修复了一些小bug,增加了1个插件功能,以及其它的小改进,就得让我下载并升级整个程序,6.8m啊。。
在工程开发时,预留插件的使用、管理页面,如:
这是微信的插件浏览页面,所有可暴露在这里的插件都会被列出来
这是微信的插件管理界面,可以卸载安卓,但这些都是虚的,可能只是把服务关了,并非真正的卸载
主程序(APK)
- 、主程序清单
首先为工程想好一个名字,并在清单中加入sharedUserId属性,属性值就是想好的那个名字,例如微信:com.qq.weixin
android:sharedUserId="com.qq.weixin"
- 、为插件描述写一个类
这就是插件描述
首先在主程序中单独建立一个包,并写一个类,这个类相当于一个bean,具有相应的插件描述信息的字段,如微信,那么这个bean的字段就有 插件名:漂流瓶 插件logo:那个人头 插件描述:描述信息…
这个类在主程序中不会很多的使用,只会读取框架返回的插件的bean。
- 、引入本框架的jar包或导入源码
正式编码时,可在任何地方调用框架。具体步骤是这样的
1、查找插件 本框架是根据sharedUserId来查找插件。它首先会根据自身apk的sharedUserId值来查找系统中具有相同属性的包并加载。
- ��以说,插件apk的sharedUserId值也应与主程序相同
//首先,就是查找插件PluginSearch psearch=new PluginSearch();//第一次获得的是简要的插件描述List<Plugin> plugins=psearch.getPlugins(this);//然后将插件再组装一下PluginBuilder pbuilder=new PluginBuilder(this);//将用户所定义插件描述融合进去plugins=pbuilder.buildPluginsDescrition(plugins);
这样就把所有插件找到手了,很简单吧?
1、调用插件 找到插件后肯定是调用,最简单应用,就是靠Button按钮来调用
比如微信的摇一摇,点了它就触发框架的插件调用
@Overridepublic void onClick(View v) {//新建一个插件调用类PluginInvoke pi=new PluginInvoke(AndroidPluginFrameworkActivity.this);//这是真正的调用//三个参数,第一个是Plugin类型,第二个是PluginFeature,第三个PluginFeatureMethodpi.invoke(plug, pf, fm);}});
插件程序(APK)
- 、插件程序清单
同主程序的清单文件一样,sharedUserId必须有且和主程序的一样 插件的activity的意图过滤描述必须是这样 示例:
<intent-filter><category android:name="android.intent.category.DEFAULT" /></intent-filter>
- 、插件程序的功能
插件可以包含任意类,如同一个普通的apk工程一样。
但是,向主程序提供调用的类,必须是个activity,方法必须是无返回值的,有且只有一个Context参数,框架会反射这个方法,并将主程序的context句柄传入,也就是,不管你用不用这个context,他都是被框架传入的。
如果主程序规定了描述类,也就是框架中需要PluginDescription来调用的bean,在插件工程中,也必须有主程序这个bean,包名也必须一样。插件程序可以直接继承或者更改这个bean的字段,方便主程序去获取这个插件的描述信息。这种方式,是避过框架,给主程序一种方便。
- 、插件程序的plugin.xml配置
http://android-application-plug-ins-frame-work.googlecode.com/files/plugin.xml plugin.xml不能改名,必须放在工程的 assets 目录下。
内容大致是这样:
<?xml version="1.0" encoding="UTF-8"?> <!-- 这个xml配置文件放在插件工程的 assets 目录下 --><!-- 插件提供的功能(类) --> <plugin-features><!-- 描述类,这个是自定义的 --><!-- 这个描述类使用户定义的,在主程序中必须有,插件工程中也必须有,并被继承 --><description name="org.pakage.name.and.description.name"/><!-- 这是一个功能(类),必须是activity的子类 --><feature name="org.pakage.name.and.activity.name1"><!-- 这是一个方法 --><!-- name 方法名 --><method need-context="true" name="methodName1" >描述信息</method><method need-context="true" name="methodName2" >描述信息</method></feature><feature name="org.pakage.name.and.activity.name2"><method need-context="true" name="methodName1" >描述信息</method></feature> </plugin-features>
按着上面的套路来配置,就很容易了。
最后
上面说的比较泛,最好还是看看示例工程,里面包含了一个主程序和两个插件扩展,总共是4个工程,也就是说,在用户端是4个apkhttp://android-application-plug-ins-frame-work.googlecode.com/files/demo.zip
框架很详细,可以拿来学习学习。
android插件式开发(如QQ表情、微信表情等)相关推荐
- Android插件化开发指南——实践之Activity转场效果(仿酷狗音乐启动页)
文章目录 1. 前言 2. Activity退出动画 2.1 简单使用 2.2 overridePendingTransition 3. 后记 1. 前言 在Android插件化开发指南--2.15 ...
- .net 插件式开发学习总结
.NET简谈插件系统开发模式 今天跟大家分享一下我们在日常开发中并不常用的开发模式"插件系统模式",什么叫插件从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的 ...
- Android插件化开发之解决OpenAtlas组件在宿主的注冊问题
Android插件化开发之解决OpenAtlas组件在宿主的注冊问题 OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主 ...
- 基于AppDomain的插件式开发
很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...
- 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级
标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...
- 从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装
标题:从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11343141. ...
- 从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 如何启用预编译视图
标题:从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 升级.NET 5及启用预编译视图 作者:Lamond Lu 地址:https://www.cnblogs.com/lwql ...
- 从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案...
标题:从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/ ...
- 从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用
标题:从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用. 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/1171 ...
最新文章
- 矩阵的终极分解-奇异值分解 SVD
- “网络实名制” 你认为有必要吗?
- 嵌入式ARM启动代码的工作
- 看django视频笔记
- Bash常用快捷键及其作用
- 向上传文件服务器,向服务器上传文件
- ajax实现两个aspx跳转,请问ajax执行成功后可以跳转到另一个页面吗?
- 图像处理九:拟合曲线
- MQ_ActiveMQ环境部署+C#推送和接收消息
- Condition梳理和总结
- 免费域名邮箱申请教程
- PostgreSQL导入导出CSV
- 在东京,月薪25万日元能过上什么样的日子啊
- mysql中没有sock文件_mysql.sock文件不见了问题的解决方法
- 为什么感知机不能表示异或?
- VPS云主机的定义和基本优势有哪些
- 小米note3的开发者选项在哪里?怎么进入开发者模式?如何显示布局边界?
- Java 中代码优化的 30 个小技巧(中)
- 挖矿木马应急响应指南
- atom 编辑器html,Atom编辑器配置