Android开发笔记
文章平均质量分 92
Tai_Monster
蟹bro From 3G . XUPT 通工21级 擅长手机贴膜。是邮电只狼desu
展开
-
Android:弹出对话框方式梳理一览(一)
到之前为止其实都是Dialog的很基础的应用,实际上在使用过程中我们可能需要弹出一个Dialog来展示我们自己的定制化的内容,比如说一个登录页面,这个时候我们就不能用之前的简单的方法了,取而代之,我们可以调用setView方法来为我们的Dialog填充自定义的内容,这个过程实际上类似于动态添加View的过程。原创 2024-05-06 20:28:37 · 1139 阅读 · 0 评论 -
[Android View] 可绘制形状 (Shape Xml)
形状可绘制对象是一种在 XML 文件中定义的通用形状。我们通过xml来描述图形,可以减少图片资源的引入,达到减小包体积的目的。原创 2024-02-29 15:14:09 · 1395 阅读 · 0 评论 -
[Android]实现一个权限申请类
在引入了动态权限申请之后,Android的权限申请就变得尤为繁琐,若是按照原有的方法一板一眼地进行申请,样板代码未免太多。因此本篇文章就使用ActivityResult API,来实现一个简单的权限申请类来帮助我们简化权限申请的过程。。原创 2024-01-16 17:05:20 · 1217 阅读 · 0 评论 -
[Android自定义View]实现一个环形进度条控件
之前的文章里我们已经介绍了自定义View相关的知识了,本篇文章我们就来实战一下,从零到一,实现一个环形进度条的控件。原创 2024-01-11 18:16:31 · 1053 阅读 · 0 评论 -
设计模式大赏(一):桥接模式,组合模式
本篇文章是设计模式大赏中的第一篇文章,这个系列的文章中我们主要将介绍一些常见的设计模式,主要是我在看Android源码中发现用到的一些设计模式。本篇文章将主要介绍和这两种设计模式。本篇文章主要参考:《大话设计模式》原创 2023-10-29 17:46:49 · 413 阅读 · 0 评论 -
Android:窗口管理器WindowManager
实际上Android上的窗口指的并不是具体的手机窗口而是一个抽象的概念,它本质上也是一个View,我会把窗口理解成一组有关联的View。与与的关系类似,中方法的实现也是通过远程调用。原创 2023-10-28 19:26:03 · 1215 阅读 · 0 评论 -
Android 源码解析: SharedPreferences的解析
SharedPreferences是Android中的一种轻量的数据持久化手段,可能也是我们在学习Android时接触到的第一种特殊的本地数据持久化手段,本篇文章就将从源码角度分析SharedPreferences的原理。原创 2023-10-09 18:55:20 · 310 阅读 · 0 评论 -
Android Jetpack组件架构:ViewModel的原理
本篇文章是关于介绍ViewModel的,由于ViewModel的使用还是挺简单的,这里就不再介绍其的基本应用,我们主要来分析ViewModel的原理。原创 2023-09-26 17:51:48 · 925 阅读 · 0 评论 -
Android Jetpack组件架构 :LiveData的使用和原理
继Lifecycle组件之后我们接下来要介绍的就是LiveDate组件,所谓LiveDate字面意思上就是有声明的数据,当数据有改动时该组件可以感知到这个操作并将该事件通知到其观察者,这样我们就可以在观察者中做出一些处理,一般都是用来更新UI的操作。这样就实现了当数据改变时U界面自动更新的效果。原创 2023-09-25 23:02:49 · 913 阅读 · 0 评论 -
Android Jetpack组件架构:Lifecycle的使用 和 原理
作为Jetpack中关于生命周期管理的核心组件,Lifecycle组件是其他比如LiveDate和ViewModel等组件的基础,本篇文章主要就将介绍关于Lifecycle的使用和它的运作原理。原创 2023-09-23 22:35:36 · 377 阅读 · 0 评论 -
Android开发笔记 :理解Fragment
本篇文章产生的原因很简单,就是我在了解Android Jetpack中的Lifecycle框架时发现Lifecycle具体时间和状态的更新都是由一个名为的Fragment来跟踪的,为了更好的了解Fragment是如何追踪Activity生命周期状态的变化我们有必要对Fragment组件进行更深入的探讨。原创 2023-09-23 20:24:13 · 320 阅读 · 0 评论 -
Android中的缓存策略:LruCache和DiskLruCache
本篇文章主要是介绍Android中内置的两个缓存类的原理。所谓缓存,就是将获取的数据保存下来以便下次继续使用,这种技术尤其在网络请求和图片加载中有用,可以显著地提升App的性能表现。Android中也内置了两个缓存类,分别是和。原创 2023-09-22 21:12:15 · 695 阅读 · 0 评论 -
RecyclerView源码解析(四):RecyclerView对ViewHolder的回收
我们最后来总结一下RecyclerView回收ViewHolder的逻辑,首先RecyclerView尝试填充内容时会先尝试从这四级缓存中获取可用的ViewHolder,首先就是从第一级缓存中查找,如果找到了就直接返回;如果第一级缓存中没有可用的Holder,那么接下来RecyclerView还会额外查看是否有不可见但是仍然附加在RecyclerView的View,如果有的话就将其包装成Holder添加进入第一级缓存中,并将其从之前的父RecyclerView中分离,这就是第一级缓存的来源。原创 2023-09-17 19:04:59 · 774 阅读 · 0 评论 -
开源库源码分析:OkHttp源码分析(二)
上一篇文章中我们已经分析到了OkHttp对于网络请求采取了,所谓责任链模式就是有多个对象都有机会处理请求,从而避免请求发送者和接收者之间的紧密耦合关系。这篇文章我们将着重分析OkHttp中这个责任链的行为逻辑。原创 2023-09-16 17:33:43 · 901 阅读 · 0 评论 -
开源库源码分析:Okhttp源码分析(一)
接下来就要开始分析一些常用开源库的源码了,作为最常用的网络请求库,OkHttp以其强大的功能深受Android开发者的喜爱(比如说我),还有对该库进行二次封装而成的热门库,比如说Retrofit。本文我们将从源码入手看看OkHttp是如何运作的。注意本文解析的是OkHttp3库,该库是用Kotlin写的,需要大家有一些Kotlin基础。原创 2023-09-15 18:47:20 · 4200 阅读 · 0 评论 -
Android源码解析:Handler机制
关于如何在Android中进行多线程通信,使用Handler机制是一个好方法。Android提供的Handler机制为我们提供了方便的方法进行线程间通信,具体来说,Handler将会绑定一个线程和Looper,Looper将MessageQueue中的Message取出给Handler进行处理。我们可以看一下这幅图先来有一个大概的印象:本篇文章将从源码的角度对Handler机制进行进一步分析。首先我们需要明确一点,那就是Handler机制的设计是基于生产者-消费者模式的。这和Android UI是单线程的也原创 2023-09-13 14:54:22 · 161 阅读 · 0 评论 -
RecyclerView源码解析(三):RecyclerView的缓存机制
终于分析完了这个巨长无比的方法了,现在估计还是很疑惑,现在让我们对上面这个过程进行一下总结。最后我光看到了将viewHolder添加进入RecyclerPool而没有看到清除,所以对其源码进行了查看,发现mRecyclerPool是通过ArrayList存储viewHolder,用SparseArray存储与之相关的一些信息,通过这两个容器检查了回收池中指定类型的视图是否已满。如果池已满,就直接返回,不会将视图添加到回收池中。这是为了限制池中视图的数量,以防止占用过多内存。原创 2023-09-05 21:24:52 · 561 阅读 · 0 评论 -
RecyclerView源码解析(二):结合LinearLayout分析绘制流程
上篇文章中主要已经介绍了RecyclerView的View的三大工作流程(onMeasure,onLayout,onDraw),实际上看了上篇文章还是很迷糊,因为RecylerView由于实现了高度的解耦,所以阅读整个RecyclerView的源码和理解整个RecyclerView需要结合多个相关的类别。根据这段描述,我们也可以了解到上篇文章提到的预布局和实际布局这两个布局过程的作用,预布局将会实现更好的动画效果,因为它记录了新动画开始之前的旧状态,这可以为更合理的动画迭代效果提供更多的信息。原创 2023-09-04 20:00:45 · 224 阅读 · 0 评论 -
RecyclerView源码解析 (一):RecyclerView之View的工作流程
在Android中如果想要实现一个可滑动的列表,你会怎么做呢?对于我来说,我接触到的第一个列表类的控件就是ListView,其次就是RecylerView。目前来说,ListView已经很少用了,作为JetPack库中一部分,RecylerView显然是主流。可是对于我来说,我只知道实现RecyclerView的最简单的使用,而不了解其原理,在想要实现一些进阶效果时就有心而无力。原创 2023-09-04 15:14:49 · 335 阅读 · 0 评论 -
Android进阶 四大组件的工作过程(四):ContentProvider的工作过程
本篇是介绍四大组件的最后一篇文章,前三篇文章里我们已经介绍了Activity,Service以及Broadcast的工作流程,那么这篇文章我们就来介绍内容提供器ContentProvider的工作流程。前几篇文章:1. [Android进阶 四大组件的工作过程(一):Activity的工作过程](https://blog.csdn.net/Tai_Monster/article/details/131146284?spm=1001.2014.3001.5502)2. [Android进阶 四大组件的原创 2023-06-15 22:17:07 · 830 阅读 · 3 评论 -
Android进阶 四大组件的工作过程(三):广播的注册,发送和接收过程
相比Activity和Service的工作过程,Broadcast的工作过程还是比较好懂的,主要就是以AMS为媒介,注册时将接收器注册进AMS中存储接收器的列表中;然后发送过程中也通过AMS来实现发送,调用其存储的接收器的onReceive方法,这样就实现了Broadcast的注册,发送和接收。原创 2023-06-14 21:25:09 · 1233 阅读 · 0 评论 -
Android进阶 四大组件的工作过程(二):Service的工作过程
下面是我总结的一张关于Service工作过程的总结,其中省略了一些细节,主要是帮助理解大致的过程。相信大家也可以发现无论是绑定还是启动,其中都有很多的重合处,无非就是从AMS到ActiviyThread,并且都是通过远程调用的方式。如果要抠细节的话可以看一下AppBindRecord和其他辅助类的关系,这样可以帮助我们更好地理解这整个设计。原创 2023-06-12 20:19:19 · 799 阅读 · 1 评论 -
Android进阶 四大组件的工作过程(一):Activity的工作过程
本系列文章主要是来介绍Android中四大组件的工作过程的,参照书籍为Android进阶解密,主要还是会涉及到源码的阅读。。本篇文章,主要就是来介绍Activity的工作工程的,这里以启动根Activity为例,查看Activity是如何通过系统启动的。这里我们将其分为三个部分来分析,在这之前还是需要介绍一些基础的知识。原创 2023-06-11 22:02:47 · 927 阅读 · 0 评论 -
Android应用程序进程的启动过程
其实在之前Zygote服务启动的过程中,我们已经提到了这个Zygote服务将会创建出一个Socket来用于给ActivityManagerService使用,应用程序进程的启动就需要ActivityManagerService来给Zygote的服务端发送请求。首先我们介绍ProcessRecord类,这个类是Android系统中用于表示应用程序进程的数据结构。每当应用程序启动时,系统都会为其创建一个ProcessRecord对象来跟踪该进程的状态和信息。具体来说,在ActivityMangerSer原创 2023-06-10 19:13:46 · 1058 阅读 · 5 评论 -
Android系统的启动过程(三):Launcher启动过程
前两篇文章中我们已经将系统启动的过程推进到了系统服务启动完毕之后,本篇文章就来介绍Android系统启动的最后一步:启动Launcher。这个Launcher我们可以通俗地理解为桌面,系统启动的最后一步就是启动一个应用程序来显示系统中已经安装完成的应用程序,这个应用程序就叫做Launcher。在 Android 系统启动的最后一步,是启动系统的默认桌面(Launcher)。桌面是用户与 Android 设备交互的主要界面,它提供了应用程序图标、小部件、壁纸等元素,使用户可以访问和启动应用程序。Launche原创 2023-06-10 15:34:44 · 4287 阅读 · 0 评论 -
Android系统的启动流程(二):SystemServer处理过程
总的来说,这个启动系统服务的过程还是在ZygoteInit类的main方法中调用的,具体是调用了forkSystemServer方法。启动Binder线程池,这样就可以与其他进程进行通信创建SystemServiceManager,其用于对系统的服务进行创建,启动和生命周期的管理启动各种系统服务。原创 2023-06-08 19:29:57 · 866 阅读 · 0 评论 -
Android系统的启动流程(一):进入Zygote进程的初始化
init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动流程中一个关键的步骤,作为第一个进程,他被赋予了许多重要的工作流程。init进程是由多个源文件共同组成的。首先创建和挂载启动所需的文件目录接着初始化和启动属性服务,设置信号处理函数最后解析init.rc文件,这个过程中将会启动Zygote进程。原创 2023-06-07 20:40:04 · 1925 阅读 · 1 评论 -
Android进阶 :实现自定义View
有时候我们会想要实现一些复杂或者是独特的组件效果,这时候系统提供的组件可能不能满足我们的需求,这个时候我们一般就会有两个解决办法,**一是上网查找开源的控件库**,一些流行的开源库可以满足我们的绝大部分需求。不过这些开源库也具有时效性,因为它们的更新得不到保证。二就是我们自己实现我们需要的控件,开源库本质也是自定义View。不过实现自定义View需要我们对View的事件分发以及View的工作流程有一定了解,可以查看之前的博客:1. [Android进阶 View事件体系(一):概要介绍和实现View的原创 2023-06-01 20:14:35 · 1263 阅读 · 1 评论 -
Android进阶 View的工作原理:源码分析View的三大工作流程
想象一下,如果我们要画画,把画画的流程拆分的话,那么应该分几个部分呢?一般来说,专业的画师会进行提前构图,然后再进行绘画最后上色。实际上Android系统把各种控件显示到屏幕也相当于是系统在进行绘画,也需要把绘画的过程分为几个大的步骤,这就是View的工作流程。View的工作流程可以分为三个步骤:1. 测量(确定各个控件的大小尺寸和位置)2. 放置(将控件放置到指定位置和大小)3. 绘制(将控件渲染显示出来,这之后我们才能看到)本篇文章就是主要介绍**系统如何绘制各种各样的View控件**的三原创 2023-05-29 22:21:02 · 855 阅读 · 0 评论 -
Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略
本篇文章为总结View事件体系的第三篇文章,前两篇文章的在这里:* [Android进阶 View事件体系(一):概要介绍和实现View的滑动](https://blog.csdn.net/Tai_Monster/article/details/130830213?spm=1001.2014.3001.5501)* [Android进阶 View事件体系(二):从源码解析View的事件分发](https://blog.csdn.net/Tai_Monster/article/details/130871原创 2023-05-28 17:20:02 · 3200 阅读 · 0 评论 -
Android进阶 View事件体系(二):从源码解析View的事件分发
本篇文章为总结View事件体系的第二篇文章,前一篇文章的在这里:[Android进阶 View事件体系(一):概要介绍和实现View的滑动](https://blog.csdn.net/Tai_Monster/article/details/130830213?spm=1001.2014.3001.5501)本篇文章将专注于介绍View的点击事件的分发,介绍的内容主要有:1. 点击事件的传递原则2. 解析Activity的构成3. 源码解析View的事件分发4. 源码解析View对点击事件的处理原创 2023-05-26 00:22:24 · 679 阅读 · 0 评论 -
Android进阶 View事件体系(一):概要介绍和实现View的滑动
本篇文章为总结View事件体系的第一篇文章,将介绍的内容主要有:1. 什么是View和ViewGroup2. Android中View的坐标轴3. 手势检测和速度检测4. 如何实现View的滑动## Android中的View与ViewGroup在更加深入地了解Android中View的事件体系之前,我们需要了解究竟什么是Android中的View。在Android系统中,View类是继承于Object,用于构建用户界面的基本块之一。从官网来说:>This class represents原创 2023-05-24 22:19:57 · 1131 阅读 · 0 评论 -
Android:IPC(进程间通信)机制
本篇文章里我们介绍了如何实现IPC,主要有使用AIDL,Bundle传输,使用文件共享和使用ContentProvider四种方法。名称优点缺点适用场景Bundle简单易用只能传输Bundle支持的数据类型四大组件间的进程间通信文件共享简单易用不适合高并发场景,并且无法做到进程间的即时通信无并发访问情形,交换简单的数据实时性不高的场景Messenger功能一般,支持一对多串行通信,支持实时通信。原创 2023-05-22 22:15:26 · 1194 阅读 · 0 评论 -
Android基础复习:Service组件详解
Service组件是一种的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。原创 2023-05-14 00:30:53 · 901 阅读 · 0 评论 -
Android进阶:Activity的生命周期和启动模式
作为Android四大组件之中存在感最强的组件,Activity应该是我们在学习Android中第一个碰到的新概念。在日常开发过程中我们肯定会用到Activity,今天我们就来详细说明Activity的生命周期和启动模式。在本篇文章中,将会介绍以下比较具体的内容:1. context对象是什么2. 什么是失去焦点和不可见3. Activity的生命周期4. 异常状态下该如何处理Activity的重新创建5. 什么是任务和任务栈6. 五种启动模式和任务亲和性7. 清除返回堆栈原创 2023-05-08 19:25:16 · 888 阅读 · 0 评论 -
Android进阶之光:Dagger2原理简要分析
正是我们自己写的实例提供者。我们先来看前面有关Builder的方法,由于我们在Activity的Component注解中添加了modules和dependencies的值,所以在builder中就会生成响应的gsonModule(GsonModule gsonModule)和swordmanComponent(SwordmanComponent swordmanComponent)方法,这两个方法分别是用来设置生成的注入器中的gsonModule和swordmanComponent对象的。原创 2023-05-02 18:07:34 · 1705 阅读 · 3 评论 -
EventBus(事件总线)的使用和源码的简单解析
事件总线(EventBus)是一种广泛用于软件架构中的设计模式,用于实现解耦和松散耦合的通信机制。它可以帮助组织和管理应用程序中不同组件之间的通信,以提高应用程序的可维护性、可扩展性和灵活性。在事件总线模式中,不同的组件通过订阅和发布事件来进行通信。发布者发布一个事件,订阅者可以订阅该事件并在事件发生时执行相关的操作。事件总线充当了中介者的角色,它负责管理所有的事件和订阅者,并确保事件正确地传递到所有订阅者。事件总线模式可以在很多场景中使用,例如 Android 应用程序中的通信、分布式系统中的消息原创 2023-04-29 20:08:53 · 6026 阅读 · 2 评论 -
Retrofit入门使用
*这里我们可能会有疑惑,Retrofit的回调方法中可以使用Toast吗,实际上是可以的,虽然Retrofit是基于Okhttp的,但是它与Okhttp不同,它的回调方法中是可以直接刷新UI的,因为其是通过Handler与主线程绑定的,所以会在主线程里执行。在Retrofit中,@Query注解是用来标记一个请求参数的,它可以添加到一个方法的参数中,指定这个参数是用来作为请求URL的查询参数的。,即Call的泛型,我这里传入的ReModel类是一个GSON的数据类,就是用JSON解析时需要传入的模板类。原创 2023-04-21 19:30:58 · 294 阅读 · 3 评论 -
Android开发笔记:Volley完整源码解析
Volley 是一个可让 Android 应用更轻松、(最重要的是)更快捷地联网的 HTTP 库。您可以在 GitHub 上获取 Volley。Volley 具有以下优势:自动网络请求调度。多个并发网络连接。透明磁盘和具有标准 HTTP 缓存一致性的内存响应缓存。支持请求优先级。取消请求 API。您可以取消单个请求,也可以设置要取消的请求的时间段或范围。可轻松自定义,例如自定义重试和退避时间。强大的排序功能,让您可以轻松使用从网络异步提取的数据正确填充界面。调试和跟踪工具。原创 2023-04-17 20:26:16 · 596 阅读 · 1 评论 -
Volley源码解析:ByteArrayPool(缓冲区池)
ByteArrayPool 是 Volley 库中的一个类,用于管理字节数组的回收和重用。在网络请求过程中,Volley 库通常需要读取和写入字节数组。为了避免频繁地创建和销毁字节数组,Volley 使用 ByteArrayPool 来管理字节数组的分配和回收,从而提高性能并减少内存占用。ByteArrayPool 维护了一组不同大小的字节数组池。当需要一个字节数组时,它会从对应大小的池中获取一个可用的数组,如果没有可用的数组,则会创建一个新的数组。原创 2023-04-14 21:03:34 · 225 阅读 · 0 评论