- 博客(72)
- 收藏
- 关注
原创 SDK - (5) - ArrayMap
一、内部结构 二、原理 数据结构2个数组,一个存key的hash值 ,一个存key和value的值。 Get操作 -> 通过key值得到hash值 -> 通过2分查找求出index (数据量大 效率降低原因之一) -> key = Arrays[2*index] value = Arrays[2*index +1] ...
2019-12-16 21:46:38
329
原创 SDK - (4) - AIDL
一、使用步骤 1、创建AIDL文件 写提供服务的接口方法 2、创建服务Service,覆盖Bind方法 返回bind对象。 3、bindService获取Service代理对象 参考:https://www.jianshu.com/p/467016b4487c 二、支持的类型 三、自定义object需满足下面2个条件 1、实现Parcelable接口 ...
2019-12-16 21:41:44
314
原创 SDK - (3) - Binder
一、Linux的IPC方式 1、管道(Pipe)及有名管道(named pipe) 2、信号(Signal) 3、报文(Message)队列(消息队列) 4、共享内存 5、信号量(semaphore) 6、套接字(Socket) 二、Binder Android独有的跨进程通信方式,具备传输效率较高、安全性更高、稳定性更好等特点。 1、传输效率较高 -> 传输过程数据...
2019-12-15 20:14:09
265
原创 三方 - (3) - Arouter
官方中文介绍:https://github.com/alibaba/ARouter/blob/master/README_CN.md 一、基本使用 1、添加依赖 android { defaultConfig { javaCompileOptions { annotationProcessorOptions { ...
2019-12-06 22:40:22
302
原创 三方 - (10) - 热修复
一、热修复类别 阿里系:阿里百川HotFix、DeXposed从底层二进制c语言入手 腾讯系:QQ空间的超级补丁、微信的Tinker (从java加载机制入手) 二、类加载器类别 1. PathClassLoader:只能加载已经安装到Android系统中的apk文件(/data/app目录),是Android默认使用的类加载器。 2. DexClassLoader:可以...
2019-12-06 22:36:50
183
原创 三方 - (9) - 插件化
一、插件化需解决的问题 1、插件dex加载问题 通过反射拿到DexClassLoader,解析插件dex与宿主dex合并后,重新插入宿主DexPathList中。 2、插件组件生命周期问题 提前占坑注册代理组件, 在校验前保存真实跳转信息,利用代理组件通过系统校验, 校验后拦截h跳转,取出信息完成启动。 3、插件之间资源id冲突问题 重写Context的getAsset、g...
2019-12-06 22:35:04
157
原创 三方 - (11) - 组件化
一.组件化需解决的问题 1、组件之间 - 通信问题 数据通信 - 接口下沉 界面 - Arouter 事件 - EventBus 2、组件单独运行 - Application 和 module 切换 gradle自定...
2019-12-06 22:33:39
277
原创 Java基础(17) - 不可变对象
一、存在的意义 1、让并发编程变得更简单 线程安全问题的根本原因在于:多个线程需要同时访问同一个共享资源。 假如没有共享资源,那么多线程安全问题就自然解决了,Java中ThreadLocal机制就是采取的这种思想。 2、消除副作用 防止在其他地方修改了对象属性,导致结果未按预期运行。(String设计成Final的原因之一) 3、减少容器类使用过程出错的概率 当使用Has...
2019-12-06 22:19:25
212
原创 Java基础(20) - JDK各版本特性
一、Java7 1、switch中可以使用字符串 2、泛型的自动判断 List<String> tempList = new ArrayList<>(); 3、自定义自动关闭类(实现AutoCloseable接口) 只要实现该接口,在该类对象销毁时自动调用close方法,你可以在close方法关闭你想关闭的资源 4、新增一些取环境信息的工具方法(System中的...
2019-12-04 22:21:18
342
原创 Java基础(19) - 网络编程
BIO、NIO、AIO 待补充~ NIO vs IO之间的理念上面的区别(NIO将阻塞交给了后台线程执行) IO是面向流的,NIO是面向缓冲区的 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方; NIO则能前后移动流中的数据,因为是面向缓冲区的 IO流是阻塞的,NIO流是不阻塞的 Java IO的各种流是阻塞的。这意味着,当一个...
2019-12-04 22:20:49
147
原创 并发(2) - 锁分类
2种分类法 一、一类8种 1、乐观锁/悲观锁 2、独享锁/共享锁 3、互斥锁/读写锁 4、可重入锁 5、公平锁/非公平锁 6、分段锁 7、偏向锁/轻量级锁/重量级锁 8、自旋锁 参考:https://www.cnblogs.com/hustzzl/p/9343797.html 二、一类有3类 方法锁、对象锁、类锁。(方法锁也是对象锁的一种) 1、对象锁 对象锁 ...
2019-12-04 22:17:32
261
原创 并发(1) - JMM
一、主存储器与工作存储器 JMM 分为主存储器(main memory)和工作存储器(working memory)两种。 主存储器(main memory) 类的实例所存在的区域(堆),为所有线程共享。 工作存储器(working memory) 每个线程各自独立所拥有的作业区,在working memory中,存有main memory中的部分拷贝,称之为工作拷贝(wor...
2019-12-04 22:13:50
147
原创 并发(3) - 关键字
一、并发特性 1、可见性 a、 保证任何一个线程修改变量立即写入到主内存中(堆); b、 所有线程对该变量引用会强制立即失效,并且该线程必须去堆中获取最新的变量值。 2、指令重排序 代码的执行顺序 会在JVM中(编译器优化 指令级并行重排序 内存系统重排序 最终执行的指令序列) 3、原子性 同一时刻最多只有一个线程访问该段代码。 二、Volatile ->...
2019-12-03 20:28:45
158
原创 Java进阶(5) - JMM
一、主存储器与工作存储器 JMM 分为主存储器(main memory)和工作存储器(working memory)两种。 主存储器(main memory) 类的实例所存在的区域(堆),为所有线程共享。 工作存储器(working memory) 每个线程各自独立所拥有的作业区,在working memory中,存有main memory中的部分拷贝,称之为工作拷贝(wor...
2019-12-03 20:25:45
150
原创 Java基础(18) - JVM
JVM由类加载器、运行时数据区、执行引擎3部分组成 一、类加载器 有启动类、扩展类、系统类、自定义4种类型加载器 (1)启动类加载器 (Bootstrap ClassLoader )-> 它用来加载Java的核心库,比如String、System这些类 -> JRE/lib/rt.jar (2)扩展类加载器(Ext ClassLoader由Java语言实现,父类加载器为...
2019-12-03 20:24:27
215
原创 Java基础(17) - 不可变对象
一、存在的意义 1、让并发编程变得更简单 线程安全问题的根本原因在于:多个线程需要同时访问同一个共享资源。 假如没有共享资源,那么多线程安全问题就自然解决了,Java中ThreadLocal机制就是采取的这种思想。 2、消除副作用 防止在其他地方修改了对象属性,导致结果未按预期运行。(String设计成Final的原因之一) 3、减少容器类使用过程出错的概率 当使用Has...
2019-12-03 20:20:38
247
原创 Java基础(16) - Class类
一、存在的意义 位于java.lang包下,和java.lang.reflect包下的类共同支持java反射功能 jvm在类加载时,在堆中为每个类生成一个Class对象,用于记录每个类的属性、方法等信息, 同时每个对象生成时都有特殊的标记位来指向堆中的Class对象。 二、获取的三种方式 1 、Class.forName("全路径名") 2 、类名.Class 3、实例对象...
2019-12-03 20:19:59
199
原创 Java基础(15) - Object类
一、Object类9大方法是哪些 1、Clone方法 实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常 Java里参数传递,除了8种基本类型是值传递。其他类对象都是引用传递。 2、getClass方法 final方法,获得运行时类型。 3、toString方法 该方法用得比较多,一般子类都...
2019-12-03 20:19:21
149
原创 Java基础(13) - Error与Exception
一、Error(错误) 是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。 二、Exception 异常 表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,...
2019-12-03 20:17:41
149
原创 Java基础 (14) - 多线程
多线程的方式有Thread、Runnable、Callable、ExecutorService四种方式 1.Thread、Runnable区别 (1) Thread是类,Runnable是接口(支持多继承)。Thread可以理解成实现了Runnable接口的类。 (2) Runnable资源共享实现较简单。 (3) 增加程序的健壮性,代码可以被多个线程共享,代码和数据独立 (4) 线程池...
2019-12-03 20:16:29
164
原创 Java基础 (12) - 序列化
一、序列化是干什么的? 内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。 二、什么情况下序列化 a、对象需要持久化 (硬盘or数据库) b、网络传输 (套接字orRMI) c、在进程间传递对象 三、序列化ID的作用 java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本...
2019-12-03 20:14:01
116
原创 Java基础(4) - 引用类型
1、强引用 虚拟机回收时,就算内存不足也不会回收。 2、软引用 虚拟机回收时,当内存不足时才回收。(使用时需判断是否为空) 适合操作频率不高,想避免OutOfMemory异常的发生。(Bitmap) 3、弱引用 虚拟机回收时,只要发现有弱应用即回收。(使用时需判断是否为空) 适合操作频率高,想应用有更好的性能。(handler) 4、虚引用 仅持有虚引用的对象,...
2019-12-03 20:13:42
102
原创 Java基础 (11) - 反射
一、能解决 Java中编译分为静态编译和动态编译。 静态编译:在编译时确定类型,绑定对象,即通过。 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,从而降低类之间的藕合性。 二、能得到 实现Java反射机制的类都位于java.lang.reflect包中: 1、Class类:代表一个类 2、Field类:类的属性(成...
2019-12-02 21:55:17
116
原创 Java基础(10) - 内部类
一、存在意义 1、内部类可以很好的实现隐藏 一般的非内部类,是不允许有private与protected权限的,但内部类可以 2、内部类拥有外部类所有元素的访问权限 ,private修饰也能访问。 3、可实现多重继承 ,让多个内部类分别继承多个其他类,使外部类可以同时获取多个其他类的属性。 4、可以避免修改接口而实现同一个类中两种同名方法的调用。(外部类继承,让内部类实现接口) 参考:...
2019-12-02 21:54:04
150
原创 Java基础(9) - 静态、代码块
关键字 加载顺序 、类初始化 、方法区、进程 一、存在作用 变量 -> 全局共享 (跨线程,但不支持跨进程) 方法 -> 不用类实例就能直接使用,避免New的消耗。(为什么静态方法不能访问非静态变量) 代码块 -> 静态块在类初始化就运行 ,初始化顺序 静态代码块 -> 普通代码块 -> 构造方法 -> 普通方法,...
2019-12-02 21:53:12
155
原创 Java基础(8) - 接口、抽象类
存在的意义 接口 - 接口对维护和解耦代码有很很好的帮助 同时由于接口常用来约束对象的行为,可实现”多继承“。 抽象类 - 抽象类对于代码的维护和重用有很好的帮助。 参考: 接口 - https://blog.youkuaiyun.com/googleoyyp/article/details/78912259 抽象类 - https://blog.youkuaiyun.com/chenchaozzu/a...
2019-12-02 21:51:28
107
原创 Java基础 (7) - 泛型
能解决 1.参数“模板”化 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定 泛型归根到底就是“模版” 2、使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换,防止程序运行时出现转换异常 3、接受宽泛的数据类型 泛型主要在集合类中使用,eg: List<String> list = new ArrayList<String>(); St...
2019-12-02 21:50:54
187
原创 Java基础 (6) - 枚举
能解决 1.类或方法强制使用者传入预设的值 2.性能相对常量更好 - (Android环境除外) 使用办法 public enum ColorEnum{ WHITE("0x000001"),BLACK("0x000002"),GREEN("0x000003"); private final String color; private ColorEnum...
2019-12-02 21:49:49
126
原创 Java基础 (5) - 集合
一、分类 Java集合大致分为 List、Set、Map 、Queue四种, List代表有序、重复的集合; Set代表无序、不可重复的集合; Map则代表具有映射关系的集合 Queue Java5增加,代表一种队列的集合 二、List - 有序 | 重复 常见的list有ArrayList、LinkedList、CopyOnWriteA...
2019-12-02 21:49:14
150
原创 Java基础 (2) - 基本数据类型及包装类
关键字 位数、常量池、包装类(自动装拆箱) 一、基本数据类型 1、8种基本数据类型 整数类型:byte,short,int,long 浮点数类型:float(4B),double (8B) 字符类型:char (2B) 布尔类型:boolean (1B 或 4B) 2、位数 1、JVM规范中,boolean作为int处理,占4字节 ,boolean数组当做byte数组,占1...
2019-12-02 21:44:20
157
原创 Java基础 (3) - String
String StringBuilder/Buffer StringFormat 一、可变与不可变 String -> private final char value[]; final 不可变的 StringBuilder/Buffer -> char value[] 可变的 String设计成”不可变”对象是因为多个指引指向同一个内存空间,如任意指...
2019-12-02 21:42:11
197
原创 系统 - (1) - AsyncTask
一、什么是AsyncTask 1、是一种轻量级的异步任务类; 2、是一个封装了线程池和Handler的异步框架; 3、使用它可以更加方便的执行后台任务以及在主线程访问UI,但他不适合进行特别耗时的后台任务; 二、AsyncTask的使用方法 1、3个参数 Params:执行AsyncTask时,后台任务需要传入的参数,在doInBackground中取出使用。 Progress...
2019-12-02 21:41:16
164
原创 Java基础 (2) - 基本数据类型及包装类
关键字 ->位数、常量池、包装类(自动装拆箱) 一、8种基本数据类型 整数类型:byte,short,int,long 浮点数类型:float(4B),double (8B) 字符类型:char (2B) 布尔类型:boolean (1B 或 4B) 二、位数 1、JVM规范中,boolean作为int处理,占4字节 ,boolean数组当做byte数组,占1个字节。 ...
2019-12-01 21:03:47
137
原创 Java基础 (1) - 面向对象特性
1.抽象 现实生活中的事物被抽象成对象,把具有相同属性和行为的对象被抽象成类,再从具有相同属性和行为的类中抽象出父类。(找出共同部分抽出来) 2.封装 隐藏对象的属性和实现细节,仅仅对外公开接口。 3.继承 子类和父类之间的继承关系,子类可以获取到父类的属性和方法。 注:关于子类能否继承父类的私有方法? 从语言角度上说:JDK官方文档明确说明子类不能继承父类的私有方法...
2019-12-01 21:01:06
140
原创 SDK - (2) - Handler
1、不允许在子线程中访问UI? UI控件非线程安全,多线程中并发访问会导致UI控件处于不可预期的状态。 UI控件不上锁机制的原因有: 上锁会让UI控件变得复杂和低效 上锁后会阻塞某些进程的执行 2、Handler.postDelayed()是否精确延时? 当上一个消息存在耗时任务的时候,会占用延时任务执行的时机,当上一个任务耗用总时超过上下任务执行时间的时间差时,后一个任务会被延时...
2019-12-01 20:52:28
206
原创 SDK - (1) - AsyncTask
一、什么是AsyncTask 1、是一种轻量级的异步任务类; 2、是一个封装了线程池和Handler的异步框架; 3、使用它可以更加方便的执行后台任务以及在主线程访问UI,但他不适合进行特别耗时的后台任务; 二、AsyncTask的使用方法 1、3个参数 Params:执行AsyncTask时,后台任务需要传入的参数,在doInBackground中取出使用。 Progress...
2019-12-01 20:50:12
164
原创 Framework(8) - WMS
一、主要功能 (1)计算与管理窗口的位置、层次(控制窗口的显示与隐藏的以及要显示的位置) (2)根据(1)来渲染窗口动画 (3)持有SurfaceControl,在Surface初始化的时候,会初始化一个Canvas(画布) 二、主要成员 mDecor:DecorView的实例,标示Window内部的顶级视图。 mContentRoot:是DecorView的唯...
2019-12-01 20:48:18
259
原创 Framework(6) - AMS
一、AMS重要角色 1.ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期。 2.ActivityThread,App的真正入口。当开启App之后,调用main()开始运行,开启消息循环队列,这就是传说的UI线程或者叫主线程。与ActivityManagerService一起完成Activity的管理工作。 3.Applicati...
2019-12-01 20:47:28
345
原创 Framework(5) - 系统启动
一、大致流程 Cpu -> bootLoader ->native daemons -> android runtime -> zygote进程 -> systemService -> ams -> lanuch 二、启动层级 BootLoader引导 BootLoader是一段引导程序,类似于Windows开机时的出现第一个画面(有品牌...
2019-12-01 20:47:00
256
原创 Framework(4) - APP启动
Launcher本身就是一个应用程序,我们启动app时的本质是对Launcher这个app进行操作。Launcher接收到点击事件时调用startActivity方法,进行activity的跳转。但是与我们平时开发app有所不同,我们要启动的Activity所在的app运行在另外一个进程中,这就涉及到跨进程通信(IPC,Inter-Process Communication)。 Android中...
2019-12-01 20:45:50
374
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅