当前位置: 代码迷 >> Android >> android 插件小结
  详细解决方案

android 插件小结

热度:30   发布时间:2016-04-28 07:15:06.0
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句柄传入。
?
  1. public?class?MainActivity?extends?Activity?{??
  2. ??????
  3. ????//预定义的action??
  4. ????public?static?final?String?ACTION_PLUGIN?=?"com.intsig.mainApp.PLUGIN";??
  5. [email protected]
  6. ????public?void?onCreate(Bundle?savedInstanceState)?{??
  7. ????????super.onCreate(savedInstanceState);??
  8. ????????setContentView(R.layout.main);??
  9. ????????try?{??
  10. ????????????//查找符合这个action的所有activity即插件,若插件使用的是其他组件换成对应的方法?
  11. ????????????List<ResolveInfo>?infos?=?getPackageManager().queryIntentActivities(??
  12. ????????????????????new?Intent(ACTION_PLUGIN),?PackageManager.MATCH_DEFAULT_ONLY);??
  13. ????????????ActivityInfo?pluginInfo;??
  14. ????????????for(ResolveInfo?info:infos){??
  15. ????????????pluginInfo?=?info.activityInfo;??
  16. ? ? ? ? ? ? //根据插件的安装路径获得ClassLoader
  17. ????????????????ClassLoader?cl?=?new?PathClassLoader(pluginInfo.applicationInfo.sourceDir,getClassLoader());??
  18. ????????????????//获得插件类的实例
  19. ????????????????MyInterface?plugin?=?(MyInterface)?cl.loadClass(pluginInfo.name).newInstance();??
  20. ????????????????plugin.test();??
  21. ????????????}??
  22. ????????}?catch?(Exception?e)?{??
  23. ????????????e.printStackTrace();??
  24. ????????}??
  25. ??
  26. ????}??
  27. }?

?

?一个插件就是一个向主程序提供功能的库,它和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

?

  相关解决方案