
Android 进阶
文章平均质量分 95
步步为营,攻城拔寨
小鱼人爱编程
源码面前无秘密,全栈[后端(Java、Node.js、Go)、前端(Vue、React)、移动端(Android(Kotlin、Java)、iOS(Swift)、跨端(RN、Flutter、KMP)、HarmonyOS(ArkTS)]知识持续输出中...
github:https://github.com/fishforest
展开
-
Android Studio Gradle Windows下隐藏的编译的坑
最近重拾了一个之前的Android项目,发现Gradle死活都无法编译成功。明明前阵子都是好的,代码都没变,Android Studio配置都没变,咋就不行了呢,百思不得其解。原创 2024-04-10 22:55:51 · 926 阅读 · 0 评论 -
Android 容易遗漏的刷新小细节
前言系列文章:Android Activity创建到View的显示过程Android Activity 与View 的互动思考Android invalidate/postInvalidate/requestLayout-彻底厘清Android 容易遗漏的刷新小细节之前的文章断断续续有分析过刷新(requestLayout/invalidate)相关的知识,只是那会儿侧重点不同,主要是着眼于整体流程。本篇将着重分析刷新关联的一些小细节。通过本篇文章,你将了解到:1、Measure/Layo原创 2022-04-17 17:37:47 · 2526 阅读 · 2 评论 -
Android Activity/View/Window/Dialog/Fragment 深层次关联(白话解析)
前言很早就想就这几个UI 组件关系梳理一篇博客,但由于之前一些基础博客没梳理好,因此耽搁了。这些UI 组件不论对于初学者还是有一定开发经验的同学来说都是经常用到的,但是可能没有深究其中差异,而网上也没有统一梳理这方面知识的文章。本篇文章尝试用简单的语言精确描述个中关联与差异,通过本篇文章你将了解到:1、Window 与 Window.java/PhoneWindow.java 有啥关系?2、Window 与 View 是如何关联上的?3、View 与 ViewGroup 父与子嵌套交错?4、A原创 2022-01-11 14:33:40 · 3597 阅读 · 0 评论 -
Android IPC 之服务端回调
前言IPC 系列文章:建议按顺序阅读。Android IPC 之Service 还可以这么理解Android IPC 之Binder基础Android IPC 之Binder应用Android IPC 之AIDL应用(上)Android IPC 之AIDL应用(下)Android IPC 之Messenger 原理及应用Android IPC 之服务端回调Android IPC 之获取服务(IBinder)前面几篇文章详细分析了AIDL的使用,包括数据在客户端和服务端的传输,本篇将原创 2021-10-07 13:57:25 · 861 阅读 · 0 评论 -
Android IPC 之获取服务(IBinder)
前言IPC 系列文章:建议按顺序阅读。Android IPC 之Service 还可以这么理解Android IPC 之Binder基础Android IPC 之Binder应用Android IPC 之AIDL应用(上)Android IPC 之AIDL应用(下)Android IPC 之Messenger 原理及应用Android IPC 之服务端回调Android IPC 之获取服务(IBinder)通过前面的文章我们知道,要进行线程通信的核心是能拿到另一个进程暴露出来的IB原创 2021-10-07 13:55:21 · 3574 阅读 · 0 评论 -
Android IPC 之Messenger 原理及应用
前言IPC 系列文章:建议按顺序阅读。Android IPC 之Service 还可以这么理解Android IPC 之Binder基础Android IPC 之Binder应用Android IPC 之AIDL应用(上)Android IPC 之AIDL应用(下)Android IPC 之Messenger 原理及应用Android IPC 之服务端回调Android IPC 之获取服务(IBinder)前面从源码+Demo角度详尽分析了AIDL,可能会觉得AIDL文件的编写略微原创 2021-10-07 13:53:23 · 806 阅读 · 0 评论 -
Android IPC 之AIDL应用(下)
前言IPC 系列文章:建议按顺序阅读。Android IPC 之Service 还可以这么理解Android IPC 之Binder基础Android IPC 之Binder应用Android IPC 之AIDL应用(上)Android IPC 之AIDL应用(下)Android IPC 之Messenger 原理及应用Android IPC 之服务端回调Android IPC 之获取服务(IBinder)上篇文章分析了AIDL原理及其基本使用,本篇文章将继续深入分析AIDL其它用原创 2021-10-07 13:51:02 · 706 阅读 · 0 评论 -
Android IPC 之AIDL应用(上)
前言IPC 系列文章:建议按顺序阅读。Android IPC 之Service 还可以这么理解Android IPC 之Binder基础Android IPC 之Binder应用Android IPC 之AIDL应用(上)Android IPC 之AIDL应用(下)Android IPC 之Messenger 原理及应用Android IPC 之服务端回调Android IPC 之获取服务(IBinder)上一篇文章分析了如何使用Binder进行进程间通信以及提出了直接使用Bind原创 2021-10-07 13:49:24 · 1327 阅读 · 2 评论 -
Android IPC 之Binder应用
前言IPC 系列文章:建议按顺序阅读。Android IPC 之Service 还可以这么理解Android IPC 之Binder基础Android IPC 之Binder应用Android IPC 之AIDL应用(上)Android IPC 之AIDL应用(下)Android IPC 之Messenger 原理及应用Android IPC 之服务端回调Android IPC 之获取服务(IBinder)上篇文章分析了Binder作为IPC中的一种在Android里发挥着重要的作原创 2021-10-07 13:47:00 · 1405 阅读 · 4 评论 -
Android IPC 之Binder基础
前言IPC 系列文章:建议按顺序阅读。Android IPC 之Service 还可以这么理解Android IPC 之Binder基础Android IPC 之Binder应用Android IPC 之AIDL应用(上)Android IPC 之AIDL应用(下)Android IPC 之Messenger 原理及应用Android IPC 之服务端回调Android IPC 之获取服务(IBinder)在平时的开发中,大部分时候都在编写单个App,每个App就是个进程。App之原创 2021-10-07 13:43:18 · 1216 阅读 · 0 评论 -
Android IPC 之Service 还可以这么理解
前言IPC 系列文章:建议按顺序阅读。Android IPC 之Service 还可以这么理解Android IPC 之Binder基础Android IPC 之Binder应用Android IPC 之AIDL应用(上)Android IPC 之AIDL应用(下)Android IPC 之Messenger 原理及应用Android IPC 之服务端回调Android IPC 之获取服务(IBinder)Android四大组件:Activity、Service、Broadcast原创 2021-10-07 13:40:31 · 1591 阅读 · 0 评论 -
Android Studio NDK JNI 编程最小白最简单入门Demo
Android Studio 编写JNI有两种方式通过ndk-build编写,和eclipse类似,需要配置Android.mk、Application.mk文件。之前的一些开源库还是使用此种方式编写.so,因此还是需要了解此种方式。通过cmake 编写,Android Studio 2.2(含)之后引入更方便的cmake,需要配置CMakeLists.txt。下面我们就通过实例一步步了解这两种方式异同点。ndk-build首先下载ndk,可以在单独下载ndk包,解压到本地目录,再将工程里配置原创 2021-10-06 12:11:09 · 1843 阅读 · 0 评论 -
Android clipToPadding 使用与疑难点解析
前言ClipXX 系列:Android clipChildren 使用与疑难点解析Android clipToPadding 使用与疑难点解析上篇文章分析了clipChildren,说到它不得不提它的孪生兄弟clipToPadding,一看名字就大概猜得到这俩就是用来clip画布的,接下来本篇将详细分析之。通过本篇文章,你将了解到:1、clipToPadding 使用场景2、clipToPadding 如何使用3、clipToPadding 原理4、clipToPadding 在Re原创 2021-10-06 12:09:25 · 5510 阅读 · 0 评论 -
Android clipChildren 使用与疑难点解析
前言ClipXX 系列:Android clipChildren 使用与疑难点解析Android clipToPadding 使用与疑难点解析我们知道,通常来说当子布局的边界处在父布局之外的时候,此时子布局超出的部分是无法显示的。想要显示超出的部分,通过设置clipChildren 属性可以解决此问题,本篇将会探究clipChildren 属性的使用及其原理。通过本篇文章,你将了解到:1、clipChildren 使用场景2、clipChildren 如何使用3、clipChildre原创 2021-10-06 12:07:39 · 4840 阅读 · 0 评论 -
Android MotionEvent 之ACTION_CANCEL
前言对于Android MotionEvent,我们平时大多关注的是ACTION_DOWN、ACTION_UP、ACTION_MOVE,本篇将重点分析ACTION_CANCEL 产生的原因及其滑动事件的处理。通过本篇文章,你将了解到:1、ACTION_CANCEL 产生的原因2、手指离开当前View时事件处理3、手指离开屏幕时事件处理1、ACTION_CANCEL 产生的原因从ViewGroup 入手分析事件分发是从ViewGroup–>View,因此想要知道View是否收到ACT原创 2021-10-06 12:05:30 · 2902 阅读 · 0 评论 -
Android Activity/Window/View 的background
前言Activity/Window/View 的background,平时接触最多的就是View的background,Activity的background次之,最后用的较少的是Window的background,这三者有什么关联、区别呢?通过本篇文章,你将了解到:1、View background 原理与使用2、Window background 原理与使用3、Activity background 原理与使用4、常用背景设置1、View background 原理与使用先看个简单的原创 2021-10-06 11:53:44 · 2817 阅读 · 0 评论 -
Android 各种坐标彻底明了
前言前面的文章有系统详细的分析过Android三大流程:Android 自定义View之Measure过程Android 自定义View之Layout过程Android 自定义View之Draw过程Measure过程确定了View的长、宽。Layout过程结合上一步的长、宽确定了View摆放位置,Draw过程结合上一步的摆放位置绘制出View,这是三者关系。本篇文章的重点是分析由Layout摆放位置引起的坐标相关知识分析。通过本篇文章,你将了解到:1、View坐标基础2、常用的Vi原创 2021-10-06 11:51:13 · 1321 阅读 · 0 评论 -
Android invalidate/postInvalidate/requestLayout 彻底厘清
前言前几篇分析了Measure、Layout、Draw 过程,这三个过程在第一次展示View的时候都会调用。那之后更改了View的属性呢?比如更改颜色、更换文字内容、更换图片等,还会走这三个过程吗?循着这个思路,来分析Invalidate/RequestLayout流程。通过本篇文章,你将了解到:1、Invalidate 流程2、RequestLayout 流程3、Invalidate/RequestLayout 使用场合4、子线程真不能绘制UI吗5、postInvalidate 流程I原创 2021-10-06 11:46:54 · 1727 阅读 · 0 评论 -
Android 自定义View之Draw过程(下)
前言Draw 过程涉及知识较多,分为上中下三篇Android 自定义View之Draw过程(上)Android 自定义View之Draw过程(中)Android 自定义View之Draw过程(下)上篇分析了硬件加速相关知识:Android 自定义View之Draw过程(中)本篇将从代码的角度深入分析硬件加速绘制与软件绘制。通过本篇文章,你将了解到:1、软件绘制流程2、硬件加速绘制流程2、LayerType 对绘制的影响3、Canvas 从哪里来到哪里去4、绘制流程全家福原创 2021-10-06 11:42:00 · 1119 阅读 · 0 评论 -
Android 自定义View之Draw过程(中)
前言Draw 过程涉及知识较多,分为上中下三篇Android 自定义View之Draw过程(上)Android 自定义View之Draw过程(中)Android 自定义View之Draw过程(下)上篇分析了自定义View绘制流程及其常用方法:Android 自定义View之Draw过程(上)本篇将以硬件加速绘制与软件绘制入口为切入点,通过本篇文章,你将了解到:1、什么是硬件加速2、硬件加速的开启与关闭3、硬件加速绘制与软件绘制分道扬镳的地方4、初步认识LayerType什原创 2021-10-06 11:39:51 · 536 阅读 · 0 评论 -
Android 自定义View之Draw过程(上)
前言Android 展示之三部曲:Measure(测量)---->Layout(摆放)---->Draw(绘制)前边我们已经分析了:Android 自定义View之Measure过程Android 自定义View之Layout过程这俩最主要的任务是:确定View/ViewGroup可绘制的矩形区域。接下来将会分析,如何在这给定的区域内绘制想要的图形。Draw 过程涉及知识较多,分为上中下三篇Android 自定义View之Draw过程(上)Android 自定原创 2021-10-06 11:33:18 · 745 阅读 · 0 评论 -
Android 自定义View之Layout过程
前言View展示需要经过Measure(测量)、Layout(摆放)、Draw(绘制)三个过程,其中:1、Measure:测量并确定View的宽、高2、Layout:结合Measure确定View的摆放位置3、Draw:将内容绘制到Layout确定的区域可以看出,Measure、Layout、Draw 三者是有内在联系的,通过这三步即可将View展示出来。本系列将会分析三者缱绻缠绵的一生:Android 自定义View之Measure过程Android 自定义View之Layout过程原创 2021-10-05 09:09:45 · 1195 阅读 · 0 评论 -
Android 自定义View之Measure过程
前言View展示需要经过Measure(测量)、Layout(摆放)、Draw(绘制)三个过程,其中:1、Measure:测量并确定View的宽、高2、Layout:结合Measure确定View的摆放位置3、Draw:将内容绘制到Layout确定的区域可以看出,Measure、Layout、Draw 三者是有内在联系的,通过这三步即可将View展示出来。本系列将会分析三者缱绻缠绵的一生:Android 自定义View之Measure过程Android 自定义View之Layout过程原创 2021-10-05 09:04:02 · 1425 阅读 · 0 评论 -
Android 输入事件一撸到底之View接盘侠(3)
前言1、Android 输入事件一撸到底之源头活水(1)2、Android 输入事件一撸到底之DecorView拦路虎(2)3、Android 输入事件一撸到底之View接盘侠(3前两篇文章分别分析了输入事件分发到App层以及DecorView对输入事件的处理,最终交给ViewTree处理。我们平时对事件的处理大部分集中在对ViewTree的处理上,网上绝大部分的文章也是针对此分析,为了将输入事件连贯起来,从总体看局部,由局部推总体,接下来分析ViewTree的事件分发。通过本篇文章,你将了原创 2021-10-05 08:53:17 · 413 阅读 · 0 评论 -
Android 输入事件一撸到底之DecorView拦路虎(2)
前言Android 不只是展示静态页面,更多的是与用户的交互。用户通过触摸屏幕与App互动,提供了更好的用户体验。而在App层我们需要接收屏幕的触摸事件进行相应的逻辑操作,本系列文章将分析App层输入事件兜兜转转的一生。本系列分为三篇文章讲述:1、Android 输入事件一撸到底之源头活水(1)2、Android 输入事件一撸到底之DecorView拦路虎(2)3、Android 输入事件一撸到底之View接盘侠(3通过本篇文章,你将了解到:1、输入事件从哪分发到App层2、输入事件原创 2021-10-05 08:50:33 · 538 阅读 · 0 评论 -
Android 输入事件一撸到底之源头活水(1)
前言Android 不只是展示静态页面,更多的是与用户的交互。用户通过触摸屏幕与App互动,提供了更好的用户体验。而在App层我们需要接收屏幕的触摸事件进行相应的逻辑操作,本系列文章将分析App层输入事件兜兜转转的一生。本系列分为三篇文章讲述:1、Android 输入事件一撸到底之源头活水(1)2、Android 输入事件一撸到底之DecorView拦路虎(2)3、Android 输入事件一撸到底之View接盘侠(3通过本篇文章,你将了解到:1、输入事件从哪分发到App层2、输入事件原创 2021-10-05 08:47:05 · 1296 阅读 · 0 评论 -
Dialog/PopupWindow/Toast 到底该怎么选
前言显示页面除了Activity,使用最多的可能就是Dialog、PopupWindow、Toast了。这三者有相似之处也有不一样的地方,本篇文章旨在厘清三者关系,阐明各自的优缺点,并探讨哪种场合使用它们。本篇文章涉及到WindowManager相关知识,如有需要请移步:Window/WindowManager 不可不知之事通过本篇文章,你将了解到:1、Dialog/PopupWindow/Toast 生命周期2、Dialog/PopupWindow/Toast 异同之处3、Dialog/Po原创 2021-10-05 08:40:52 · 1326 阅读 · 0 评论 -
Android Window 如何确定大小/onMeasure()多次执行原因
前言之前系统地分析了View Measure 过程:Android 自定义View之Measure过程我们知道父布局根据自身和子布局的要求给子布局生成测量模式和测量尺寸,并封装在MeasureSpec 对象里,最终传递给子布局让它最后确定自身的尺寸。很自然就会想到,既然子布局是从父布局拿的测量结果,父布局又从它的父布局拿测量结果,最终到ViewTree的顶点根View是谁测量的呢?循着这个问题,从源码角度一探究竟。系列文章:Window/WindowManager 不可不知之事Androi原创 2021-10-05 08:31:47 · 1097 阅读 · 0 评论 -
Window/WindowManager 不可不知之事
前言从Android app的视角看,Window是比较抽象的概念,它是View的承载者。而WindowManager顾名思义是Window的管理者,通过addView方法将View添加到Window里最终展示到屏幕上。系列文章:Window/WindowManager 不可不知之事Android Window 如何确定大小/onMeasure()多次执行原因通过本篇文章,你将了解到:1、Window/WindowManager 创建、属性及其使用2、WindowManager.Layo原创 2021-10-05 08:31:38 · 1692 阅读 · 0 评论 -
Android DecorView 一窥全貌(下)
前言上篇分析了DecorView创建过程,大致说了其子View构成,还剩下一些疑点,本篇继续分析。通过本篇文章,你将了解到:1、DecorView各个子View具体布局内容2、状态栏(背景)和导航栏(背景)如何添加到DecorView里3、DecorView子View位置与大小的确定4、常见的获取DecorView各个区块大小的方法DecorView各个子View具体布局内容照旧,打开Tools->Layout Inspector此时,DecorView有三个子View,分别是原创 2021-10-05 08:31:30 · 1703 阅读 · 0 评论 -
Android DecorView 一窥全貌(上)
前言我们都知道DecorView是最顶层View(根View),它是怎么创建和使用的呢?通过本篇文章,你将了解到:1、DecorView创建过程。2、DecorView与Window/Activity关系3、DecorView各个子View创建DecorView创建过程来回顾一下Activity创建过程:AMS管理着Activity生命周期,每当切换Activity状态时通过Binder告诉ActivityThread,ActivityThread通过Handler切换到主线程(UI线原创 2021-10-05 08:31:20 · 1676 阅读 · 0 评论 -
Android各种Context的前世今生
前言Android开发过程中,Context是绕不开的东西,因此本篇文章将一探究竟。通过这篇文章,你将了解到:1、Context衍生的子类2、Context作用3、四大组件里的Context4、Context与Resources5、不同Context关联与使用Context家族Context是抽象类,来看看常见的子类上图展示了常见的Context子类的继承关系。我们平时接触比较多的是Activity、Application、Service。Context作用根据上图,我们主原创 2021-10-04 20:46:51 · 996 阅读 · 0 评论 -
Android 四大组件通信核心
前言系列文章:Android Activity创建到View的显示过程Android 四大组件通信核心我们知道Android 四大组件:Activity/Service/Broadcast/ContentProvider 能够进行跨进程通信,它们均是借助Binder实现跨进程通信的能力。四者之间又有千丝万缕的联系,本篇将从宏观角度分析四者通信核心以及联系与区别。通过本篇文章,你将了解到:1、四大组件通信基础2、Activity 与AMS 交互3、Service 与AMS 交互4、Br原创 2021-10-04 20:18:07 · 1446 阅读 · 0 评论 -
Android Activity创建到View的显示过程
前言系列文章:Android Activity创建到View的显示过程Android 四大组件通信核心当我们点击桌面图标启动App,到App显示完成,这中间到底经历了什么呢?了解了这部分内容,将会对Activity、Window、View之间联系与区别加深印象,更好指导我们编写代码。通过这篇文章,你将了解到:1、Activity创建到onCreate()、onResume方法执行2、Application创建到onCreate方法执行3、Activity生命周期监听4、Window/原创 2021-10-04 20:04:44 · 2676 阅读 · 0 评论 -
全网最深入 Android Style/Theme/Attr/Styleable/TypedArray 清清楚楚明明白白
前言回顾一下:自定义View的时候,根据不同条件设置不同颜色,那么需要提供对外的方法设置颜色。而View可以在xml里引用,我们想当然的认为是否能够在xml里根据不同条件设置颜色属性呢?这样的话就很灵活了。当然,Android系统已经为我们准备好了,接下来我们来分析其解析原理及其使用。通过本篇文章,你将了解到:1、自定义属性基础明晰2、自定义属性使用3、attr/style/theme联系与区别4、自定义属性加载优先级5、自定义属性加载源码分析自定义属性基础明晰attrs.xml注原创 2021-10-04 19:15:09 · 1329 阅读 · 0 评论 -
Android ViewGroup onDraw为什么没调用
前言通过本篇文章,你将了解到:1、ViewGroup onDraw不执行的原因2、怎么让ViewGroup onDraw执行3、setWillNotDraw(boolean)作用如果对原理不感兴趣,请拉到最后的总结查看解决办法~小例子我们知道自定义view的时候会重写onDraw()方法,如下:public class MyView extends View { private Paint paint; private Rect rect; private Bi原创 2021-10-04 19:06:20 · 1258 阅读 · 2 评论 -
Android 屏幕分辨率适配
前言Android屏幕分辨率千奇百怪,怎么让app在不同的分辨率的设备上“看起来一样”呢?你也许还有以下疑惑:px、dp、sp区别与作用mipmap和drawable区别与作用mdpi hdpi xhdpi的图片资源有什么区别如何适配不同密度下的图片资源不同分辨率的设备如何适配宽度dpi是怎么确定的这篇文章将会针对以上问题一一解答。基本单位pxPixels 我们看到屏幕上的图像由一个个像素组成,像素里包含色彩信息。如常说的手机分辨率:1080 x 1920 指的是手机宽度可原创 2021-10-04 18:09:35 · 3711 阅读 · 0 评论 -
ImageView scaleType 各种不同效果解析
前言ImageView是Android最基础的控件之一,通过ImageView我们能够展示各式各样的图片,对其原理的研究有助于我们更好的使用它。通过本篇文章,你将了解到:1、ImageView 如何确定view的尺寸2、ImageView “adjustViewBounds” 怎么用3、ImageView “scaleType” 理解与运用4、ImageView 和Drawable异同ImageView 尺寸的确定ImageView继承自View,我们知道View的尺寸最终是在onMea原创 2021-10-04 18:05:42 · 1011 阅读 · 1 评论 -
Android Matrix 不再疑惑
前言在进行坐标变换的时候,都绕不开Matrix类,那到底Matrix原理是什么以及怎么使用,接下来将会详细讲解。通过这篇文章,你将了解到:1、Matrix类的基本方法2、pre/post该怎么理解3、Matrix底层原理4、Matrix实际运用矩阵知识如上图,是一个二行二列的矩阵。矩阵可以相加(相减),条件是两个矩阵的行数和列数需要一致(同型矩阵)。矩阵可以相乘,条件是第一个矩阵列数和第二个矩阵的行数一致举个简单的乘法的例子:将乘数交换位置可以看出,交换了位置之后,乘原创 2021-10-04 18:02:29 · 689 阅读 · 0 评论 -
Android事件驱动Handler-Message-Looper解析
前言关于这方面的知识,网上已经有很多。为啥这里还要写呢?知其然,也要知其所以然,handler-message-looper的设计很巧妙,我们了解为啥要这么设计,对我们设计程序的时候也有裨益。这篇文章阐述怎么结合现象与原理分析事件驱动的本质,相信即使没看过相关知识的同学也能快速理解。通过这篇文章你将知道:1、如何进行线程切换2、消息循环原理3、子线程消息循环4、链表实现栈和队列的线程切换Q1 为什么需要线程切换1、多线程能够提高并发效率,多线程的引入势必会有线程切换2、多线程同原创 2021-10-04 17:56:12 · 1287 阅读 · 0 评论