OOFTF Blog

「美好的事情即将发生」

SparseArray

源码分析 构造方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public SparseArray() { // 默认容量为 initialCapacity this(10); } public SparseArray(int initialCapacity) { if (initialCapacity == 0) { ...

ReentrantLock

自定义 Lock 的思路 定义一个 int 变量 state ,0: 表示锁没有被占用 ,大于0:表示锁已经被占用 定义一个队列 用于储存等待中的线程 当 Lock 调用 Lock() 申请锁的时候,先判断当前 state 是否被占用(值为 0 ),如果已经被占用,加入到阻塞队列头节点,调用 LockSupport.park 阻塞当前线程;如果没有被占用,尝试使用 cas 将 state...

Retrofit

源码分析 解析注解的部分先不做具体分析,解析注解部分是学习使用 Okhttp 的绝佳案例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public <T> T create(final Class<T> service) { // 检查传入的 se...

Choreographer

作用: CALLBACK_INPUT CALLBACK_ANIMATION CALLBACK_INSETS_ANIMATION CALLBACK_TRAVERSAL CALLBACK_COMMIT 根据是否使用垂直同步,分两种方式统一控制上面五种回调的执行时机 根据垂直同步信号 使用间隔固定时长? 使用 1 2 3 4 5 6 7 Choreog...

App 启动流程

App 启动流程 Activity 启动流程 前面流程和 启动 Activity 相同直到方法 ActivityStackSupervisor.startSpecificActivity() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 void startSpecificActivity(ActivityRecor...

ContentProvider

ContentProvider是Android中提供的专门用于不同应用间进行数据共享的方式 ContentProvider的底层实现同样也是Binder 六个需要重写的方法 : onCreate、query、update、insert、delete和getType 除了onCreate由系统回调并运行在主线程里,其他五个方法均由外界回调并运行在Binder线程池中 ge...

SharedPreferences

SharedPreferences 代码分析 ContextImpl.getSharedPreferences ContextImpl.getSharedPreferences(String name, int mode) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Override public Conte...

横竖屏切换

结论 默认情况下横竖屏切换时,Activity 会销毁并重新创建 如果想保留某个对象,可以重写onRetainCustomNonConfigurationInstance返回要保存的对象,然后再新的Activity中通过getLastNonConfigurationInstance方法获取到这个对象, 也可以通过 ViewModel 来保存要保留的对...

MavenCentral 配置

发布 snapshot 版本配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 apply plugin: 'maven-publish' afterEvaluate { publishing { publications { re...

Hashcode Equals 内存地址

在 Object 类中,不考虑重写的情况 内存地址 对象在内存中的位置,每个对象都是不同的 在java中内存中的对象地址是可变的(例如在内存回收的过程中内存地址就有可能发生变化) hashcode 内存地址通过哈希计算得出的一个数值,不同对象有可能相同 equals Object 内部是通过 == 实现,也就是说比较的是内存地址 如何获取到...

Lifecycle

配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 dependencies { def lifecycle_version = "2.4.0-beta01" def arch_version = "2.1.0" ...

编程语言分类

静态类型语言和动态类型语言 静态类型语言 静态类型语言的数据类型是在编译其间确定的或者说运行之前确定的,编写代码的时候要明确确定变量的数据类型。 动态类型语言 动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段 静态类型语言和动态类型语言优劣势分析 静态类型语言的优势 动态类型语言的优势 静态类型语言和动态类型语言有哪些 静态类型语言 C ...

Android 10文件适配

Android10 (API 29) 文件储存适配 当 targetSdkVersion>=29 的时候需要适配 Android10 的文件沙盒机制 Environment下的文件不再具有读写权限,Context.getXXXDir()可以正常使用 targetSdkVersion < 29,不受影响 targetSdkVersion >= 29 受影响 ...

断点续传

断点续传 理论基础 http协议从1.1开始支持获取文件的部分内容,这为并行下载以及断点续传提供了技术支持。它通过在Header里两个参数实现的,客户端发请求时对应的是Range,服务器端响应时对应的是Content-Range; RandomAccessFile.seek() 可以设置文件指针偏移量 OkHttp 断点续传实现 1 2 3 4 5 6 7 8 9 10 11...

Apk 签名方案

APK签名 Android 支持以下三种应用签名方案: v1 方案:基于 JAR 签名。 v2 方案:APK 签名方案 v2(在 Android 7.0 中引入)。 v3 方案:APK 签名方案 v3(在 Android 9 中引入)。 JAR 签名(v1 方案) 从一开始,APK 签名就是 Android 的一个有机部分。该方案基于签名的 JAR。 v1 签名不保护 ...

Maven

maven Gradle 官方文档 可点击的 MavenCentral 徽章 Maven 搜索网站 MavenCentral 综合性搜索 transitive = true 是否传递本身的依赖给宿主程序(使用传递依赖时,Gradle 会将传递依赖一起下载下来。compile 默认是开启传递依赖 1 2 3 compile('com.h6ah4i.android.widget....

硬件加速

硬件加速 从 Android 3.0(API 级别 11)开始,Android 2D 渲染管道支持硬件加速,也就是说,在 View 的画布上执行的所有绘制操作都会使用 GPU。启用硬件加速需要更多资源,因此应用会占用更多内存。 如果您的目标 API 级别为 14 及更高级别,则硬件加速默认处于启用状态,但也可以明确启用该功能。 如果您的应用仅使用标准视图和 Drawable,则全局启...