位置: 编程技术 - 正文

android 如何动态的加载类----app插件技术(安卓动态图标怎么实现)

编辑:rootadmin
文章出处: 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势。现如今很多项目要求需要采用类&#;于微信或Q游这样的插件化开发模式越来越多,本文就是阐述android的动态加载技术来满足插件化开发模式的文章。

推荐整理分享android 如何动态的加载类----app插件技术(安卓动态图标怎么实现),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android动态设置style,安卓动态图标怎么实现,安卓动态图标怎么实现,android如何动态加载xml布局,android动态设置style,android如何动态加载xml布局,android如何动态加载xml布局,android动态化,内容如对您有帮助,希望把文章链接给更多的朋友!

1.基本概念

1.1 在Android中可以动态加载,但无法像Java中那样方便动态加载jar。

Android的虚拟机(DalvikVM)是不认识Java打出jar的byte code,需要通过dx工具来优化转换成Dalvikbyte code才行。这一点在咱们Android项目打包的apk中可以看出:引入其他Jar的内容都被打包进了classes.dex。即android要加载的java类必须dex&#;式的代码文件.

1.2 在Android中可以加载基于NDK的so库。

NDK的执行效率很高,加密性很好,但同时开发入门难度大,一般用于加解密、数学运算等场合。so的加载很简单,如果APK发布时已经携带了so文件,只需要在加载时调用System.loadLibrary(libName)方法即可。由于软件的安装目录中存放so的目录是没有写权限的,开发者不能更改该目录的内容,所以如果要动态加载存放在其他地方的so文件,用System.load(pathName)方法即可。

1.3 在Android中支持动态加载dex文件的两种方式:

DexClassLoader:这个可以加载jar/apk/dex,也可以从SD卡中加载,也是本文的重点

PathClassLoader:只能加载已经安装到Android系统中的apk文件。也就是 /data/app 目录下的 apk 文件。其它位置的文件加载的时候都会出现 ClassNotFoundException.因为 PathClassLoader 会去读取 /data/dalvik-cache 目录下的经过 Dalvik 优化过的 dex 文件,这个目录的 dex 文件是在安装 apk 包的时候由 Dalvik 生成的。

2.注意

2.1 采用不用安装的插件开发模式,只能够使用 DexClassLoader进行加载.不过动态加载是有一些限制的,比如插件(子apk)包中的Activity、Service类是不能动态加载的,因为缺少声明;即使你在Manifest文件中进行了声明,系统默认也是到安装apk所在的路径中去寻找类,所以你会遇到一个ClassNotFound的异常。插件里你可以用主apk中先前放入的layout、strings等资源。但是插件中自带的界面只能用纯代码进行编写,插件中是不能加载插件(子apk)中的xml作为layout等资源使用的。所以在开发上一些特效会比较困难些,建议预先植入主apk中。

2.2 大家可以看看DexClassLoader的API文档,里面不提倡从SD卡加载,不安全

android 如何动态的加载类----app插件技术(安卓动态图标怎么实现)

3.如何制作插件

3.1 把工程导出为jar包

3.2 执行SDK安装目录android-sdk-windowsplatform-tools下的dx命令,把jar包转换为dex&#;式

dx --dex --output=dex名 jar包名

4.如何做到启动未安装的apk中的activity?

采用反射机制,把主apk中的activity的context传递到插件的activity中,然后采用反射进行回调插件activity的方法。不足之出就是,插件中的activity并不是真正的activity,它只是运行在主activity中。比如:点击返回直接退出当前activity而不是回到主activity。实例如下:

这是调用的Activity:

[java] view plaincopypackage com.beyondsoft.activity; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import dalvik.system.DexClassLoader; import android.app.Activity; import android.content.pm.PackageInfo; import android.os.Bundle; import android.util.Log; public class PlugActivity extends Activity { private Class mActivityClass; private Object mActivityInstance; Class localClass; private Object instance; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle paramBundle = new Bundle(); paramBundle.putBoolean("KEY_START_FROM_OTHER_ACTIVITY", true); paramBundle.putString("str", "PlugActivity"); String dexpath = "/sdcard/FragmentProject.apk"; String dexoutputpath = "/mnt/sdcard/"; LoadAPK(paramBundle, dexpath, dexoutputpath); } @Override protected void onStart() { super.onStart(); Method start; try { start = localClass.getMethod("onStart"); start.invoke(instance); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Method resume; try { resume = localClass.getMethod("onResume"); resume.invoke(instance); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void onPause() { super.onPause(); Method pause; try { pause = localClass.getMethod("onPause"); pause.invoke(instance); } catch (Exception e) { e.printStackTrace(); } } @Override protected void onStop() { super.onStop(); try { Method stop = localClass.getMethod("onStop"); stop.invoke(instance); } catch (Exception e) { e.printStackTrace(); } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); try { Method des = localClass.getMethod("onDestroy"); des.invoke(instance); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void LoadAPK(Bundle paramBundle, String dexpath, String dexoutputpath) { ClassLoader localClassLoader = ClassLoader.getSystemClassLoader(); DexClassLoader localDexClassLoader = new DexClassLoader(dexpath, dexoutputpath, null, localClassLoader); try { PackageInfo plocalObject = getPackageManager().getPackageArchiveInfo(dexpath, 1); if ((plocalObject.activities != null) && (plocalObject.activities.length > 0)) { String activityname = plocalObject.activities[0].name; Log.d("sys", "activityname = " &#; activityname); localClass = localDexClassLoader.loadClass(activityname);//结果:"com.example.fragmentproject.FristActivity" mActivityClass = localClass; Constructor localConstructor = localClass.getConstructor(new Class[] {}); instance = localConstructor.newInstance(new Object[] {}); Log.d("sys", "instance = " &#; instance); mActivityInstance = instance; Method des = localClass.getMethod("test"); des.invoke(instance); Method localMethodSetActivity = localClass.getDeclaredMethod("setActivity", new Class[] { Activity.class }); localMethodSetActivity.setAccessible(true); localMethodSetActivity.invoke(instance, new Object[] { this }); Method methodonCreate = localClass.getDeclaredMethod("onCreate", new Class[] { Bundle.class }); methodonCreate.setAccessible(true); methodonCreate.invoke(instance, paramBundle); } return; } catch (Exception ex) { ex.printStackTrace(); } } }

这是被调用的Activity:

[java] view plaincopypublic class FristActivity extends Activity{ private Button fragment; private Button listFragment; private Button controlFragment; private Button viewFlipper; private Button viewPager; private Activity otherActivity; public void test() { Log.i("sys", "测试方法执行了"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 测试DexClassLoader 动态加载未安装Apk中的类 TextView t = new TextView(otherActivity); t.setText("我是测试"); otherActivity.setContentView(t);// R.layout.frist_activity_main Log.i("sys", "Fragment项目启动了"); } public void setActivity(Activity paramActivity) { Log.d("sys", "setActivity..." &#; paramActivity); this.otherActivity = paramActivity; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.i("sys", "OnSaveInstance被调了"); } @Override public void onStart() { Log.i("sys", "onStart被调了"); // TODO Auto-generated method stub super.onStart(); } @Override public void onResume() { Log.i("sys", "onResume被调了"); // TODO Auto-generated method stub super.onResume(); } @Override public void onPause() { Log.i("sys", "onPause被调了"); // TODO Auto-generated method stub super.onPause(); } @Override public void onStop() { Log.i("sys", "onStop被调了"); // TODO Auto-generated method stub super.onStop(); } @Override protected void onDestroy() { Log.i("sys", "onDestroy被调了"); // TODO Auto-generated method stub super.onDestroy(); } } 5.参考文章

1. 通过反射启动未安装的APK中的Activity的实例代码)

5. 通过反射启动未安装的APK中的Activity的实例图形说明)

Android Studio中忽略目录不显示在Project文件列表中 在AndroidStudio中,有时一个Projcet下Module比较多,可能有些不需要显示,这时需要隐藏掉一些Module不显示,但是Studio默认没有提供可视化的操作,但是可以

android自定义控件之模仿优酷菜单 去年的优酷HD版有过这样一种菜单,如下图:应用打开之后,先是三个弧形的三级菜单,点击实体键menu之后,这三个菜单依次旋转退出,再点击实体键me

Android—给控件设置边框 ?xmlversion=1.0encoding=UTF-8?shapexmlns:android=

标签: 安卓动态图标怎么实现

本文链接地址:https://www.jiuchutong.com/biancheng/382218.html 转载请保留说明!

上一篇:Android 开源交流分享汇总(安卓开源好处)

下一篇:Android Studio中忽略目录不显示在Project文件列表中(android studio报错)

  • 出售固定资产简易计税账务处理
  • 网上代增值税专用发票流程
  • 成本 费用区别
  • 进项税加计扣除账务处理
  • 自建办公楼销售要交土地增值税吗
  • 应付款管理参数设置的基本操作流程
  • 大病医疗专项附加扣除标准举例
  • 营改增后哪些费用可以抵扣
  • 个人独资企业可以不开公户吗
  • 电子发票开错了怎么解决?
  • 租赁费支出可以在税前扣除吗
  • 购买固定资产增值税可以抵扣
  • 制造业异地安装要预缴增值税吗?如何预缴?
  • 应征增值税不含税销售额是什么意思
  • 红字记账的四种登记方式
  • 哪些津贴免征个税
  • 增值税专用发票和普通发票的区别
  • 外汇收汇怎么做账
  • 企业购买二手车需要缴纳哪些税
  • 进项税额加计抵减怎么做分录
  • 公对公转账不开票可以吗
  • js app框架
  • 天猫积分购物券怎么获得
  • 新公司成立的前期准备工作计划
  • 作为一名程序员应该掌握哪些语言
  • 借款业务包括以下哪些形式
  • wordpress简码怎么用
  • Php实现邀请用户加入企业生成邀请链接
  • 保险公司赔付进项税
  • 深入理解php内核pdf
  • php调用外部程序
  • [error] Error: Fail to open IDE 问题解决
  • 分配股利账务处理
  • 服务费可以暂估成本吗
  • 数据读取流程
  • PHP中include/require/include_once/require_once使用心得
  • php调用微信扫描二维码
  • 期末结转主营业务收入负数
  • 火车票抵税申报表怎么填
  • 长期应付款的会计编号
  • 人力资源投资收益
  • 房产税计入管理费用还是税金附加
  • 注册公司时企业类型为什么没有自然人独资
  • 公司给员工买意外险需要员工出钱吗
  • 进项税金抵扣
  • 投资性房地产转为存货
  • 无形资产如何摊销 当月还是下月
  • 公司购买房子如何交税
  • 坏账准备的会计处理方法
  • 车辆处置缴纳增值税税率
  • 差旅费所得税扣除标准2023
  • 进口关税免征
  • 土地出让金抵减增值税
  • 股东出资转为借款
  • 公司固定资产报废申请范文
  • 存货类明细分类账一般采用
  • 应收账款转营业外支出
  • 应纳税所得额收入总额包括
  • 注册公司的流程及费用标准
  • 财务建账应关注哪些内容
  • 会计利润是利润加暂时性差异吗为什么
  • mysql分页性能
  • win7怎么操作
  • w7系统ip地址
  • ubuntu基本配置
  • fedora29
  • win10升级后无法进入系统一直重启
  • xp 控制面板
  • 怎么才能给电脑提速
  • centos sh
  • win10系统升级后桌面图标变大
  • win8.1怎么退出安全模式
  • glib库
  • 3d动态锁屏壁纸下载
  • shell脚本自动化
  • 怎么把两个文件中的内容合并
  • 税务贷app
  • 税务注销核对发票怎么办
  • 福利费是否计入成本费用
  • 沈阳和平税务大厅电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设