一下文章只是本来自己的总结,不一定对(我就一刚毕业的大学生, 错了也很正常)
android 插件分两类:
1:安装应用的插件方式: 这种方式的插件的程序也是需要安装在手机上的, 插件可以有也可以没有launcher的Activity(好多文章都说插件不要提供启动的Acitivity的入口,经本人试验,提供了也没出错)。
主应用和插件之间的交互:
一般使用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工程一样。
框架(这是某个框架?)会反射这个方法,并将主程序的context句柄传入。
1. public class MainActivity extends Activity {
2.
3. 预定义的action
4. ACTION_PLUGIN = "com.intsig.mainApp.PLUGIN";
5. @Override
6. public void onCreate(Bundle savedInstanceState) {
7. super.onCreate(savedInstanceState);
8. setContentView(R.layout.main);
9. try {
10. 查找符合这个action的所有activity即插件,若插件使用的是其他组件换成对应的方法
11. <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. cl = new PathClassLoader(pluginInfo.applicationInfo.sourceDir,getClassLoader());
18. 获得插件类的实例
19. plugin = (MyInterface) cl.loadClass(pluginInfo.name).newInstance();
20. plugin.test();
21. }
22. } catch (Exception e) {
23. e.printStackTrace();
24. }
25.
26. }
27. }
一个插件就是一个向主程序提供功能的库,它和android中的库项目不同的地方就是库项目如果更新了,那么主程序也需要更新,而插件就不用,只需要更新插件程序就可以了,省流量。
插件向主程序提供功能有三中方式:
3:采用接口的方式,写一个Interface文件,然后插件实现它.
详情见文章:
个人觉得第三种最好用。