- 博客(81)
- 资源 (2)
- 收藏
- 关注
原创 深入剖析 Android 开源库 EventBus 的源码详解
在 Android 项目开发的时候,经常会遇到组件与组件之间、组件与后台线程之间的通信, 比如:子线程中进行数据请求,请求数据成功后,通过 Handler、RxJava 等来通知 UI 主线程进行更新操作;两个 Fragment 之间可以通过 Listener 进行通信,简单的通信通过上述的技术手段也是可以满足需求的,但随着项目的不断迭代更新,程序越来越庞大时,就会要写很多的代码,从而导致代码严重的耦合问题。为了优化该问题,EventBus 事件总线应运而生。
2024-07-15 01:43:52
1122
原创 深入剖析 Android 网络开源库 Retrofit 的源码详解
在 Android 开发中,通过网络请求获取服务端数据是一项基本且常见的需求。目前有多种网络请求框架可供选择,其中 Android-Async-Http、Volley、OkHttp 和 Retrofit 是较为流行的、开源的网络请求框架。如何选择它们?孰优孰劣?仁者见仁智者见智,我个人觉得适合的就是最好的,不要盲目跟风去更换掉之前选用的网络请求框架,毕竟老代码那是牵一发而动全身哈!对于新项目来说,选择一个好用的网络请求框架,还是很有必要的,而 Retrofit 作为当下最火的一个网络开源请求库,很值得学习!
2024-06-27 23:57:40
1488
1
原创 路由框架 ARouter 原理及源码解析
在日常开发中,随着项目业务越来越复杂,项目中的代码量也越来越多,如何维护、扩展、解耦等成了一个非常头疼问题。为解决此问题而衍生出的诸如:插件化、组件化、模块化等热门技术。 使用组件化来改造项目时的难点,就是实现各个组件之间的通讯,通常解决方案采用路由中间件,来实现页面之间的跳转关系。本文要解析的 ARouter路由框架就是众多解决方案中比较优秀的一个开源库,并且是国人团队开发的,所以中文文档非常详细,以便使用者快速接入。
2024-06-19 10:35:31
1048
原创 深入Android S (12.0) 探索Framework之输入子系统InputDispatcher的流程
Android的输入子系统InputReader在一次线程循环中,通过getEvent函数尽可能多地读取设备增删与原始输入事件,并将它们封装成RawEvent结构体。然后通过其processEventsLocked函数对获取事件进行分类处理,将原始输入事件进行转译、封装与加工后将结果暂存到mQueuedListener中。最后将所有暂存、已加工过的输入事件交付给 InputDispatcher来进行分发。本篇将深入探索InputDispatcher的工作流程,它是如何来分发这些输入事件的?
2024-06-14 18:52:38
670
原创 Android 常用开源库 MMKV 源码分析与理解
谈到轻量级的数据持久化,在 Android 开发过程中,大家首先想到的应该就是 SharedPreferences(以下简称 SP),其存储数据是以 key-value 键值对的形式保存在 data/data/\/shared_prefs 路径下的 xml 文件中,使用 I/O 流 进行文件的读写。通常用来保存应用中的一些简单的配置信息,如用户名、密码、自定义参数的设置等。
2024-06-05 23:52:04
1286
原创 Linux 内核之 mmap 内存映射触发的缺页异常 Page Fault
上一篇文章解释了什么是mmap内存映射及其在Linux内核中的实现原理,然后深入到源码中一步一步分析mmap在内核中的源码实现。mmap内存映射的核心就是在进程虚拟内存空间中为该次映射分配一段虚拟内存出来,然后将这段虚拟内存与磁盘文件建立映射关系。但此时内核并不会为映射分配物理内存,物理内存的分配工作需要延后到这段虚拟内存被CPU访问的时候,通过缺页中断来进入内核来分配物理内存,并在页表中建立好映射关系。那么,接下来就跟随笔者一步步深入源码,查看内核是如何分配物理内存并建立虚拟内存与物理内存之间映射关系的?
2024-06-03 21:15:05
947
原创 Linux 内核之 mmap 内存映射的原理及源码解析
mmap 的全称是 memory map,中文意思是内存映射或地址映射,是 Linux 操作系统中的一种系统调用,其作用是将一个文件或者其它对象映射到进程的虚拟地址空间,实现磁盘地址和进程虚拟地址空间一段虚拟地址的一一对应关系。通过 mmap 系统调用我们可以让进程之间通过映射到同一个普通文件实现共享内存,普通文件被映射到进程虚拟地址空间当中后,进程可以像访问普通内存一样对文件进行一系列操作,而不需要通过 I/O 系统调用来读取或写入。
2024-05-22 08:00:00
2089
原创 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程
上一篇文章深入探索了 Android Framework 的输入系统 IMS 的构成与启动,对 IMS 的重要成员有了初步的理解,然后通过源码对 IMS 的整个启动流程进行分析,在 IMS 启动并准备就绪后,输入系统就可以从设备节点源源不断的抽取输入事件,并交给事件处理者进行加工处理,即输入子系统 InputReader。本篇将深入探索 InputReader 的工作流程,它是如何从设备节点将输入事件交给 InputDispatcher 的派发的?
2024-01-19 19:30:29
917
原创 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动
Android 输入系统(Input System)的工作原理,包括:输入设备的管理、输入事件的加工方式及派发流程。首先输入设备包括:触摸屏,键盘,鼠标和手柄等,其中触摸屏与键盘是 Android 最普遍也是最标准的输入设备。当用户操作输入设备时,Linux内核接收到相应的硬件中断,然后将中断加工成原始的输入事件数据并写入其对应的设备节点中,在用户空间可以通过输入系统内部的读取函数将原始事件数据读出,并进行一系列翻译加工成Android输入事件,然后在所有的窗口寻找合适的事件接收者,并派发给它来消费该事件
2023-11-28 16:28:28
1387
原创 深入Android S(12.0)探索Framework之SystemServer进程的启动详解
SystemServer 作为 Zygote 进程 fork 出的第一个进程,其进程名为:system_server。其承载着整个 Framework 的核心服务,如创建并启动 ActivityManagerService、PackageManagerService、WindowManagerService、InputManagerService 等 90 多个核心系统服务。接下来一起深入学习一下 SystemServer 进程的创建与启动流程。
2023-11-14 23:27:11
441
原创 Kotlin 开篇之基础语法篇
Kotlin 语言由程序语言开发工具的知名供应商 JetBrains 构思于 2010 年,它是一种针对 Java 平台的新编程语言 (基于 JVM 的语言)。Kotlin 简洁、安全、务实,并且专注于与 Java 代码的互操作性。它几乎可以用在现在 Java 使用的任何地方:服务端开发、Android 应用等等。Kotlin 可以很好地和所有现存的 Java 库和框架一起工作,且性能水平和 Java 旗鼓相当,同时作为一种新语言,它包含了许多新的特性,由此也决定着 Kotlin 的代码风格。.......
2022-08-10 17:04:15
923
1
原创 深度详解 Android R(11.0)Service 启动过程
服务 (Service) 是 Android 系统中 4 大应用程序组件之一,主要用途有:后台运行和跨进程访问。通过启动服务可以在不显示界面的前提下在后台执行那些不需要和用户交互且长期运行的任务,即使程序切换到后台,或者用户打开了另一个应用程序,服务仍然能够保持独立运行。通过 AIDL 服务可以实现不同进程之间的数据通信,后面详细解析。Service 的存在形式:本地服务、远程服务和前台服务。Service 的状态:启动状态和绑定状态,也可以说成是服务的两种启动方式。.........
2022-08-03 00:35:26
2363
1
原创 深度详解 Android 之 Context
在 Android 开发中、亦或是面试中都离不开四大组件的身影,而在创建或启动这些组件时,并不能直接通过 new 关键字后跟类名来创建实例对象,而是需要有它们各自的上下文环境,也就是本篇文章要讨论的 Context。Context 提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被 Android 系统所提供。它允许获取以应用为特征的资源和类型,是一个统领一些资源(应用程序环境变量等)的上下文。............
2022-07-18 22:19:56
7730
原创 深度详解 View.post() 为何能够获取到 View 的宽高值?
在文章中通过分析源码解析了获取不到 View 宽高值的原因,在文章结尾处留了一个问题,是打算后面继续分析解读的,但是却给忘了,欠下的总归是要弥补的,因此这里来补上,本文就来深度详解 View.post() 为何能够获取到 View 的宽高值?...............
2022-07-10 14:53:35
1853
7
原创 深度详解 Android S(12.0)屏幕刷新机制之 Choreographer
Android 的 UI 渲染性能是 Google 工程师们长期以来非常重视的,随着 Android 系统的不断演进和完善,Google 在 2012 年的 I/O 大会上宣布 Project Butter 计划,并在 Android 4.1 中正式开始实施,以优化 UI 渲染流畅性的问题。Project Butter 对 Android Display 系统进行了重构优化,引入了三个核心元素,即 VSYNC、Triple Buffering 和 Choreographer。..............
2022-06-30 23:22:35
4173
1
原创 深度详解 Android R(11.0)Activity 启动过程
文章目录前言一、Launcher进程请求ATMS1. Launcher 桌面的 App 图标入口2. Launcher ## startActivitySafely() 方法二、ATMS发送创建应用进程请求三、Zygote进程接受请求并孵化应用进程四、应用进程启动ActivityThread1.引入库2.读入数据总结前言面试中经常会被问到,让面试者简述一下 Activity 的启动流程,这个问题是考察面试者对源码的理解程度,要征服面试官获得满意的 offer 还是需要一步步深入去探索一下源码,梳理启动
2022-05-22 23:43:32
5203
4
原创 Jetpack Room 使用及原理解析
Room 是 Google 官方推出的数据库 **ORM 框架**。ORM:即 Object Relational Mapping,即对象关系映射,也就是将关系型数据库映射为面向对象的语言。使用 ORM 框架,我们就可以用面向对象的思想操作关系型数据库,不再需要编写 SQL 语句。Room 是在 **SQLite** 的基础上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够更简便的访问数据库。
2022-05-17 21:54:13
2559
原创 分析 ViewModel 在配置改变后是怎么留存数据的
我们知道,页面在旋转屏幕后会导致配置信息的改变,并触发页面的销毁重建,这时存储有 ViewModel 的 ViewModelStore 会保存在 ActivityClientRecord.lastNonConfigurationInstances,在页面重建时 ActivityThread.performLaunchActivity 方法中调用 Activity.attach 方法,再将 NonConfigurationInstances 实例传给重建后的 Activity 的 mLastNonConfig
2022-05-14 17:54:23
512
原创 Jetpack ViewModel 使用及原理解析
ViewModel 是以能感知生命周期的方式存储和管理界面相关数据的组件。感知生命周期是说当 Activity 或 Fragment 创建第一个实例的时候,它开始创建;当 Activity 销毁或者 Fragment 分离的时候,它自动清理。存储和管理界面相关数据即 ViewModel 保存的数据,在页面因配置变更(如横竖屏切换、分辨率调整、权限变更、系统字体样式变更等)导致页面销毁重建之后依然也是存在的。
2022-05-14 16:52:01
965
原创 Jetpack LiveData 使用及原理解析
LiveData 是一种可观察的、粘性的数据存储类。与常规的可观察类不同,LiveData 具有生命周期感知能力,具有生命周期感知的组件,一般指 Activity、Fragment 等,但不局限于此,更泛指实现了 Lifecycle.LifecycleOwner 的组件。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件的观察者。
2022-05-10 20:23:17
860
原创 Jetpack Lifecycle使用及原理解析
Jetpack Components 学习之 Lifecycle,Lifecycle 提供了可用于构建生命周期感知型组件的类和接口,可以感知 Activity、Fragment 的生命周期并根据 Activity、Fragment 的当前生命周期状态在其相应的回调事件中调整其自身的行为,能有效的避免内存泄漏。
2022-05-09 19:01:08
1104
原创 Flutter由其他页面回到当前页面时监听并刷新当前页面的内容
项目中经常遇到这样的场景,比如很多App都有的收藏、点赞列表等,当我们从收藏列表点击一个item项进入到详情页时,用户点击了取消收藏,那么当我们点击返回到收藏列表页时,App需要主动刷新收藏列表的数据。在原生开发时,我们可以在收藏列表页的 onResume( ) 方法中重新请求数据并刷新列表。也可以做事件监听,不过没必要哈,事件监听比较适合那种跨页面的。那么,Flutter 开发中,我们该如何实现该需求呢?答案:Flutter 监听路由返回push( ).then( ):在 then 的函数体内重
2021-03-23 14:45:05
7167
原创 Flutter开发中使用fish_redux怎样在页面中创建TabController呢?
目前 Flutter 开发中,没有像 Android 那么好的生态,开发框架也没有 Android 那样的 mvc、mvp、mvvm 那么成熟,目前 Flutter 开发使用的框架,更多的说的是状态管理。目前 Flutter 成熟的状态管理有如下几种:scope_model (provider) : Google 原生的状态管理,通过封装 InheritedWidget 实现了状态管理,而且一并提现 Google 的设计思想,单一原则,这个 Package 仅仅作为状态管理来用,几乎没有学习成本,如果
2020-11-30 00:17:29
550
原创 Flutter 多版本管理工具
Flutter 作为当下比较热门的跨端开发利器,受到了越来越多的开发者的追捧,笔者也是小粉丝哈,热衷于追求新技术。由于 Flutter 目前还处于高速发展的阶段,开发者提出的 issues 很多( 目前近8k ),所以 Flutter 团队需要不断的更新版本来解决开发者提出的这些问题,这就导致 Flutter 的版本更新比较快。上一个工程还是基于版本 1.19.* 创建的,等到再新建一个工程时,就需要用到版本 1.22.# 啦! 面对这么多的版本
2020-11-23 17:11:51
2850
原创 Flutter中使用ListView时如何更有效的设置Item项间距?
App开发中,列表的使用是比较常见的场景,Android原生开发时,ListView 是最常用的滑动组件,后来 Google 又推出了功能更加强大,使用更加灵活的 RecyclerView。同样,在 Flutter 开发中,系统也提供了 ListView 用于实现列表滑动的滑动组件,它可以沿一个方向线性排布所有子组件,并且支持基于 Sliver 的延迟构建模型。Flutter 中使用 ListView 时,如何更有效的设置 Item 项间距呢?看官方文档,可以找到,我们在构建 ListView 时有四种
2020-09-27 19:56:28
13478
原创 Flutter自定义Widget实现自带删除键的TextField
在项目开发中,我们经常会用到输入框来输入一些信息,Android原生开发时使用的是EditText,在Flutter中则使用的是TextField。使用他们来实现类似选中获取焦点、输入值后显示删除键、清除已输入值等功能,则需要在布局中组合一些别的View(原生)或Widget(Flutter),并在代码中控制相关逻辑。 如果在一个页面中需要用到多个输入框,那么在布局文件以及代码逻辑中都将显得很冗余
2020-08-10 22:42:28
2248
1
原创 深度解析源码 onCreate() 和 onResume() 中获取不到View的宽高值?
首先,提出一个问题,下面三处打印输出的结果是什么呢?带着问题思考一下,然后猜测一下输出结果,之后我们再带着问题去探寻源码;public class MyActivity extends Activity { private static final String TAG = MyActivity.class.getSimpleName(); private Button mButton; @Override public void onCreate(Bundle sa
2020-06-26 21:00:16
1368
1
原创 分析Handler之同步屏障机制与Android的屏幕刷新机制在源码中的应用
说到Handler的消息机制,相信大家谈起这个的时候,多多少少都会有所了解,甚至会说到,还比较熟悉吧!那笔者也自信一把,算是比较熟悉!!!但是笔者在跟踪学习View的invalidate()、requestLayout()方法的源码时,总是会遇到这样一段不甚知晓的代码: @UnsupportedAppUsage void scheduleTraversals() { if (!mTraversalScheduled) { mTraversalSche
2020-06-17 21:19:03
1010
1
原创 View的requestLayout()方法的源码分析
首先来看一下requestLayout()方法是做什么的?View#requestLayout(): /** * Call this when something has changed which has invalidated the * layout of this view. This will schedule a layout pass of the view * tree. This should not be called while the view
2020-06-15 02:29:44
906
原创 View的invalidate()方法的源码分析
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...
2020-06-12 19:29:52
4723
2
原创 统计一个ViewGroup中包含的子View的个数(递归和非递归实现)
编码实现统计一个ViewGroup中锁包含的子View的个数1、首先想到的肯定是递归实现,代码如下: /** * 递归统计一个View的子View数(包含自身) * * @param root * @return */ public int count1(View root) { int viewCount = 0;...
2019-03-20 17:41:46
2532
原创 Android隐藏标题栏ActionBar的几种方式
Android 3.0 系统之后,Google 引入了 ActionBar 要统一安卓应用的导航栏样式。但是由于 ActionBar 难以定制,在很大程度上制约了开发人员开发与设计的弹性。所以,较为常见的实现方式是:使用ViewGroup来封装一个自己的 HeaderBar。 自2014年 Google I/O 大会上 Material Design 横空出世后,市场上的应用又逐步趋向了...
2018-12-28 17:58:58
3008
原创 Android设备支持的CPU架构
1、目前Android支持的CPU架构有以下几种:类型简介armeabi第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢armeabi-v7a第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能(从2010年起)arm64-v8a第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bitx86...
2018-12-12 16:45:23
3453
原创 Mac查看localhost对应的ip地址
很多时候,我们都输入过这样的网址:http://localhost:8080/很熟悉吧!访问Tomcat或者访问Jenkins等Web网页时经常用到,那么我们经常使用的这个localhost是什么?字面意思是:本地主机,其代表的就是这台计算机。如何才能查看localhost对应的ip地址呢?// 查看 localhost 对应的 ip 地址nslookup localhost下图我们...
2018-12-10 18:58:08
18510
1
原创 Android设置TextView中部分字体颜色和点击事件
最近接到一个新需求,在一个TextView中实现部分字体的颜色不同于其它字体,且点击该部分文字时实现跳转的功能。一开始想着用多个TextView连起来实现功能,优化代码时再想想,这也太弱智了点儿吧! 果断Google搜索一下别的Coder是怎么实现的,其实Android在TextView中已经为开发者提供了这样的API:/** * This is the class for text ...
2018-10-24 19:32:44
7413
8
原创 Macbook配置一套自己喜欢的高效的开发环境
俗话说:“工欲善其事必先利其器”,“磨刀不误砍柴工”等等,无不在告诉我们,要做好一件事,准备工作是非常重要的;对我们Coder来说,我们的MacBook Pro或者ThinkPad等等,那就是我们的武器啊!在开发、学习任务前,把我们这件装备配置好就显得尤为重要啦!笔者是Mac,就来配置一下我的武器吧! 1、安装Mac的包管理工具-Homebrew 终端中输入如下命令即可安装(由...
2018-09-12 23:46:21
11134
原创 Android开发屏幕适配方案
由于Android系统的开放性,任何用户、开发者、硬件厂商和运营商都可以对Android系统和硬件进行定制,修改成他们自己所需要的样子。使得随着Android设备的增多,设备碎片化、系统碎片化、屏幕尺寸碎片化和屏幕碎片化的程度也在不断加深;这种碎片化达到什么程度呢? 1、Android系统碎片化:基于Google原生系统,小米定制的MIUI(米粉一个)、华为定制的EMUI和魅族定制...
2018-09-09 16:32:25
3052
原创 FlowLayout流式布局实现搜索历史或热门标签
最近项目中有这么一个需求:实现搜索历史记录的展示,默认只展示最近搜索的10条记录,并且最近搜索的首先展示,其余按搜索时的先后顺序依次展示;笔者想到(FlowLayout+SharedPreferences+List+TextView)来实现; 看一下实现的效果图: 笔者想到用FlowLayout流式布局来展示搜索历史(自己实现或者使用开源库),为了实现最近搜索的最先展示,且不展...
2018-05-29 17:29:49
1333
2
原创 安装配置proxyee-down下载工具不限速下载百度网盘的资源文件
自从国内市场的各大云盘相继关闭服务以来,目前国内基本上只有百度网盘可用了,但是免费用户使用百度网盘下载资源文件时的速度被限制的死死的,除非你开通会员服务,所以导致很多下载工具的应运而生。今天要分享的是一个使用java编写的开源多线程下载工具proxyee-down,虽然稍微有一丢丢地麻烦,但是胜在好用; proxyee-down是一款免费开源的http下载工具,免封号的百度网盘高速下载利...
2018-04-23 01:51:40
7915
原创 MacOS 下载并安装 Eclipse 所遇到的问题
作为Android研发工程师,闲来了解一下Java8的新特性,学习一下Lambda表达式和Stream等,纸上得来终觉浅,还是要亲手实践多练来加深理解,然发现本本上没有安装Eclipse,下面是楼主我踩过的坑哈! 1、安装Eclipse之前,首先确认你的Mac是否已经安装了JDK,打开终端输入:java -version //查看是否安装了JDK及版本 2、查看已安装JDK版本所对...
2018-03-29 17:23:09
3215
Kotlin Android通用框架设计与完整电商APP开发的快速搭建项目服务端说明文档
2018-10-12
GsonFormat.jar 1.5.0
2018-04-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人