
读书笔记
文章平均质量分 85
OneDeveloper
当你无所事事的时候,就得好好想想还缺少什么!!!
展开
-
Kotlin Flow 相关笔记
参考文章:https://developer.android.com/kotlin/flow?hl=zh-cn涉及到的源码版本(不同版本实现可能有出入):flow() 方法以下内容,都是基于 flow() 顶级方法的内部实现是基于 SafeCollector 和 SafeFlow 来说明的。实现原理public fun <T> flow(@BuilderInference block: suspend FlowCollector<T>.() -> Unit): F原创 2022-01-11 00:35:08 · 2213 阅读 · 0 评论 -
ViewModel 在 Activity 中的实现原理
系统源码参考自 Android API 30 Platform,以及 androidx.lifecycle:lifecycle-viewmodel:2.2.0在文章开始之前,有如下几点疑惑,先记录下来:ViewModel#onCleared() 的调用时机 ?ViewModel 与 onSaveInstanceState() 有联系吗?或者有什么区别吗?ViewModel 是否涉及序列化与反序列化?一个 Activity 中是否支持多个 ViewModel ?1. 与 ViewModel原创 2021-03-21 16:39:23 · 2777 阅读 · 1 评论 -
ViewModel 简析
1. 前述ViewModel 的作用是专门存放与界面相关的数据,分担 Activity/Fragment 的逻辑,同时会维护自己独立的生命周期。如当系统配置发生变更(如切换语言等)、横竖屏切换等,可能会导致 Activity 销毁重建,假设要被销毁是 Activity A,需要被重新创建的是 Activity B,虽然他们都属于同一类型,但是是两个不同的实例对象。因此在 Activity 销毁重建的过程中,就涉及 A 在销毁时,其内部维护的数据要过渡到重建的 B 中,这就依赖于 ViewModel。V原创 2021-03-21 15:13:44 · 7913 阅读 · 1 评论 -
关于 Java、Kotlin 范型与协变、逆变学习笔记
学习文章:https://rengwuxian.com/169.html笔记先定义三个类,用于辅助说明,其继承关系如下:class Grandfather {}class Father extends Grandfather {}class Son extends Father {}关于「协变」,即指的是子类的范型类型(比如 Son 是 Father 的子类,拿着子类 Son 去声明范型类型 ArrayList<Son> ),也属于范型类型的子类(即 ArrayList<原创 2021-02-25 22:02:10 · 168 阅读 · 0 评论 -
CI、CD、Pipeline 概念
文章:什么是持续集成(CI)/持续部署(CD)?简要摘抄:对于 “持续” 一词的概念这并不意味着“一直在运行”,而是“随时可运行”。CI 即持续集成持续集成(continuous integration)是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。目标是快速确保开发人员新提交的变更是好的,并且适合在代码库中进一步使用。CD 可分别指代两个概念:...转载 2020-03-22 16:34:34 · 8153 阅读 · 0 评论 -
Android 手机存储相关内容
应用操作的文件存储位置分为三个部分:1、应用内部存储私有文件目录2、应用外部存储私有文件目录3、公有目录Android手机存储分为两个部分:内部存储和外部存储,内部存储一般是手机自带的存储空间,外部存储指外插SD卡提供的存储空间;随着手机发展,这两个存储的定义又有了一些些变化,新的手机不再有外插SD卡的概念,采取了内置闪存(eMMC、UFS等)的方式,所以内部存储和外部存储在新的And...转载 2020-03-07 15:54:38 · 348 阅读 · 0 评论 -
关于代码编写时「抽象」概念的一点点心得
关于抽象,是面向对象的特性,之前实际写代码的时候,可能注意得不是很好,对于这个点的理解也不是很到位。但是因为公司项目涉及到了组件化,不同组件之间的通信其实是依赖抽象接口来规范的,或者说是约束的。而一开始,我在定义抽象接口的时候,就处理得不是很好,偶尔会把具体业务层的实现带到接口定义之中,虽然觉得这样有点不对劲,但是却无法参透。后来,在 code review 的时候,我的导师针对我的问题跟我...原创 2020-03-06 23:18:28 · 543 阅读 · 0 评论 -
Activity、Window、DecorView、ViewRootImpl(ViewRoot)
(1)Activity、Window、DecorViewWindow 是附属在 Activity 中的,其具体的实现是 PhoneWindow,每一个 Activity 都会有一个 Window。而 DecorView 又是附属在 PhoneWindow 中的。Window 用于在 Activity 中控制顶级 View 的外观和行为策略。而 DecorView 是由 Window 的实现...原创 2019-06-03 22:18:00 · 851 阅读 · 0 评论 -
View 工作原理笔记整理
主要摘抄自:《Android 开发艺术探索》参考文章:https://lrh1993.gitbooks.io/android_interview_guide/content/android/basis/custom_view.html1、View 的工作流程View 的工作流程主要指 measure(测量)、layout(布局)、draw(绘制)这三个流程。DecorView 作为顶级 ...原创 2019-09-16 23:45:19 · 312 阅读 · 0 评论 -
Android Context 笔记整理
本文 大部分内容摘抄自:https://lrh1993.gitbooks.io/android_interview_guide/content/android/basis/context.html源码版本为 Android API 251、概述Context 这一名词中文意思为 “上下文,背景”,在 Android 中,其作为一个包含运行时环境信息的上下文接口,它允许访问特定的应用程序的资...原创 2019-06-04 18:49:06 · 328 阅读 · 0 评论 -
关于 <activity> 的 taskAffinity 属性一些情景测试记录
下列场景的测试环境:1、模拟机,Android 版本 8.0.02、开发环境:compileSdkVersion 28targetSdkVersion 281、taskAffinity 用于设置 activity 对于 Task 的亲和力,而 Task 的亲和关系由 Task 中的根 Activity 确定,即根 Activity 的 affinity 决定着 Task 的 affi...原创 2019-06-16 21:19:33 · 395 阅读 · 0 评论 -
Android IPC 之 Messenger 笔记整理
知识前提:Binder 理论部分笔记整理,以及 AIDL 的相关知识。参考文章:《Android 艺术探索》1、概述Android IPC 的途径之一就是使用 Messenger, 它可以在不同进程中传递 Message 对象,在 Message 中放入需要传递的数据,就可以实现在进程间传递。Messenger 底层基于 AIDL 实现,是一个轻量级的 IPC 方案。2、具体实现2....原创 2019-06-11 19:20:45 · 228 阅读 · 0 评论 -
TCP 笔记整理
1. TCP 首部格式1.1 序列号(Sequence Number)字段长 32 位,指发送数据的位置(序号)。每发送一次数据,就累加一次该数据 字节数 的大小。序列号初始值为建立连接时由计算机生成的随机数,通过 SYN 包传给接收端主机。此外,在建立间接时和断开连接时发送的 SYN 包和 FIN 包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。1.2 确认应答号(Ackn...原创 2019-08-07 08:46:10 · 442 阅读 · 0 评论 -
TCP 与 UDP 笔记整理
对于 TCP 或者 UDP,需要跨越不同主机,并将数据传递到不同的进程(即应用程序)。实现主机的跨越是基于 IP,而识别进程是基于端口号。1. 连接性在网络层,无连接服务可能意味着属于同一报文的不同数据报有不同路径。在传输层,我们不关心分组的物理路径(假设两个传输层之间有一条逻辑连接)。传输层的无连接服务意味着分组之间的独立;面向连接服务意味着依赖。在无连接服务中,应用程序需要将报文...原创 2019-08-07 23:14:12 · 240 阅读 · 0 评论 -
HTTPS 笔记整理
主要摘抄自:SSL/TLS 协议运行机制的概述1. 作用不使用 SSL/TLS 的 HTTP 通信,就是不加密的通信。所有信息明文传播,带来了三大风险。(1) 窃听风险(eavesdropping):第三方可以获知通信内容。(2) 篡改风险(tampering):第三方可以修改通信内容。(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。SSL/TLS 协议是为了...原创 2019-08-11 15:07:12 · 297 阅读 · 0 评论 -
简单工厂、工厂方法、抽象工厂、Builder 模式 笔记整理
1、简单工厂模式首先,需要表明的是,简单工厂模式并不是 23 种设计模式之一。它是工厂方法模式的一个弱化版本。且简单工厂模式又称为静态工厂模式。在该模式中,一般不定义工厂抽象类,而是直接将工厂类的工厂方法改为静态方法(因此才有静态工厂你模式的说法)。静态的工厂方法可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。适用场...原创 2019-10-12 00:31:33 · 409 阅读 · 0 评论 -
【笔记整理】Glide 4.9.0 执行流程源码解析
对于源码的分析,是基于 Glide 最简单的使用的流程进行的:Glide.with(MainActivity.this).load("url of image resource").into(view);1. with() 方法with() 方法会传入当前 activity、fragment 等,目的就是为了获取对应的 context,然后根据该 context 来得到 RequestMa...原创 2019-08-27 00:33:35 · 513 阅读 · 0 评论 -
【笔记整理】Glide 4.9.0 的缓存机制
Glide 类中与内存缓存有关的变量Glide#memoryCache,如果用户没有通过 GlideBuilder#setMemoryCache(MemoryCache) 设置,则默认为 LruResourceCache(继承自 LruCache)。1. 从内存缓存读取图片资源在 Engine#load() 方法中,就先根据需要加载的资源的相关参数,来生成唯一的 key 值,而该值与从缓存机...原创 2019-08-27 00:54:06 · 1700 阅读 · 3 评论 -
【笔记整理】Glide 4.9.0 关于监听生命周期
对于 with() 方法传递的参数(包括 Activity、Fragment、View 等),如果对应的 context 为非 Application 类型的,Glide 会为作为参数传递进with() 方法的 Activity 或者 Fragment 添加一个隐藏的且隐藏的(即没有 UI 的) Fragment(SupportRequestManagerFragment 或者 RequestMa...原创 2019-08-27 00:57:17 · 1147 阅读 · 0 评论 -
【笔记整理】Glide 4.9.0 关于数据加载之后的回调过程
当 Glide 从网络加载原始的数据的时候,会来到 HttpUrlFetcher#loadData() 方法,在 占位符 中说过,当加载完成后,会通过 callback.onDataReady() 方法将结果回传,最终会回溯到 DecodeJob#onDataFetcherReady 这个方法中,下面将会回溯的具体流程进行分析。// HttpUrlFetcher.javapublic void...原创 2019-08-27 08:46:29 · 1813 阅读 · 0 评论 -
热修复之类加载方案 笔记整理
热修复分为:代码修复、资源修复、动态链接修复其中,代码修复又分为:类加载方案、底层替换方案、Instant Run 方案。本篇关于代码修复的类加载方案的笔记整理。涉及源码版本为 Android 7.1.1。参考文章:1、Android热更新实现原理浅析2、《Android 进阶解密》1、理论基础类加载方案是基于 Dex 分包方案的。Dex 分包方案主要做的是在打包的时候将应用代...原创 2019-09-07 22:07:00 · 632 阅读 · 0 评论 -
《 Android 开发艺术探索》 View 的位置参数与使用 scrollTo/scrollBy 进行滑动
在《Android开发艺术探索》中有提到过,View 的位置主要由其四个顶点来决定,分别对应 View 的四个属性:top、left、right、bottom,且这四个点是相对于 View 的父容器来说的,是一种相对坐标。另外,在 Android 3.0 以后,View 还增加了几个参数:x、y、translationX、translationY。x、y是 View 左上角相对于父容器的坐标,...原创 2018-09-11 16:34:34 · 326 阅读 · 0 评论 -
Android BroadcastReceiver 相关笔记整理
涉及源码版本为 Android API 25参照文章:1、《Android 开发艺术探索》2、BroadcastReceiver 全方位解析1、广播接收器的注册1.1 静态注册在 AndroidManifest.xml 里通过标签声明:<receiver // 定义系统是否能够实例化这个广播接收器,如果为 false 的话,则系统无法实例化该接收器。 // 此时,就只...原创 2019-06-09 15:46:38 · 671 阅读 · 0 评论 -
Android Crash 笔记整理
内容摘抄自:《Android 开发艺术探索》Crash 即奔溃,一般是由于程序发生了异常,却没有捕获而导致的(即用 try-catch 语句捕获),crash 时,系统会 kill 掉对应的正在运行的程序,导致闪退或者提示用户程序已经停止运行的现象。Android 提供了关于处理该问题的方法,即 Thread.setDefaultUncaughtExceptionHandler()publ...原创 2019-06-02 20:18:40 · 354 阅读 · 0 评论 -
IntentService 笔记整理
主要参考自:《Android 开发艺术探索》IntentService 是一种特殊的Service,它继承了 Service 并且它是一个抽象类,因此必须创建它的子类才能使用 IntentService。其内部维护了一个 Looper 和一个 Handler。private volatile Looper mServiceLooper;private volatile ServiceHan...原创 2019-05-29 20:34:46 · 209 阅读 · 0 评论 -
LeakCanary 源码解析笔记整理(二)
前一篇文章(LeakCanary 源码解析笔记整理(一))整理了有关 LeakCanary 检测 Activity 是否泄漏的相关源码以及原理的笔记。然后这里再继续对该库的前期实现的进行相关的笔记整理。...原创 2019-02-19 20:46:28 · 409 阅读 · 0 评论 -
LeakCanary 源码解析笔记整理(一)
主要参考文章:1、看完这篇 LeakCanary 原理分析,又可以虐面试官了!2、LeakCanary 源码解析3、Android 源码系列之从源码的角度深入理解LeakCanary的内存泄露检测机制(下)(这一篇比较老了)这里的笔记直接切入主题 —— LeakCanary 是怎么实现检测 Activity 的内存泄漏的...原创 2019-02-17 22:51:23 · 1110 阅读 · 0 评论 -
Android 实现序列化的两种方式 笔记整理
笔记内容基于:《Android 开发艺术探索》额外参考博客:https://blog.csdn.net/qq_35246620/article/details/77686098序列化的作用:在网络上传送对象的字节序列;把对象的字节序列永久地保存到本地。静态变量属于类不属于对象,不会参与序列化过程,用 transient 关键字标记的成员变量也不会。1、基于 Java 的 Ser...原创 2018-12-11 22:03:37 · 634 阅读 · 0 评论 -
Binder 理论部分笔记整理
主要参考文章:Android Bander设计与实现 - 设计篇 墙裂推荐!!!https://github.com/GodCoder/Blog.me/issues/13Binder学习指南1. Binder 是什么?Binder 是 Android 系统独有的进程间通信(IPC)方式之一。不同于 Linux 原有的 IPC 实现方式(Pipe、Signal、Socket、Share...原创 2018-11-02 19:32:41 · 503 阅读 · 0 评论 -
Handler 笔记总结
有关 Handler 实现线程切换的原理笔记总结...原创 2018-10-22 17:37:41 · 527 阅读 · 0 评论 -
《 Android 高性能编程》——第 10 章:提高性能的小技巧
1、图像的加载 P336 - 342(1)如果要处理一个非常大图像,可以使用 BitmapRegionDecoder 将图片进行区域解码,得到部分图像。(2)通过设置 BitmapFactory.Options.inJustDecodeBounds 可以只得到图像的分辨率而防止其加载到内存中。(3)BitmapFactory.Options.inSampleSize 与图片的缩小比例有...原创 2018-05-09 17:15:10 · 1059 阅读 · 1 评论 -
《 Android 高性能编程》——第 4 章:内存
1、内存共享 P104 - 105Android 中的每个应用程序都有自己的进程。每个新进程都是由 Zygote 进程派生而来( fork )的,目的是使得应用程序快速启动,因为 Zygote 进程一直存在于内存之中,fork 过来便可直接使用它的一些资源,减少加载时间。而且,并不是所有资源 fork 过来,一些公共的资源是跨进程共享的(利用的是 paging(分页) 与 memory-m...原创 2018-04-24 17:06:44 · 771 阅读 · 0 评论 -
《 Android 高性能编程》——第 5 章:多线程
1、进程 P176 - 177可以为组件指定进程,通过在 manifest 文件中使用特殊的属性:<service android:name=".MyService" android:process=".MyProcess"><service/>只需要指定进程的名字即可。如果进程的名字以冒号: 开头,那么该进程是应用程序的私有进程(即实际的...原创 2018-05-01 22:36:43 · 339 阅读 · 0 评论 -
《Android 高性能编程》—— @IntDef 注解,减缓枚举的使用
在书中的 P120 - 123,有介绍枚举,因为枚举对开发者友好,数量有限的元素、描述性的文字,可以增强代码的可读性,并且还支持多态。但是在性能上说,使用枚举却不一定是最佳的选择,因为枚举在经过编译器之后,变成了一个抽象类,它继承了 java.lang.Enum,为其定义的枚举常量则会变成相应的内部类,等。(具体见:java枚举类型的实现原理)所以文中有提替代枚举的主要方式就是利用类的 p...原创 2018-04-17 14:18:26 · 8014 阅读 · 4 评论 -
HTTP 笔记整理
1. 请求方法补充:(1)HTTP协议中PUT和POST使用区别(2)Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N &gt; 0 identical requests is the same ...原创 2019-03-10 09:47:45 · 195 阅读 · 0 评论 -
okhttp3 源码解析笔记整理——同步、异步请求
1、同步请求okhttp 可以使用 RealCall # execute() 方法来进行一个同步的请求。try { Response response = mOkHttpClient.newCall(request).execute();} catch (IOException e) { e.printStackTrace();}RealCall # execute()...原创 2019-03-10 11:49:23 · 463 阅读 · 0 评论 -
实际验证 Android Binder 本身支持传输 Serializable 类型的数据传输
参考文章: 《Android 艺术探索》注意这里说的是 Binder 本身,即手动实现 Binder,而不是基于 AIDL(Android 接口定义语言)。在 AIDL 文件中,只支持以下几种类型:1、基本数据类型2、 String 和 CharSequence3、只支持 ArrayList,且里面的元素也要被 AIDL 支持4、只支持 HashMap,且里面的元素也要被 AIDL 支...原创 2019-06-12 19:27:22 · 1302 阅读 · 0 评论 -
Android ANR 笔记整理
主要参考文章:看完这篇 Android ANR 分析,就可以和面试官装逼了!文中涉及到的源码基于 Android API 251、概述ANR(Application Not Responding),指应用程序无响应。当某些情况下,应用主线程超过预定时间能未能得到有效响应或者响应时间过长,都会造成 ANR。ANR 机制主体实现在系统层。所有与ANR相关的消息,都会经过系统进程 (syste...原创 2019-05-29 00:00:49 · 657 阅读 · 0 评论 -
Android 滑动冲突处理笔记
整理自:《Android 艺术探索》1、几种场景外部滑动与内部滑动方向不一致外部滑动与内部滑动方向一致上述两种情况的嵌套2、解决冲突的前提制定好规则,即什么情况由外部的父容器拦截处理,什么时候分发给内部的子控件处理。3、解决方法(1)外部拦截法即事件先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就分发给子控件。该方法的实现需要重写父容器的 onInterceptT...原创 2019-06-05 13:06:29 · 525 阅读 · 0 评论 -
Android 中的 ClassLoader 摘抄笔记
摘抄自:《Android 进阶解密》Java 中类加载器加载的是 jar 文件和 Class 文件(本质都是加载 Class 文件),但在 Android 中不适用,因为无论是 DVM 还是 ART,它们加载的都是 dex 文件。Android 中的 ClassLoader 分为两种类型,分别是系统类加载器和自定义加载器。系统类加载器1、BootClassLoaderAndroid 系统...转载 2019-05-16 18:39:04 · 260 阅读 · 0 评论