/**
* 管理接口。
* @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. webservice基本功能介绍

    WebService, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据WebService规范实施的应用之间, 无论它们所使用的语言. 平台或内 ...

  2. 浅解.Net分布式锁的实现

    序言 我晚上有在公司多呆会儿的习惯,所以很多晚上我都是最后一个离开公司的.当然也有一些同事,跟我一样喜欢在公司多搞会儿.这篇文章就要从,去年年末一个多搞会的晚上说起,那是一个夜黑风高的晚上,公司应该没 ...

  3. Tinywebserver:一个简易的web服务器

    这是学习网络编程后写的一个练手的小程序,可以帮助复习I/O模型,epoll使用,线程池,HTTP协议等内容. 程序代码是基于<Linux高性能服务器编程>一书编写的. 首先回顾程序中的核心 ...

  4. DbUtils类基本使用

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  5. 【经验】JavaScript

    1.function closeWin(){             window.open('','_self');       window.opener=null;  //    window. ...

  6. 徒手用Java来写个Web服务器和框架吧<第一章:NIO篇>

    因为有个不会存在大量连接的小的Web服务器需求,不至于用上重量级服务器,于是自己动手写一个服务器. 同时也提供了一个简单的Web框架.能够简单的使用了. 大体的需求包括 能够处理HTTP协议. 能够提 ...

  7. hibernate jar包介绍

    Hibernate3.jar            这个是hibernate最主要的jar包 ant-1.63.jar      Ant 的核心包,在构建Hibernate 时会用到 antlr-2. ...

  8. 关于JavaScript简单描述

    1.什么是JavaScript? JavaScript 是一种专门用于与网页交互而设计的脚本语言,它有三部分组成,那是哪三部分呢?分别是ECMAScript(提供核心语言功能),DOM(提供访问和操作 ...

  9. 1820: [JSOI2010]Express Service 快递服务

    1820: [JSOI2010]Express Service 快递服务 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 325 ...

  10. 1218: [HNOI2003]激光炸弹

    1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1139  Solved: 542[Submit][Statu ...