/**
* 管理接口。
* @author jevan
* @version 1.0 at 2013-12-6
*
*/
public interface IManage {
/**
* 注册平台接口。
* @param param 传入参数,可选。
*/
public boolean regPlatform(String param);
}

插件管理类:

/**
* @author jevan
* @version 1.0 at 2013-12-6 用于初始化平台信息
*/
private static void initPlatformInstance(Context context) { String path = context.getFilesDir().getAbsolutePath() + "/jar/";
String[] files = null; File fpath = new File(path);
if (!fpath.exists()) {
fpath.mkdirs();
}
try {// 遍历assest文件夹,读取压缩包及安装包
files = context.getAssets().list("");
} catch (IOException e) {
e.printStackTrace();
} if (files == null) {
return;
} List<String> apkList = new ArrayList<String>();
// 动态绑定,运行实现了这个接口的类的方法
for (String fileName : files) {
if (fileName.endsWith(".apk")) {
Log.i("fileName", "src files: " + fileName);
Log.i("fileName", "dst files: " + path + fileName);
copy(context, fileName, path, fileName);
apkList.add(path + fileName);
}
} getPlatformInstanceVerB(context, apkList, path); } /**
* 统一平台的插件实现。
*
* @param context
* Context
* @param apkList
* 传入的apk文件列表。
*/
public static void getPlatformInstanceVerB(Context context,
List<String> apkList, String path) {
for (String file : apkList) {
Log.i("fileName", " fileName: " + file);
File jarFile = new File(file);
if (jarFile.exists()) {
DexClassLoader cl = new DexClassLoader(jarFile.toString(),
path, null, ClassLoader.getSystemClassLoader());
Class clazz = null;
Object obj = null;
try {
clazz = cl.loadClass("com.ott.porting.PortingManage");
// 对这个类进行实例化
obj = clazz.newInstance(); } catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 如果有这个插件,就进行下面的动作,如果没有这个插件就返回
if (clazz == null) {
return;
} try {
IManage manage = (IManage) obj;
manage.regPlatform(null);
} catch (Exception e) {
e.printStackTrace();
}
// 把Object转换成接口类型
if(obj instanceof IManage)
{
Log.i("fileName", " obj is IManage! ");
IManage manage = (IManage) obj;
manage.regPlatform(null);
}
else
{
Log.i("fileName", " obj is not IManage! ");
}
}
}
}

copy函数的实现:

     /**
* 拷贝assets目录下的文件到 savePath
*
* @param myContext
* @param ASSETS_NAME
* 要复制的文件名
* @param savePath
* 要保存的路径
* @param saveName
* 复制后的文件名 testCopy(Context context)是一个测试例子。
*/
public static void copy(Context myContext, String ASSETS_NAME,
String savePath, String saveName) {
String filename = savePath + "/" + saveName; File dir = new File(savePath);
// 如果目录不中存在,创建这个目录
if (!dir.exists())
dir.mkdir();
try {
if (!(new File(filename)).exists()) {
InputStream is = myContext.getResources().getAssets()
.open(ASSETS_NAME);
FileOutputStream fos = new FileOutputStream(filename);
byte[] buffer = new byte[2048];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

有个异常:

 Android java.lang.ClassCastException: cannot be cast to

抽时间找下解决方式。

2013-12-11更新:

1、解决Android java.lang.ClassCastException: cannot be cast to这个异常:

     /**
* apk的插件另外一种实现。
*
* @param context
* Context
* @param apkList
* 传入的apk文件列表。
*/
public static void getPlatformInstanceVerB(Context context,
List<String> apkList, String path) {
for (String file : apkList) {
Log.i("fileName", " fileName: " + file);
File jarFile = new File(file);
if (jarFile.exists()) {
DexClassLoader cl = new DexClassLoader(jarFile.toString(),
path, null, ClassLoader.getSystemClassLoader());
Class clazz = null;
Object instance = null;
try {
clazz = cl.loadClass("com.ott.porting.PortingManage");
Constructor localConstructor = clazz.getConstructor(new Class[] {}); instance = localConstructor.newInstance(new Object[] {}); //无参数方法
//Method des = clazz.getMethod("regPlatform");
//des.invoke(instance); //有参数方法
Method methodRegPlatform = clazz.getDeclaredMethod("regPlatform", new Class[] { String.class });
methodRegPlatform.setAccessible(true);
methodRegPlatform.invoke(instance, "test for jevan");
// 对这个类进行实例化
//obj = clazz.newInstance(); } catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
// 如果有这个插件,就进行下面的动作,如果没有这个插件就返回
if (clazz == null) {
return;
} // // 把Object转换成接口类型
// if (obj instanceof IManage) {
// Log.i("fileName", " obj is IManage! ");
// IManage manage = (IManage) obj;
// manage.regPlatform(null);
// } else {
// Log.i("fileName", " obj is not IManage! ");
// }
}
}
}

使用assets目录来实现插件机制的更多相关文章

  1. 探寻 webpack 插件机制

    webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本.在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 ...

  2. android studio 使用gradle 导出jar包,并打包assets目录

    警告:本文年久失修. 随着android studio的升级 ,gradle的升级,严格按照本文的代码去做可能不会成功,希望依然可以作为解决问题的思路. 最近项目在做一个sdk,供别的开发者使用,所以 ...

  3. ImitateLogin新增插件机制以及又一个社交网站的支持

    我的文章里已经多次介绍 imitate-login ,这是我最近一直在维护的一个使用c#模拟社交网站登录的开源项目,现在新增了对插件的支持以及一个新的网站(由于某种原因,会在文章结束部分介绍:而且仅会 ...

  4. Maven生命周期和插件机制

    Maven中的一个非常重要的概念是生命周期和插件,这篇文章重点介绍下Maven的生命周期. Maven的生命周期是抽象的,具体的功能是有具体的插件来完成的,Maven有相当多的功能插件,以至于Mave ...

  5. php中的钩子(hook插件机制)

    对"钩子"这个概念其实不熟悉,最近看到一个php框架中用到这种机制来扩展项目,所以大概来了解下. hook插件机制的基本思想: 在项目代码中,你认为要扩展(暂时不扩展)的地方放置一 ...

  6. typecho流程原理和插件机制浅析(第一弹)

    typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...

  7. [转]--android studio 使用gradle 导出jar包,并打包assets目录

    转自: http://www.cnblogs.com/wuya/p/android-studio-gradle-export-jar-assets.html   最近项目在做一个sdk,供别的开发者使 ...

  8. NopCommerce架构分析之四----插件机制

    NopCommerce支持灵活的插件机制,所谓Web系统插件,其实也就是可以像原系统的一部分一样使用. Web系统的使用方式就是客户端发送一个请求,服务端进行解析.在asp.net MVC中对客户请求 ...

  9. php插件机制实现原理

    插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现) 它的特点: 1. 随时安装.卸载.激活.禁用 2. 无论什么状态都不影响系统核心模块的运行, 3. 是一种非侵入式的模块化设 ...

随机推荐

  1. 2732: [HNOI2012]射箭( 半平面交 )

    很久没写题解了= =,来水一发吧= = 首先这道题很明显就是求y=ax^2+bx的是否有值取,每一个式子都代表着两个半平面,然后直接半平面交就行了 借鉴了hzwer的代码,还是特别简洁的说 CODE: ...

  2. Java编程风格学习(三)

    在上一篇的java编程风格学习(二)中我们学习了一些在Java编码过程中的格式规范,遵循这些规范毋庸置疑是我们的书写高质量代码的前提与基础.今天我们更进一步,一起来学习Java编程的命名规范,向着编写 ...

  3. [转]支持向量机SVM总结

    首先,对于支持向量机(SVM)的简单总结: 1. Maximum Margin Classifier 2. Lagrange Duality 3. Support Vector 4. Kernel 5 ...

  4. Android通过Apk插件调起微信支付

    App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微 ...

  5. jprofiler安装图解 ( 7_1 )

    环境: 1.sun jdk1.6.0 2.jprofiler_windows_6_0_2.exe 安装 1. jdk, 安装略... 2. jprofiler安装 一路next 到Enter lice ...

  6. 利用jink调试程序,时间不准的解决办法

    前几天,做工程,遇到了利用jlink的SWD的模式调试程序,定时器延时不准的问题,上网搜了好多,终于找到了问题所在,感谢万能的网友.时间不对是因为Keil的设置问题. 以下是转自网友: 一.先说说仿真 ...

  7. 第34篇 再谈http协议

    从打开一个网址说起 当在浏览器中输入一个网址的时候,浏览器会渲染出对应的网页的内容.作为web开发人员来说,应该知道这个过程: 当输入的一个网址为域名的时候,浏览器则根据本机的网关和DNS服务器来解析 ...

  8. Kindle电子阅读器收不到个人文档推送解决方案

    最近我的 kindle 固件版本更新到 5.8.7.0.1 ,发现增加了生字注音功能,瞬间变成小学生阅读神器有木有,不过,这个功能可以隐藏.显示,看着碍眼隐藏即可,还可以减少和增加生字注音.感觉对于经 ...

  9. 隐马尔可夫模型(HMM)攻略

    隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价 ...

  10. 信号处理——Hilbert端点效应浅析

    作者:桂. 时间:2017-03-05  19:29:12 链接:http://www.cnblogs.com/xingshansi/p/6506405.html 声明:转载请注明出处,谢谢. 前言 ...