Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...
前言
近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流!
关键字:Android动态加载
声明
欢迎转载,但请保留文章原始出处:)
博客园:http://www.cnblogs.com
农民伯伯: http://over140.cnblogs.com
Android中文Wiki:http://wikidroid.sinaapp.com
正文
一、前提
目的:动态加载SD卡中Apk的类。
注意:被加载的APK是未安装的。
相关:本文是本博另外一篇文章:Android动态加载jar/dex的升级版。
二、准备
准备被调用Android工程:TestB
ITest
String getMoney();
}
TestBActivity
/**Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public String getMoney() {
return "1";
}
}
代码说明:很简单的代码。将生成后的TestB.apk拷贝到SD卡的根目录下。
三、调用
调用工程TestA
/**Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String path = Environment.getExternalStorageDirectory() + "/";
String filename = "TestB.apk";
DexClassLoader classLoader = new DexClassLoader(path + filename, path,
null, getClassLoader());
try {
Class mLoadClass = classLoader.loadClass("com.nmbb.TestBActivity");
Constructor constructor = mLoadClass.getConstructor(new Class[] {});
Object TestBActivity = constructor.newInstance(new Object[] {});
Method getMoney = mLoadClass.getMethod("getMoney", null);
getMoney.setAccessible(true);
Object money = getMoney.invoke(TestBActivity, null);
Toast.makeText(this, money.toString(), Toast.LENGTH_LONG).show();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
执行的时候可以发现会自动生成TestB.dex文件。动态加载方面还可以搜索一下"Java动态加载"方面的资料,很有参考价值。可以发现比Android动态加载jar/dex使用起来方便得多。
四、下载
TestA.zip
TestB.zip
五、注意
6.1 别忘了加上SDCARD的写权限:
android.permission.WRITE_EXTERNAL_STORAGE
6.2 同样注意,不要再两个工程包含package和名称相同的接口,否则报错。(参见Android动态加载jar/dex的后期维护)
六、扩展阅读
探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法
(强烈推荐:QQ游戏动态调用Activity的方法:通过ClassLoader,loadClass Activity类,然后分别在主工程的onDestroy、onKeyDown、onPause、onRestart、onResume等生命周期方法中反射调用(Method、invoke)子工程的类方法来模拟实现整个生命周期。此外巧妙的通过解压缩APK文件来获取游戏的资源)
Android中文Wiki:DexFile
七、缺点
6.1 由于是使用反射,无法取得Context,也就是TestBActivity与普通的类毫无区别,没有生命周期。
八、推荐
Android版 程序员专用搜索
转载于:https://www.cnblogs.com/calow/p/3643222.html
Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...相关推荐
- [转]Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...
本文转自:http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html 前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来 ...
- Android应用开发提高系列(5)——Android动态加载(下)——加载已安装APK中的类和资源...
前言 Android动态加载(下)--加载已安装APK中的类和资源. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://ov ...
- Android开发之动态加载,运行未安装apk
Android运行未安装apk可以使用Android的DexClassLoader类 这个也可以再Android的官方文档中看到 A class loader that loads classes f ...
- Android音视频学习系列(九) — Android端实现rtmp推流
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- 写给Android App开发人员看的Android底层知识合集(1-8)
写给Android App开发人员看的Android底层知识合集(1-8) 转自包老师:http://www.cnblogs.com/Jax/p/6864103.html 写给Android App开 ...
- android Java开发设计模式及在android中的应用解析
android Java开发设计模式及在android中的应用解析 什么是设计模式: 可以用一句话概括设计模式---设计模式是一种利用OOP的封闭.继承和多态三大特性,同时在遵循单一职责原则.开闭原则 ...
- java实现图形界面输入半径求圆面积_测试开发工程师系列之Android自动化测试Appium(Python)连载(7)安卓图形界面...
安卓图形界面 UI即User Interface(用户界面)的简称.泛指用户操作界面,包含移动APP,网页,智能穿戴设备等.Android用户界面测试,要测试应用程序如何与一个真实的用户交互.这种测试 ...
- Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/26/2368696.html 一.概述 TextToSpeech,就是将文本内容转换成语音,在其 ...
- 学Android移动开发 第1章 Android基础入门
文章目录 1.1 Android简介 什么是Android Android和iOS主要区别 1.1.1 通信技术 1.1.2 Android起源 1.1.3 Android体系结构 1.1.4 Dal ...
最新文章
- ohmyzsh用在mysql_oh-my-zsh,让你的终端从未这么爽过
- java面试32问_学员分享:JAVA面试32问(11-20)
- 微软服务器在电脑上怎么打开,怎么在一个电脑上开启服务器可以让另外一台电脑连接服...
- 支持向量机概念图解_支持向量机:基本概念
- NumPy快速入门--复制/视图/深拷贝
- js实现图片加载特效(从左到右,百叶窗,从中间到两边)
- java 向上抛异常_Java 异常的处理方式throws
- 动态BGP和静态BGP的含义与区别
- php ci is numeric,CI继承类MY_Model
- ios 怎么禁止点击子视图的时候不响应父视图的点击事件
- echarts2 饼图标签文字换行
- 【预告】《天黑以后》(《The Darkest Hour》)
- 2022年创业项目排行榜前十名,这些你都不知道就别想赚钱了
- 新思课堂C语言答案,新思课堂APP最新版下载_新思课堂APP官方版1.6.8下载_QQ下载站...
- 热烈祝贺|酒事有鲤盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会
- Python爬取数据存储到本地文本文件
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
- oracle in与exists疑惑
- 小程序需要买ssl数字证书吗
- 3dmax建模技巧分享
热门文章
- 学习区块链,绕不过去的“拜占庭将军问题”!!这里正好有通俗易懂的解释
- 人大金仓数据库sql语句_人大金仓数据库总结(SQL和JDBC)
- 查看线上环境中的jvm参数
- Intellij IDEA 2019 自动生成 serialVersionUID
- Qt for Android / ios 将图片或文件打包进安装包中
- JVM与Java的体系结构(JVM入门知识体系总结)
- 2.2.2 定点数的运算(移位、原码和补码的加减乘除、溢出概念和判别方法)
- Java内存模型、volatile、原子性、可见性、有序性、happens-before原则
- python模块cv2人脸识别_python face_recognition模块实现人脸识别
- android 自动补全方法,Android零基础入门|自动完成文本框AutoCompleteTextView