自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【源码记录】Handler机制

Looper1、sThreadLocal //【分析点1】 //为了实现线程隔离而使用ThreadLocal static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();2、Looper //【分析点2】 //构造函数是内部私有的,也就是说外部是不可调用构造函数的 //这就决定了每个Looper只会对应一个MessageQueue p

2021-07-13 20:36:21 146

原创 【自定义View】invalidate、postInvalidate以及requestLayout笔记

1、requestLayout重新绘制视图子View调用requestLayout方法,会标记当前View及父容器,同时逐层向上提交,直到ViewRootImpl处理该事件,ViewRootImpl会调用三大流程,从measure开始,对于每一个含有标记位的view及其子View都会进行测量、布局、绘制。2、invalidate在UI线程中重新绘制视图当子View调用了invalidate方法后,会为该View添加一个标记位,同时不断向父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传

2021-07-12 00:53:26 537

原创 【事件分发机制】关于事件分发机制的一些记录

核心方法是ViewGroup # dispatchTouchEvent @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean handled = false; if (onFilterTouchEventForSecurity(ev)) { final int action = ev.getAction(); final in

2021-07-08 15:21:13 98

原创 【事件分发机制】事件怎么到达Activity

事件如何抵达Activity笔记源码ViewRootImpl1、ViewRootImpl # WindowInputEventReceiver final class WindowInputEventReceiver extends InputEventReceiver { //这个类负责监听来自底层的点击事件 public WindowInputEventReceiver(InputChannel inputChannel, Looper looper) {

2021-07-08 13:39:34 130

原创 【Context】关于Context的理解

Context个人笔记Context是什么?我理解的Context是:Android系统给程序发放的一个权限凭证,有了这个屏障你才能做某些事情,而且这个凭证分多种(Application、Service、Activity),不同类型的凭证做不同的事情在代码里面的Context是一个接口,它定义了android系统服务可以为android程序提供哪些系统服务,它的具体实现类是ContextImpl,但是,Application、Activity、Service持有的Context都不是Contex

2021-07-08 11:04:58 1054

原创 《现代操作系统》读书笔记

《现代操作系统》笔记进程与线程一、进程每一个被启动的进程都有一个启动该进程的用户UID,子进程拥有和父进程一样的UID。用户可以是某个组的成员,每个组也有一个GID在UNIX中的进程将其存储空间划分为三段:正文段(如程序代码)、数据段(如变量)以及堆栈段,数据向上增长而堆栈向下增长UNIX系统,只有一个系统调用可以创建新进程:forkfork产生的子进程,会和父进程拥有相同的内存映像、同样的环境字符串和同样的打开文件。UNIX中,子进程的初始地址空间是父进程的一个副本,但是涉及两个不同的地

2022-04-19 00:15:46 1346

原创 【设计模式】原型模式

一、前言设计模式系列(参考资料:《Android源码设计模式解析与实战》——何红辉、关爱明)单例模式Builder模式二、介绍原型模式属于创建型模式,主要通过从一个现有实例拷贝出另外一个实例,从而实现两个实例互不影响(这是深拷贝,浅拷贝还是会有影响的)三、UML图这里有三个角色是因为面向接口,所以以多态的形式创建具体原型类ConcretePrototype,实际上接口Prototype选择性创建四、使用场景根据原型模式的特点——克隆,可以得出以下使用场景:1、因为clone

2021-08-17 16:39:29 105

原创 【设计模式】Builder模式

一、前言设计模式系列(参考资料:《Android源码设计模式解析与实战》——何红辉、关爱明)单例模式二、介绍我们开发中偶尔会遇到一些需要设置10个或以上大量参数的情况,通常情况有几种处理方式:多构造函数、setter、Builder模式。1、多构造函数:这种方式虽然最方便,但也最繁琐,假设有一个方法需要设置6个int型的参数,但多数情况下,这6个中总有你不想传的参数,这时候就需要约定一个规则:例如传0,但是传0又会有一个问题就是传入顺序问题,传入顺序不同并不会导致程序编译不通过,却会导致程序运

2021-08-12 11:27:39 239

原创 【读书笔记】《Effective Java》第二章 第2条:遇到多个构造器参数时要考虑使用Builder

一、前言《Effective Java》读书笔记系列第二章 第1条:创建和销毁对象二、介绍我们开发中偶尔会遇到一些需要设置10个或以上大量参数的情况,通常情况有几种处理方式:多构造函数、setter、Builder模式。1、多构造函数:这种方式虽然最方便,但也最繁琐,假设有一个方法需要设置6个int型的参数,但多数情况下,这6个中总有你不想传的参数,但这时候就需要约定一个规则:例如传0,但是传0又会有一个问题就是传入顺序问题,传入顺序不同并不会导致程序编译不通过,却会导致程序运行结果不正确。所

2021-08-11 11:28:21 167

原创 【读书笔记】《Effective Java》第二章 第1条:创建和销毁对象

一、前言《Effective Java》读书笔记系列二、介绍通常情况下客户端想要获取一个类A的实例,最传统的方式就是让A提供一个public的构造函数。实际上除此之外还有一种方式,那就是提供一个public的静态工厂方法三、举例以Integer为例子,Integer里面除了提供构造函数外,还提供了对应的静态工厂方法:public final class Integer extends Number implements Comparable<Integer> { //构造函数1

2021-08-09 14:41:43 139

原创 【设计模式】单例模式

2021-08-05 18:26:23 121

原创 【源码】SharedPreference

源码记录主要分两个主要的方法:with和into。前者涉及Glide的生命周期绑定,后者涉及Glide的缓存机制1、withwith public static RequestManager with(@NonNull Context context) { //获取一个RequestManagerRetriever对象 return getRetriever(context).get(context); }RequestManagerRetriever.get

2021-07-24 09:42:42 179

原创 【源码】Service或者Application的Context为什么不能用来启动Dialog

2021-07-19 23:02:08 732 2

原创 【调试】记录调试的工具和方法

1、Log.getStartTraceString这是平常用来看方法调用栈的,例如说我要看onDraw过程中涉及了哪些方法的调用(主要看Framework层的方法),就可以在onDraw里面打个Log,具体可以看Log.getStartTraceString2、Looper.dump这是看Looper源码时候发现的,它可以帮助你打印出当前MessageQueue里面的所有信息 new Handler().sendEmptyMessage(996); new H

2021-07-18 14:25:05 250 1

原创 【源码】AMS的启动流程

AMS启动流程整体流程1、系统启动后Zygote进程通过fork出一个SystemServer进程2、进入SystemServer,通过main —— run —— startBootstrapServices的步骤进行,在此之前还调用了createSystemContext,从而调用ActivityThread的systemMain,进入ActivityThread并调用attach(true,这里代表系统进程调用)初始化了Instrumentation、Context和调用Applicatio

2021-07-16 21:59:55 425

原创 【源码】bindService流程

bindService流程ContextImpl1、bindService @Override public boolean bindService(Intent service, ServiceConnection conn, int flags) { warnIfCallingFromSystemProcess(); return bindServiceCommon(service, conn, flags, null, mMainThread.ge

2021-07-16 18:05:25 237

原创 【随笔】关于如何改进文章质量

前言将文章从我的vscode修完,再搬到csdn已经接近一周,期间经历了不少伤心事(invalidate那篇写到两万多字的时候本来想“饮吓靓靓嘅杯”,就保存草稿后把chrome关了,等到回来打开chrome通过CTRL+SHIFT+T打开旧标签的时候发现内容被回退到半天前,活生生少了一万字…)...

2021-07-15 09:33:36 363

原创 【调试】记录如何debug系统调用栈

使用在要调试的地方调用以下语句,就能看得到系统调用栈 Log.d("fasfafa",Log.getStackTraceString(new Throwable()));举例例如我要debug开启硬件加速和不开启硬件加速调用invalidate有什么区别1、在Manifest对应Activity添加android:hardwareAccelerated="false"2、在onDraw添加Log语句3、结果如下:不开启硬件加速2021-07-11 14:17:29.712 17

2021-07-11 14:22:45 327 1

原创 【源码记录】【Activity】findViewById源码

AppCompatActivity # findViewById public <T extends View> T findViewById(@IdRes int id) { return this.getDelegate().findViewById(id); }AppCompatActivity # getDelegate @NonNull public AppCompatDelegate getDelegate() {

2021-07-11 00:25:54 100

原创 【数据结构】Collections.synchronized线程安全原理

HashMap线程安全方案通常情况下都会通过以下三个方案:HashTableConcurrentHashMapCollections.synchronized系统方法源码 //只需要看它的构造函数就可以了 private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable { private static final long serialVersionUID

2021-07-10 16:05:53 525

原创 【数据结构】ArrayList源码笔记

关键变量private static final int DEFAULT_CAPACITY = 10;默认初始化容量private static final Object[] EMPTY_ELEMENTDATA = {};当指定长度为0时,返回的空数组private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};当调用无参构造方法,返回的是该数组。刚创建一个ArrayList 时,其内数据量为0。它与EMP

2021-07-09 10:33:01 118

原创 【坑】坑记录

1、LayoutInflater加载布局导致宽高失效现象:使用LayoutInflater加载布局时,第二个参数root如果为null,通过再addView添加该布局,会导致布局内部设置的宽高失效;如果root不为空,而且attachToRoot为true,则不会失效原因: if (root != null) { //1、如果root不为null,创建布局参数(因为给addView传的参数都是params) //所以不管attachToR

2021-07-09 10:09:16 275

原创 【学习记录】关于源码不懂的地方

1、ThreadLocal为什么不直接使用WeakHashMapEntry是一个以弱引用为key的K-V结构;ThreadLocal内部持有的数据结构是一个数组;getEntry获取index的方式也是通过位运算代替取余 //1 private Entry[] table; //2 static class Entry extends WeakReference<ThreadLocal<?>> { /** The value

2021-07-09 09:04:17 67

原创 【HashMap】如何定义一个适合当HashMap Key的类

一、根据HashMap源码,我们需要重写:1、hashcode static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }2、equals //putVal方法 if (p.hash == hash &&((k = p.key) == key || (key !=

2021-07-09 08:31:52 285

原创 【自定义View】为什么View.post可以拿得到宽高

view.post public boolean post(Runnable action) { //这个mAttachInfo只有在dispatchAttachedToWindow被赋 //值,所以这里假设还没绘制完成 final AttachInfo attachInfo = mAttachInfo; //这里是已经绘制完成了 if (attachInfo != null) { return

2021-07-09 07:16:33 105

原创 【源码记录】ANR原理

分类InputDispatching Timeout:输入事件(包括按键和触屏事件)在5秒内无响应,就会弹出 ANR 提示框,供用户选择继续等待程序响应或者关闭这个应用程序(也就是杀掉这个应用程序的进程)。输入超时类的 ANR 可以细分为: 处理消息超时、无法获取焦点Broadcast Timeout:BroadcastReceiver在规定时间内(前台广播10秒,后台广播60秒)无法处理完成,就会报广播超时的消息。Service Timeout:Service在规定时间内(前台服务20秒,后台服

2021-07-09 07:16:09 191

原创 【Android视图系统】对Activity、Window、PhoneWindow、Decor以及ViewRootImpl的理解

2021-07-08 16:36:44 290

原创 【源码】startService流程

startService笔记ContextImpl1、startService public ComponentName startService(Intent service) { warnIfCallingFromSystemProcess(); return startServiceCommon(service, false, mUser); }2、startServiceCommonprivate ComponentName startSe

2021-07-08 15:57:09 62

原创 【源码】BroadcastReceiver广播发送流程

广播发送流程笔记ContextImpl //-----------------普通广播---------------------// public void sendBroadcast(Intent intent, String receiverPermission, int appOp) { warnIfCallingFromSystemProcess(); String resolvedType = intent.resolveTypeIfNeeded

2021-07-08 15:51:22 198

原创 【源码】Activity的启动流程

Activity的启动流程注:可以通过Context或者Activity启动,四大组件的启动方法都在Context里面,只是Activity对startActivity进行重写基础概念1、AMS(ActivityManagerService)定义:系统服务,AMS的服务端作用:统一调度所有应用程序的Activity的生命周期启动或杀死应用程序的进程启动并调度Service的生命周期注册BroadcastReceiver,并接收和分发Broadcast启动并发布ContentPr

2021-07-08 15:44:35 352

原创 【源码】BroadcastReceiver动态广播注册

动态广播注册源码笔记ContextImpl1、registerReceiver public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,String broadcastPermission, Handler scheduler, int flags) { return registerReceiverInter

2021-07-08 11:56:45 249 5

原创 【数据结构】HashMap1.8源码

HashMap原理解析关键常量static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;是数组的长度。默认初始化时的容量(16),必须为2的幂次方static final int MAXIMUM_CAPACITY = 1 << 30;最大容量,2^30static final float DEFAULT_LOAD_FACTOR = 0.75f;默认负载因子,代表什么时候会进行扩容操作(当到达链表长度的???待补

2021-07-08 08:28:23 153

原创 技术笔记的开端

平常一直都有在逛技术论坛:CSDN呀、掘金呀、简书呀、StackOverflow呀之类的,但是从来没有发布过文章,也就是一直都是个小看客..今天开始也该回馈一下社区啦,与其称之为技术博客,我更愿意将其称为我的个人学习笔记(因为我一直都有记录在VSCode里面,顺便强烈推荐一波用VSCode写MarkDown,可以继续以程序员的感觉来记录成长)就这样~共勉。...

2021-07-03 17:11:09 68

空空如也

空空如也

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

TA关注的人

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