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

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文件,然后插件实现它.

      详情见文章:

 个人觉得第三种最好用。