android 插件总结
一下文章只是本来自己的总结,不一定对(我就一刚毕业的大学生, 错了也很正常)
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句柄传入。- publicclassMainActivityextendsActivity{
- //预定义的action
- publicstaticfinalStringACTION_PLUGIN="com.intsig.mainApp.PLUGIN";
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- try{
- //查找符合这个action的所有activity即插件,若插件使用的是其他组件换成对应的方法
- List<ResolveInfo>infos=getPackageManager().queryIntentActivities(
- newIntent(ACTION_PLUGIN),PackageManager.MATCH_DEFAULT_ONLY);
- ActivityInfopluginInfo;
- for(ResolveInfoinfo:infos){
- pluginInfo=info.activityInfo;
- //根据插件的安装路径获得ClassLoader
- ClassLoadercl=newPathClassLoader(pluginInfo.applicationInfo.sourceDir,getClassLoader());
- //获得插件类的实例
- MyInterfaceplugin=(MyInterface)cl.loadClass(pluginInfo.name).newInstance();
- plugin.test();
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
一个插件就是一个向主程序提供功能的库,它和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
更多相关文章
- 吐血整理:推荐几款顶级好用的IDEA插件
- GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
- Android动态加载技术三个关键问题详解
- Android(安卓)SAX方式解析XML文件
- win32到android,missingfile导致的闪退
- Android动态快捷方式兼容性问题
- Android(安卓)解决依赖冲突问题
- android studio项目打包无法勾选v1 、v2 引出的解决项目中gradle
- Android三种绑定Service方式的demo