1
2
3
title: Android Bundle容器
date: 2020-07-06 09:07:20
tags: android

Android Bundle容器

凡走过,必留下痕迹。

介绍:类似于Map的Key-value的形式,实现了Parcelable

作用:Bundle 与Intent 一样,都可以在Activity、Fragment中传递数据。

场景:

Activity的onSaveInstanceState(Bundle outState)

Activity的onCreate(Bundle saveInstanceState)

Fragment的argment属性

Message的setData、获取:meg.getData.getString(“key”)

Intent.putExtras(Bundle bundle)

清楚数据:clear()

例子:

第一种写法,用于批量添加数据到Intent:

1
2
3
4
Intent intent = new Intent();
  Bundle bundle = new Bundle();//该类用作数据载体
  bundle.putString("name","Mike");
  intent.putExtras(bundle);//可追加额外的数据,key同名的数据会被替换,与Map用法类似

第二种写法:不通过Bundle,把数据一个个地添加进Intent,这种写法使用起来比较方便,代码更简洁。

1
2
Intent intent = new Intent();
  intent.putExtra("name","XXX");//注意:不是putExtras,

取值:

传完数据后,现在看看如何将Intent和Bundle取出来:
  ①直接使用this.getIntent() 得到传来的Intent
  ②然后在这个Intent的基础上调用getExtras()得到Bundle
  ③根据数据类型可以从Bundle中get数据。
  比如

String str=bundle.getString(“Name”);得到键为“Name”的字符串

int num=bundle.getInt(“code”);得到键为“code”的整型。
  另外一定要注意getExtrasgetExtra的区别。带s用于Bundle添加值和取值。

Message.setData同理Intent的Bundle使用

用Bundle向Fragment传递参数不会在Activit被重建时销毁。

1
2
3
title: Fragment的arguments属性
date: 2020-07-06 09:07:20
tags: Fragment查缺补漏

Arguments(Bundle bundle)

凡走过,必留下痕迹。

作用:Fragment.setArguments(Bundle bundle) 用来传递参数。

区别于构造方法直接来传递参数。

当Activity被重新创建的时候(屏幕旋转,后台运行内存过低被回收等等情况),会重构Activity所管理的Fragment,原先Fragment的字段将会全部显消失,使用arguments方法设置的bundle的值会保留下来,而用构造方法来传递的参数会消失。

Android ClassLoader详解

Android中类加载器有

BootClassLoader,

URLClassLoader,
PathClassLoader,

DexClassLoader,

BaseDexClassLoader,

等都最终继承自java.lang.ClassLoader

双亲委派模型

还有自定义的类加载器,它们之间的层次关系被称为类加载器的双亲委派模型。

优点

类就会随着加载它的ClassLoader一起具备了一种带有优先级的层级关系,通过这种层级关系可以避免类的重复加载,同时也能保证Java核心类库的安全性

热修复技术

1:qq空间超级补丁

2:微信Tinker

3:饿了么Amigo

4:美团Robust :

5:360RePlugin :

6:滴滴出行VirtualAPK 等

dex文件原理:单个dex文件,全部最多65536个方法

dex分包:app启动时必须用到的类类和这些类文件放在主dex文件,其他放在次dex文件

类加载器:java的类加载器是加载class文件,而Android的虚拟机无论是dvm还是art都只能识别dex文件,所以java的类加载器在Android中不适用,Android中的 Java.lang.ClassLoader类也不同与java中的Java.lang.ClassLoader类。

ClassLoader层级关系为ClassLoader—>BaseDexClassLoader —>Dex ClassLoader和PathClassLoader,

其中:

PathClassLoader是用来加载Android系统类和应用的类

DexClassLoader支持加载APK、DEX和JAR,也可以从SD卡进行加载 ClassLoader类根据一个指定的类名称,找到或者生成相应的字节码,然后从这些字节码中定义出一个java类 DexClassLoaderPathClassLoader都属于符合双亲委派模型的类加载器(因为它们没有重载loadClass方法)。

类加载热修复:当分包完成之后,会形成一个dex包的有序数组,当需要加载类加载器的时候,会从数组中第一个dex包开始加载,直到找到这个类为止,当多个dex包中都有这个文件的时候,就取第一个文件,热修复是通过将已经修复了的bug包打成dex包,并将这个dex包放在有序数组的第一个,当加载类文件的时候,首先会找到修改好的dex包去替换之前存在bug的dex包,而排在后面的存在bug的dex包根据类加载器的双亲委派机制不会被加载,这就是类加载热修复方法的实现。

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment