使用assets目录来实现插件机制
来源:互联网 发布:淘宝买微信号怎么搜 编辑:程序博客网 时间:2024/06/05 08:42
/** * 管理接口。 * @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函数的实现:
1 /** 2 * 拷贝assets目录下的文件到 savePath 3 * 4 * @param myContext 5 * @param ASSETS_NAME 6 * 要复制的文件名 7 * @param savePath 8 * 要保存的路径 9 * @param saveName10 * 复制后的文件名 testCopy(Context context)是一个测试例子。11 */12 public static void copy(Context myContext, String ASSETS_NAME,13 String savePath, String saveName) {14 String filename = savePath + "/" + saveName;15 16 File dir = new File(savePath);17 // 如果目录不中存在,创建这个目录18 if (!dir.exists())19 dir.mkdir();20 try {21 if (!(new File(filename)).exists()) {22 InputStream is = myContext.getResources().getAssets()23 .open(ASSETS_NAME);24 FileOutputStream fos = new FileOutputStream(filename);25 byte[] buffer = new byte[2048];26 int count = 0;27 while ((count = is.read(buffer)) > 0) {28 fos.write(buffer, 0, count);29 }30 fos.close();31 is.close();32 }33 } catch (Exception e) {34 e.printStackTrace();35 }36 }
有个异常:
1 Android java.lang.ClassCastException: cannot be cast to
抽时间找下解决方式。
2013-12-11更新:
1、解决Android java.lang.ClassCastException: cannot be cast to这个异常:
1 /** 2 * apk的插件另外一种实现。 3 * 4 * @param context 5 * Context 6 * @param apkList 7 * 传入的apk文件列表。 8 */ 9 public static void getPlatformInstanceVerB(Context context,10 List<String> apkList, String path) {11 for (String file : apkList) {12 Log.i("fileName", " fileName: " + file);13 File jarFile = new File(file);14 if (jarFile.exists()) {15 DexClassLoader cl = new DexClassLoader(jarFile.toString(),16 path, null, ClassLoader.getSystemClassLoader());17 Class clazz = null;18 Object instance = null;19 try {20 clazz = cl.loadClass("com.ott.porting.PortingManage");21 Constructor localConstructor = clazz.getConstructor(new Class[] {});22 23 instance = localConstructor.newInstance(new Object[] {});24 25 //无参数方法26 //Method des = clazz.getMethod("regPlatform");27 //des.invoke(instance);28 29 //有参数方法30 Method methodRegPlatform = clazz.getDeclaredMethod("regPlatform", new Class[] { String.class }); 31 methodRegPlatform.setAccessible(true); 32 methodRegPlatform.invoke(instance, "test for jevan"); 33 // 对这个类进行实例化34 //obj = clazz.newInstance();35 36 } catch (ClassNotFoundException e) {37 e.printStackTrace();38 } catch (InstantiationException e) {39 e.printStackTrace();40 } catch (IllegalAccessException e) {41 e.printStackTrace();42 } catch (NoSuchMethodException e) {43 e.printStackTrace();44 } catch (SecurityException e) {45 e.printStackTrace();46 } catch (IllegalArgumentException e) {47 e.printStackTrace();48 } catch (InvocationTargetException e) {49 e.printStackTrace();50 }51 // 如果有这个插件,就进行下面的动作,如果没有这个插件就返回52 if (clazz == null) {53 return;54 }55 56 57 // // 把Object转换成接口类型58 // if (obj instanceof IManage) {59 // Log.i("fileName", " obj is IManage! ");60 // IManage manage = (IManage) obj;61 // manage.regPlatform(null);62 // } else {63 // Log.i("fileName", " obj is not IManage! ");64 // }65 }66 }67 }
0 0
- 使用assets目录来实现插件机制
- Android 资源目录assets使用
- Android下的assets目录,res目录访问机制
- android--assets目录下资源使用总结
- 使用Android studio添加assets目录
- 使用Bitmap遍历Assets目录下图片
- Android Studio 中 assets目录的使用
- Android之assets目录下资源使用
- Android使用gradle打包Assets目录
- [Android] Android assets目录下资源使用
- assets目录
- 跟着辛星用PHP的反射机制来实现插件
- 使用Apache Commons Net包实现javaFTP来上传目录
- 使用Apache Commons Net包实现javaFTP来上传目录
- 使用Apache Commons Net包实现javaFTP来上传目录
- 图形之实现/assets/目录下的图片浏览器
- 如何使用Android Studio 创建assets目录存放html 、 assets和res区别
- 使用struts-convention插件来实现struts2零配置
- Android kernel LOGO的更换方法
- 收集下shell使用笔记
- wireshark filter manualpage
- UE32修改TAB键为空格键
- 群辉:服务器错误 错误代码38
- 使用assets目录来实现插件机制
- SecureCRT右键粘贴的设置
- 将博客搬至CSDN
- VC检查文件夹和文件是否存在的几种种方式
- [Android4] 安卓开发-1.0环境配置与相关下载
- 在Ubuntu 12.04 LTS上安装JDK6
- CSS2.0的圆角制作
- MapInfo数据导入到ArcGIS
- Jquery创建一个层,鼠标移动到层上面不消失