自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android进阶(八)热修复基本原理

一、代码修复1、类加载方案(1)Dex分包原理单个Dex文件里面方法数不能超过65536个方法。(1)原因:因为android会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的, short占两个字节(保存-2的15次方到2的15次方-1,即-32768~32767),最大保存的数量就是65536。(2)解决方案:精简方法数量,删...

2019-02-19 19:40:28 515

原创 Android进阶(七)Android中的ClassLoader

一、Java中的ClassLoader1、继承关系ClassLoader是一个抽象类,其中定义了ClassLoader的主要功能。SecureClassLoader继承了抽象类ClassLoader,但SecureClassLoader并不是ClassLoader的实现类,而是拓展了ClassLoader类加入了权限方面的功能,加强了ClassLoader的安全性。URLClassLo...

2019-02-11 19:47:53 1385

原创 Android进阶(六)Binder机制

一、进程通信1、进程隔离:进程隔离是为保护操作系统中进程互不干扰而设计的一组不同硬件和软件的技术。进程数据不共享,进程A的虚拟地址和进程B的虚拟地址不同,这样就防止进程A将数据信息写入进程B,保证了数据的安全性。进程空间分为内核空间和用户空间,内核空间(Kernel)是系统内核运行的空间。用户空间(User Space)是用户程序运行的空间,他们之间是隔离的。内核有访问的所有权限,用户...

2019-02-11 13:46:22 317

原创 Android进阶(五)View绘制流程

一、Activity的setContentView1、setContentView#Activitypublic void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar();}public voi...

2019-02-03 15:34:03 174

原创 Android进阶(四)Window和WindowManager

一、Window、WindowManager、WMS1、三者的定义和关系Window可以理解为窗体,是一种抽象概念,其中具体表现形式就是View。WindowManager是用来添加、删除、更新Window(具体是View)的。WindowManagerService是在SystemServer进程中的,WindowManger中的所有操作都是由WMS来最终完成的。三者关系:2、...

2019-01-29 10:25:05 382

原创 Android进阶(三)Activity启动

一、Activity起始1、开始startActivity#Activity@Overridepublic void startActivity(Intent intent, @Nullable Bundle options) { if (options != null) { startActivityForResult(intent, -1, options);...

2019-01-23 19:59:29 247

原创 Android进阶(二)应用进程启动

一、应用程序进程创建1、 应用进程请求Zygote进程会创建一个Socket,用来等待AMS请求创建应用进程。ActivityManagerService会通过调用startProcessLocked来发送请求。接收到请求后,Zygote进程会fork自身创建应用进程。2、接收创建请求通过ZygoteServer的runSelectLoop方法处理创建进程的请求–>Zygo...

2019-01-23 19:56:20 130

原创 Android进阶(一)Android系统启动

一、整体流程init进程 –> Zygote进程 –> SystemServer进程 –>Launcher启动init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程;Zygote进程:android系统的根进程,主要作用:可以作用Zygote进程fork出SystemServer进程和各种应用进程;...

2019-01-17 14:31:53 225

原创 深入理解Java虚拟机(二)

一、编译和代码优化1、编译器优化-泛型:1、泛型出现之前存在的问题:所有对象的类型都继承自Object,虚拟机只有到运行时才能知道这个Object具体是什么类型,在编译期是无法检查这个Object是否强制转型成功,会将ClassCaseException的风险转移到程序运行期。2、泛型的作用:通过泛型,编译器可以在编译阶段发现类型不一致的问题3、泛型擦除:将Java代码编译成Clas...

2018-12-06 19:40:49 97

原创 深入理解Java虚拟机(一)

一、运行时数据区域1、程序计数器:当前线程执行字节码的行号指示器(通过改变计数器的值来选择下条需要执行的字节码指令)每个线程有独立的程序计数器(线程私有,为了切换线程时能恢复到挣钱的执行位置)如果执行java方法,计数器记录正在执行的字节码指令地址。如果执行的是Native方法,计数器为空。唯一没规定任何OutOfMemoryError情况的区域。2、虚拟机栈为执行Java方...

2018-11-21 11:59:54 131

原创 同步(二)

一、原子变量:1、AtomicInteger:原子Integer类型构造:public AtomicInteger(int initialValue)public AtomicInteger()方法://以原子方式获取旧值并设置新值public final int getAndSet(int newValue)//以原子方式获取旧值并给当前值加1public final int...

2018-10-08 18:00:00 127

原创 同步(一)

一、同步的基本概念1、同步的场景线程获取同步锁,获取失败则阻塞等待,获取成功则执行任务,执行完毕后释放锁。2、线程安全问题(1)内存读取cpu在内存读取数据时,顺序优先级:寄存器-高速缓存-内存计算完成后缓存数据写回内存中(2)可见性每个线程都有独立的工作内存,并对其他线程是不可见的。线程执行如用到某变量,将变量从主内存复制到工作内存,对变量操作完成后再将变量写回主内存。...

2018-09-30 17:16:23 127

原创 数据结构(四)队列

一、基本概念1、特点:在队列头部进行删除,在队列的尾部进行插入操作2、主要实现:使用循环数组使用链表3、关系图:二、Queuepublic interface Queue<E> extends Collection<E> { //添加 boolean add(E var1); //添加 boolean offer(E var1)...

2018-09-24 12:32:14 117

原创 数据结构(三)Stack和Vector源码分析

一、基本概念:1、栈是什么? 是一个只能在某一端进行插入、删除操作的线性表。 * 从栈顶插入一个元素称之为入栈(push) * 从栈顶删除一个元素称之为出栈(pop)2、图解: 3、栈的实现:链式存储(链表)顺序存储(数组)4、继承关系:public class Stack<E> extends Vector<E> {...}...

2018-09-05 20:52:33 137

原创 数据结构(二)LinkedList源码分析

一、基本概念1、关系图: public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ ...}实现了List和Deque,内...

2018-09-02 12:48:32 114

原创 数据结构(一)ArrayList源码分析

一、相关特性:1、关系图: 2、特点: * 元素所占存储空间是连续的 * 基于数组实现,容量可自增 * 可通过角标获取指定位置的元素 * 查询快(基于数组索引),增删慢(涉及到数组复制、移动和扩容)二、构造函数和变量:1、变量:public class ArrayList<E> extends AbstractList<E> ...

2018-08-31 18:24:30 131

原创 Android性能优化

一、布局优化:1、优化方式: * 减少不必要嵌套,尽可能使用LinearLayout、ConstraintLayout等控件 * 减少颜色覆盖,子控件背景足够,不要在其父控件加颜色 * 使用include、merge、ViewStub * include:布局复用 * merge:去除多余层级 * ViewStub:按需加载,当调用setVisibility...

2018-07-20 16:00:43 111

原创 适配器、装饰者、代理模式对比

一、适配器的基本概念1、定义: 将一个接口转换为另一个客户期望的接口。2、应用场景: 你想使用一个已经存在的类,而它的接口不符合你的需求。 类似于一个转接口,将电源线的接口转成你电脑可用的接口。3、类图: * Target:期待的目标接口 * Adaptee:原来需要转换的目标 * Adapter:适配器角色。目的是将原来的目标转换成客户期望的目标二、实例一个mp...

2018-07-16 19:24:57 629

原创 装饰模式和Context类结构

一、基本概念:1、定义:动态地给一个对象添加一些额外的职责。装饰模式比子类就增加功能来说更为灵活。2、应用场景: * 需要扩展一个类的功能。 * 动态的为一个对象增加功能,而且还能动态撤销。 3、缺点: 多层装饰者存在的层级复杂的情况4、通用类图: * Component:抽象类或者接口,这是装饰者和被装饰者都需要实现的接口或者继承的基类。 * ConcreteC...

2018-06-21 17:14:58 469

原创 依赖注入和Butter Knife源码分析

一、控制反转和依赖注入: 两图的区别: (1)图一有高度的耦合性,多个对象相互依赖,如果ObjectA想让ObjectB跟随自己转动应该怎么做? 在ObjectA中创建一个ObjectB的对象,然后调用ObjectB的某个方法进行转动。ObjectA主动控制ObjectB的创建和行为。 (2)图二在ABCD中创建了一个第三方容器,第三方容器控制ObjectA、B、C、D的创建和...

2018-06-17 19:59:27 196

原创 Android常用注解和APT的使用

一、编译时注解处理:编译时注解的核心依赖APT(Annotation Processing Tools)实现,原理是添加完注解后,在编译时编译器会检查AbstractProcessor的子类,并且调用该类型的process函数,可以在该方法进行相应的处理。 1、定义自定义注解。新建一个Java library,名为 Annolib,定义一个自定义注解@Retention(Retentio...

2018-06-13 19:38:23 793

原创 注解的基本使用

一、相关概念1、注解是什么? 是以@开头的,给代码添加的一些信息。类、接口、方法、变量、方法中的参数、构造方法等都可以被注解。 注解怎么运行的? 注解可以被编译器、程序运行时或者其他工具使用。可以让编译器检查代码或者生成代码(编译时注解),可以保留到运行时来改变程序的行为(运行时注解)。 二、注解的分类:分为内置注解和元注解。内置注解包括@Override、@Depre...

2018-06-11 17:59:37 136

原创 策略模式

一、基本概念1、定义: 定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变换。 2、类图: * Context对象: 封装可能存在的策略变化,屏蔽其他模块对算法的直接访问 * Stategy抽象策略:定义通用算法规则 * ConcreteStategy具体策略:含有具体的算法 3、应用场景: * 对调用者隐藏算法具体...

2018-06-02 18:52:02 141

原创 观察者模式

一、基本概念1、定义: 定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新。 例如:天气预报服务,一旦你订阅该服务,,每天一旦有天气信息更新,它就会及时向你发送最新的天气信息。 2、结构图 * Subject:抽象被观察者,会将所有观察者对象保存到一个集合中,提供方法来添加和删除观察者。 * ConcreteSubject:具...

2018-05-27 17:10:23 205

原创 建造者模式(Builder)

一、基本定义:1、意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 2、适用场景: * 多个组成部分,都可以装配到同一个对象,但是产生的结果不相同 * 相同的方法,不同的执行顺序,产生不同的事件结果 例:电脑含有很多零配件,可以算是一个复杂对象。其中内存卡,主板、CPU等都是电脑的组成部分,如果构建一台电脑,不需要知道是如何组装的,只需要提供所需要的...

2018-05-13 19:40:41 298

原创 构建多个APK

一、支持的ABIABI 管理 1、ABI管理: 不同 Android 手机使用不同的 CPU,因此支持不同的指令集。 ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互。 ABI 包含以下信息: * 机器代码应使用的 CPU 指令集。 * 运行时内存存储和加载的字节顺序。 * 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。 * 用于解析内容与系统...

2018-05-02 16:49:17 252

原创 模板方法模式

一、基本概念:1、定义: 在父类中定义算法的框架(方法),将部分实现延迟到子类中,让子类可以重新定义算法中的某些步骤。 2、类图: * AbstractClass表示抽象模块,内部方法一般分为基本方法和模板方法两种。基本方法在父类中无具体实现,需要在子类进行相关实现。模块方法是定义在父类中,完成对模板方法的调用。 * 两个子类是具体模板,负责对基本方法的具体实现 3、注意事项: ...

2018-04-29 21:01:57 114

原创 事件分发总结和验证

一、分发机制总结1、传递顺序:Activity->PhoneWindow->DecorView->ViewGroup->View 2、三个方法: * dispatchTouchEvent用来进行事件的分发。如果事件能够传递给当前的View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEve...

2018-04-21 19:03:56 158

原创 View事件分发机制

1、dispatchTouchEvent: public boolean dispatchTouchEvent(MotionEvent event) { ...... boolean result = false; ...... //如果当前View未被其他窗口盖住 if (onFilterTouchEv...

2018-04-21 13:55:46 166

原创 ViewGroup事件分发机制

1、dispatchTouchEvent: @Override public boolean dispatchTouchEvent(MotionEvent ev) { //最终返回值 boolean handled = false; if (onFilterTouchEventForSecurity(ev)) { ...

2018-04-21 11:04:19 168

原创 Activity事件分发机制

一、事件分发的基本概念1、MotionEvent View触摸事件通过MotionEvent来表示,主要分为: * ACTION_DOWN:手指按下 * ACTION_UP:手指抬起 * ACTION_MOVE:手指移动 * ACTION_CANCEL:非正常取消 2、当View的点击事件产生后,首先传递到Activity上,然后一层层传递到ViewGroup中,最终传递到Vie...

2018-04-14 23:49:07 1361

原创 单例模式

一、基本概念定义:确保一个类只有一个实例 优点: * 内存中只有一个实例,可减少内存使用,尤其是需要频繁创建、销毁对象的场景,单例模式比较有优势。 * 避免对资源的多重占用,比如读配置、写文件等操作,只有一个对象去操作资源,避免了多个内存对象对资源的同时操作。 * 单例可设置全局的访问点,共享资源访问。 缺点: * 扩展比较困难,一般单例没有接口 * 对测试不力 * 单例模式...

2018-04-07 19:59:09 113

原创 代理使用

一、一般应用场景提供一个代理来控制对象的访问。一般在无法访问或者不想访问某个对象时,可以通过一个代理对象间接进行访问。二、Retrofit代理模式分析:1、Retrofit使用: 定义接口:public interface MyService { @GET("users/{user}/list") Call<String> getMyList(@P...

2018-02-22 16:40:07 244

原创 代理模式

代理模式一、相关概念:Head First设计模式: 代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问主要作用:控制对象访问 - 扩展目标对象的功能:例如演员(目标对象),有演戏的功能,找一个经纪人(代理),会额外提供收费的功能,实际上是代理的功能,而不是演员的功能。 - 限制目标对象的功能:例如经纪人对收费不满意,只让演员演一场戏,对演员的功能进行了部...

2018-02-16 21:13:49 163

原创 线程池基础

一、线程池好处:(1)重用线程,避免线程创建和消耗带来的性能消耗(2)控制线程池的最大并发数,避免线程之间抢系统资源而导致的阻塞现象。(3)对线程管理,提供定时执行等功能。二、线程池创建:1、Executor接口:public interface Executor { void execute(Runnable command);}将任务提交和执行解耦

2018-02-04 14:48:53 128

原创 线程基础

一、线程:1、线程和进程:进程:是系统进行资源分配的基本单位,例如Window管理器中某个exe程序:qq.exe、studio.exe。在android系统中,一般表示的是一个应用程序,例如邮件、相机等应用。线程:操作系统调度的最小单位,比如多个线程有的请求数据,有的更新ui,有的操作数据库。线程拥有各自的计数器、堆栈、局部变量等。线程的意义:如果所有操作都在一个线程执行

2018-02-04 14:34:19 116

原创 Android动画解析(二)

一、插值器和估值器:Interpolator(插值器)和TypeEvaluator(估值器)是实现非匀速动画的重要手段1、Interpolator: 过渡值变化的规则( 控制动画的进度 ) * AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速 * AccelerateInterpolator

2017-10-15 22:14:56 225

原创 Android动画解析(一)

一、动画分类:1、两种类型:View Animation(视图动画)、Property Animator(属性动画)( 或者分为View动画(Tween Animation)、逐帧动画、属性动画三种)。View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画); Property Animator包括ValueAn

2017-08-05 19:23:31 331

原创 Kotlin使用(一)

官方文档:http://kotlinlang.org/docs/reference/android-overview.html中文文档:https://huanglizhuo.gitbooks.io/kotlin-in-chinese/content/https://www.kotlincn.net/docs/reference/一、Android Studio使用Kotlin

2017-05-21 12:36:40 1912

原创 虚拟机和内存回收

一、Java虚拟机运行的内存示意图:1、程序计数器: 每条线程都有一个独立的程序计数器,一块较小内存区域,指向当前所执行的字节码。如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是Native方法,这个计算器值为空。2、Java虚拟机栈: 虚拟机栈是线程私有的,生命周期与线程相同。虚拟机栈为Java方法执行描述内存模型,每个方法在

2017-05-12 11:01:52 1288

空空如也

空空如也

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

TA关注的人

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