自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 LifeCycle原理分析

Lifecycle使用1.LifecycleObserver接口实现LifecycleObserver接口,在想要被回到的声明周期方法上加上@OnLifecycleEven注解。注解的值表示,哪个声明周期时间进行触发。Lifecycle.Event.ON_CREATEpublic class BasePresenter implements LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) void o

2021-06-30 17:28:46 271

原创 LiveData原理分析

LiveData使用流程LiveData是一种具有生命周期感知能力的可观察数据持有类。LiveData可以保证屏幕上的显示内容和数据一直保持同步。LiveData了解UI界面的状态,如果activity不在屏幕上显示,LiveData不会触发没必要的界面更新,如果activity已经被销毁,会自动清空与Observer的连接,意外的调用就不会发生。LiveData是一个LifecycleOwner,他可以直接感知activity或Fragment的生命周期。在项目中,LiveData一般是存放

2021-06-30 17:27:47 349

原创 Binder_AIDL

binder 简介Binder是Android提供的一套进程间相互通信框架。用来多进程间发送消息,同步和共享内存。binder内存共享Socket性能需要拷贝一次无需拷贝需要拷贝两次次特点基于C/S 架构,易用性高控制复杂,易用性差基于C/S 架构;作为一款通用接口,其传输效率低,开销大安全性为每个APP分配UID,同时支持实名和匿名。依赖上层协议,访问接入点是开放的不安全依赖上层协议,访问接入点是开放的不安全内存被操作系统划分成两块:用户空间

2021-06-24 14:22:49 252

原创 View绘制流程

view的添加//ActivityThread.javapublic void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) { final ActivityClientRecord r = performResumeActivity(token, finalStateRequest

2021-06-24 14:22:26 144

原创 WMS分析

WMS基础知识(WMS)Framework层的窗口管理服务,职责是管理Android系统中的所有的Window。窗口管理服务,继承IWindowManager.Stub,Binder服务端,因此WM与WMS的交互也是一个IPC的过程Z-ordered的维护函数;输入法管理;AddWindow/RemoveWindow;Layerout;Token管理,AppToken;活动窗口管理(FocusWindow);活动应用管理(FocusAPP);转场动画;系统消息收集线程;系统消息分发线程;Window

2021-06-24 14:19:37 613

原创 Retrofit

Retrofit 简介准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。 网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之 后由 OkHttp 完成后续的请求操作。在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。Okh

2021-06-24 14:18:12 168

原创 AMS_1

Activity启动流程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6JlfkUXU-1624238556945)(C:\Users\zl123\AppData\Roaming\Typora\typora-user-images\1624063652407.png)]Launcher调用startActivity方法启动App,先经过AMS,如果App进程没有启动过,则AMS通过socket向Zygote通信,Zygote会fork出App进程。这时,会进入App进程执

2021-06-21 09:25:54 403

原创 AMS_0

SystemServer启动createSystemContext创建Context,加载android系统需要的资源等。//SystemServer.javaprivate void createSystemContext() { //创建ActivityThread,通过ActivityThread获取mSystemContext,通过mSystemContext设置主题 ActivityThread activityThread = ActivityThread.systemM

2021-06-21 09:25:15 229

原创 Android系统启动流程

Android系统分层1.Linux 内核 。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能。例如线程和低层内存管理。2.硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个 库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。3.Android Runtime对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的

2021-06-21 09:24:25 765

原创 数据结构和算法

Lru算法1.新数据插入到链表头部2.当缓存命中(即缓存数据被访问),数据要移到表头3.当链表满的时候,将链表尾部的数据丢弃树**结点的度:**结点的子树个数**树的度:**树中所有结点中最大的度**结点的层次:**规定根结点在1层,子结点的层数是它父结点的层数加1**树的高度:**树中所有结点中最大的层次是这棵树的高度树与非树1.子树是不相交的2.除了根结点之外,每个结点之有且只有一个父结点3.一个N个结点的树只有N-1条边哈夫曼树给定一段字符串,如何对字符串进行编码,可以使得

2021-05-25 10:14:27 288

原创 增量更新

bsdiff包含两个程序:bsdiff (比较两个文件的二进制数据,生成差分包)与bspatch (合并旧的文件 与差分包,生成新的文件)。bsdiff oldfile newfile patchfilebspatch oldfile newfile patchfile在Android中使用只需要使用bspatch就可以,就是调用main方法,我们可以将main方法改一个名字,然后调用就可以了传入#include <jni.h>#include <android/log.h&

2021-05-19 07:58:58 293

原创 插件化

一:加载插件类基础知识插件化解决的问题APP的功能模块越来越多,体积越来越大模块之间的耦合度高,协同开发沟通成本越来越大方法数目可能超过65535,APP占用的内存过大应用之间的互相调用类的生命周期加载 链接(验证,准备,解析)初始化 使用 卸载在加载阶段,虚拟机主要完成三件事: 1.通过一个类的全限定名来获取定义此类的二 进制字节流。 2.将这个字节流所代表的静态存储结构转化为 方法区域的运行时数据结构。 3.在Java堆中生成一个代表这个类的Class对象, 作为方法区域数据的访问

2021-05-19 07:58:16 167

原创 热修复

一:热修复方案AndFix在native动态替换Java层的方法,通过native层hook Java层代码。@MethodReplace(class="",method="")注解Robust对每个函数都在编译打包阶段自动的插入了一段代码。类似于代理,将方法执行的代码重定向到其他方法中。public static ChangeQuickRedirect changeQuickRedirect; public long getIndex() { if(changeQuic

2021-05-19 07:57:53 308

原创 组件化

组件化一简介单一分层问题: 1.随着项目增大,项目失去层次感,维护困难; 2.包名约束太弱,容易出现不同业务包直接互相调用,代码高耦合; 3.多人开发在版 本管理中,容易出现代码覆盖(低内聚,高耦合,无重用,层次混乱)**组件化的意义:**不相互依赖,可以相互交互,任意组合,高度解耦,自由拆卸,自由组装,重复利用, 分层独立化具体实现: 业务模块(order,login)互相独立不会互相依赖,统一依赖底层模块(base,common,net…),壳模块(app)依赖各个业务模块;gradle简单

2021-05-19 07:57:33 456

原创 Rxjava学习笔记

RxJava常见操作符map flatMap doOnNextFlowable(背压)flatMap可以解决两种状况:1.要获取集合中的数据,避免使用for语句的嵌套结构;配合下面api使用//传入集合,可以将集合中的元素去除封装成Observable<DATA>一个个发出,不需要for循环了//如果用map的话,就要使用for循环Observable.fromIterable(projectBean.getData()); 2.和retrofit配合时,因为Service

2021-05-18 17:48:01 396

原创 Okhttp

OkHttp简介优点:支持Http1、Http2、Quic以及WebSocket连接池复用底层TCP(Socket),减少请求延时无缝的支持GZIP减少数据流量缓存响应数据减少重复的网络请求请求失败自动重试主机的其他ip,自动重定向设计模式:建造者,门面,责任链**分发器:**内部维护队列与线程池,完成请求调配;**拦截器:**五大默认拦截器完成整个请求过程。OkHttpClient okHttpClient = new OkHttpClient();final Request r

2021-05-18 17:47:23 286

原创 序列化

序列化:将数据结构或对象转换成二进制串(java指byte[ ] )的过程。持久化:把数据结构或对象 存储到硬盘序列化方案:1.Serializable;2.Parcelable 3. json,xml,protbuf … 广义的序列化SerializableSerializable 一般配合 ObjectOutputStream(序列化) 和 ObjectInputStream(反序列化) 一起使用如果你已经序列化了一个类的对象,并且持久化保存;这时在该类添加了一个字段。再次通过持久化的数据进

2021-05-18 17:46:42 311 2

原创 类加载机制

JVM与AndroidVM(Dalvik ART)JVM运行class文件,指令集基于栈;AndroidVM运行dex文件,指令集基于寄存器;Dalvik与ARTDalvikDalvik虚拟机将dex文件翻译成机器码执行,支持解释执行和JIT(Just In Time )执行(Android 2.2版本开始 );Dalvik下应用在安装的过程,会执行一次优化,将dex字节码进行优化生成odex文件。解释执行就是翻译一行执行一行;JIT是在运行过程中,对热点代码进行编译或者优化,不要每次执行都

2021-05-18 17:45:13 128

原创 多线程最全最细总结

线程基本知识进程是程序运行资源分配的最小单位线程是 CPU 调度的最小单位,必须依赖于进程而存在CPU 时间片轮转机制我们平时在开发的时候,感觉并没有受 cpu 核心数的限制,想启动线程就启 动线程为什么?这是因为操作系统提供了一种 CPU 时 间片轮转机制。 时间片轮转调度是一种最古老、最简单、最公平且使用最广的算法,又称 RR 调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。 如果在时间片结束时进程还在运行,则 CPU 将被剥夺并分配给另一个进程。 如果进程在时间片结束前

2021-05-18 17:44:31 254

原创 Jvm内存管理

JVM基础知识它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。(翻译)跨平台,跨语言JVM,JRE,JDK的关系JVM只是一个翻译,把Class翻译成机器识别的代码,但是需要注意,JVM 不会自己生成代码,需要大家编写代码,同时需要很多依赖类库,这个时候就需要用到JRE。JRE是什么,它除了包含JVM之外,提供了很多的类库(就是我们说的jar包,它可以提供一些即插即用的功能,比如读取或者操作文件,连接网络,使用I/O等等之类的)这些东西就是JR

2021-05-18 17:43:54 86

原创 java垃圾回收

虚拟机中对象分配过程1.检查加载首先检查new指令的参数能否在常量池中定位到一个类的符号引用,并且检查类是非已经加载,解析,初始化;如果没有,那么通过类加载器将class加载到方法区;2.分配内存给对象分配内存空间相当于将一块确定大小的内存在堆中划出来分配内存的具体方式指针碰撞:如果Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。空闲列表:如果Java堆中的内存是不规整的,已使用的内存和空闲

2021-05-18 17:42:30 96

原创 java_IO

java IO分类字节流:数据流中最小的数据单元是字节 (InputStream,OutputStream)字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。 (Reader,Writer)**文件:**File; RandomAccessFile字符流和字节流的转换: InputStreamReader和 OutputStreamWriter 门面设计模式,内部使用 StreamEncoder 来实现。FileWriter:可以简化

2021-05-18 17:42:10 279 2

原创 注解和反射

常用Java命令Java:运行 ; Javac:编译 ; javap:反编译 ; javah:jni生成C,C++头文件;注解元注解:自定义元注解:@Target ( ElementType.ANNOTATION_TYPE )常见元注解@Inherited :表示允许子类 继承父类中定义的注解。@Documented :用于被javadoc工具提取成文档@intDef :用来进行语法检测@Target:以限制可以应用注解的 Java 元素类型。ElementType.ANNOTATION

2021-05-18 17:41:24 134

原创 glide

Glide.with(this).load(URL).into(imageView)with流程就是返回RequestManager//Glide.javaprivate final RequestManagerRetriever requestManagerRetriever;//此处有context、FragmentActivity、Fragment、View 的类似方法...//with方法最终返回RequestManager对象public static RequestManager

2021-05-18 17:31:14 264 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除