自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 资源 (2)
  • 收藏
  • 关注

原创 关于空闲任务IdleHandler的那些事

关于空闲任务IdleHandler的那些事  Android的消息机制Handler已经是老生常谈了,包括Android Framework层的应用启动过程都涉及消息机制,肥柴在“一切从Android的Handler讲起”专栏中已经讲了很多。  对于Android中的消息处理机制来说,MessageQueue和Looper、Message是非常重要的对象,而IdleHandler是MessageQueue的静态内部接口。那什么是IdleHandler呢?一、IdleHandler  IdleHan

2022-05-15 16:28:24 915 2

原创 关于Android Handler同步屏障那些事

关于Android Handler同步屏障那些事  前一段时间,肥柴突然听到一句:Handler同步屏障,一脸懵逼,啥玩意?  于是就去了解并总结了一下Handler的异步消息和同步屏障的相关知识,只能说,肥柴确实学到了。一、Handler Message种类  首先我们来了解一下Handler的Message种类:  1、普通消息  2、异步消息  3、屏障消息  其中普通消息又称为同步消息,肥柴平时发送的消息基本都是同步消息,而我们又基本很少有发送异步甚至屏障消息的需求,所以就没怎么了

2022-05-14 17:14:52 1066 1

原创 一切从Android的Handler讲起(八):Handler的内存泄露

一切从Android的Handler讲起(八):Handler的内存泄露  前面肥柴从浅入深,以Handler的基本工作机制为导入,进一步解析Handler机制的内部底层原理、Android触摸事件原理以及Android Framework层对消息机制的应用。这一篇章作为Handler的最后一个篇章,我们依旧从Handler入手,来谈谈内存泄漏的那些事。一、内存泄露  内存泄漏是一个老生常谈的问题,也是面试容易问到的问题,那到底什么是内存泄漏呢?  内存泄漏是指动态开辟的空间,在使用完毕后未释放,结

2022-05-07 15:45:20 2097

原创 一切从Android的Handler讲起(七):Handler在Android系统框架层的应用

一切从Android的Handler讲起(七):Handler在Android系统框架层的应用  前面的篇章,肥柴已经分析了Handler的消息处理机制,以及Android触摸事件原理——消息的来与与分发。那么既然有这套消息机制,Android官方必然有运用它的地方。  反应过来的读者已经知道肥柴要说啥了,没错,就是四大组件的生命周期。四大组件的生命周期就是遵循了事件驱动模型,它们均是由Android系统框架层产生相应的Message发送到UI的MessageQueue中触发的。  那么既然遵循事件

2022-05-07 13:52:17 2704

原创 一切从Android的Handler讲起(六):Android触摸事件基本原理

一切从Android的Handler讲起(六):Android触摸事件基本原理  前面的篇章,肥柴已经分析了Handler的消息处理机制,那既然有消息处理,就有消息的来源和分发。  从手指接触屏幕到MotionEvent被传送到Activity或者View,中间究竟经历了什么?Android中触摸事件到底是怎么来的呢?源头是哪呢?  本篇肥柴就简单的总结一下Android触摸事件的基本原理,只作为了解。一、Android触摸事件模型  触摸事件肯定要先捕获才能传给窗口,因此:  1、首先应该有

2022-05-06 15:03:38 1223

原创 一切从Android的Handler讲起(五):延迟消息实现原理与消息机制的基本原理

一切从Android的Handler讲起(五):延迟消息实现原理与消息机制的基本原理  在一切从Android的Handler讲起(四):Looper消息获取中,肥柴的分析都是基于及时消息,那对于诸如postDelay的延迟消息,Handler中又是如何实现其延迟出发的呢?一、延迟消息实现原理  我们重新来回顾一下MessageQueue内的获取消息的next()方法的源码。 /** MessageQueue.class */ @UnsupportedAppUsage Mes

2022-04-23 15:12:49 6432 2

原创 一切从Android的Handler讲起(四):Looper消息获取

一切从Android的Handler讲起(四):Looper消息获取  上一篇肥柴分析了Looper的线程唯一性原理,这一篇章,肥柴将从Looper的源码入手,对Looper获取分发消息原理的进一步解析,来解答以下三个问题:  1、Looper如何不断的获取Message并处理?  2、在UI线程里,系统预先为我们创建了一个Looper,那么UI线程里的Looper这个死循环岂不是占用了所有CPU资源,那为何不会出现ANR?  3、当MessageQueue在检查到没有Message时进入了休眠,那

2022-04-23 13:40:08 2028

原创 一切从Android的Handler讲起(三):Looper的唯一性——ThreadLocal

一切从Android的Handler讲起(三):Looper的唯一性——ThreadLocal  肥柴在起始篇:一切从Android的Handler讲起(一):Handler工作机制中提及到,一个Looper对应一个线程,也就是说,Looper在线程上具备唯一性。  那么问题来了,Handler底层是如何来实现Looper的唯一性的呢?  肥柴决定从Looper的源码入手,我们知道一个线程的Looper的创建是调用Looper的prepare方法,那我们就从这里开始下手。 /** Loope

2022-04-18 21:52:12 3480

原创 一切从Android的Handler讲起(二):Message

一切从Android的Handler讲起(二):Message  在起始篇:一切从Android的Handler讲起(一):Handler工作机制中,我们知道Looper会从MessageQueue中取出Message并提交给对应的Handler来处理,那么问题来了Looper取出来的Message怎么知道给哪个Handler呢?  要想解决这个问题,我们需要从源码入手,在使用Handler发送Message的时候,有两种方式:  1、send方式  2、post方式  肥柴决定先从最普遍的se

2022-04-17 22:03:26 1324

原创 一切从Android的Handler讲起(一):Handler工作机制

一切从Android的Handler讲起(一):Handler工作机制  有关Handler原理的相关博文或者书本有很多,包括肥柴本人也写过相关的博文,包括基础原理篇:Android基础知识(九):Handler机制的原理分析、基础使用方式篇:Android基础知识(十):Handler的使用方式与注意事项以及原理探究篇:Android进阶知识(二十二):Android的消息机制。  之所以单独开一个篇章来讲讲Handler,原因是肥柴在重看Handler的时候发现如果从Handler出发,可以牵扯的

2022-04-17 17:08:13 1236

原创 关于WebView设置键盘配置的那些事

关于WebView设置键盘配置的那些事一、可达鸭需求  写这篇文章是为了记录最近在项目中遇到的一个强硬的需求,我方产品(以下称,可达鸭)提出如下需求:对于填空题做题页面,点击输入框区域需要默认弹出数字键盘并且可以切换到其他键盘输入其他字符。  这里有个前提,作答页面由H5呈现,也就是在WebView上显示。肥柴思索半天,回复可达鸭:牡蛎。可达鸭就一句话:我不管,我就要,给我做出来。  于是肥柴开启了苦逼的探索之旅。二、使用EditText实现该功能  不管怎么说,都是输入框,于是肥柴从Edi

2021-06-06 19:25:48 810 2

原创 Android杂谈:Jetpack简介

Android杂谈:Jetpack简介一、什么是Jetpack  Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助开发者遵循最佳做法、让开发者摆脱编写样板代码的工作并简化复杂任务,以便开发者将精力集中放在所需的代码上。  Jetpack被Google推出的原因在于:规范开发者更快更好的开发出优质应用。二、Jetpack有什么(简单介绍)  那么Jetpack有什么工具呢?来一张总览图。  对上述的工具,下面只简单的介绍普通Android常用的工具如下表。

2021-02-23 20:49:20 579

原创 关于方法数越界的那些事

关于方法数越界的那些事一、方法数越界问题  在Android中单个dex文件所能包含的最大方法数为65536,其中包含Android FrameWork、依赖的jar包以及应用本身的代码中的所有方法。一般来说一个简单应用的方法数很难达到65536,但是对于一些比较大型的应用来说,65536就很容易达到。  当应用方法数达到65536后,编译器就无法完成编译工作并抛出类似下面的异常。com.android.dex.DexIndexOverflowException:method ID not in [

2020-07-12 20:46:59 293

原创 关于crash捕获的那些事

关于crash捕获的那些事  Android应用不可避免地会发生crash,也称之为奔溃,其可能由于Android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况。当crash发生时,系统会kill掉正在执行的程序,现象就是闪退或者提示用户程序已停止执行。  Android为了能够获取应用的crash信息,提供了一个解决方案。在Thread中有一个方法setDefaultUncaughtExceptionHandler,如下所示。public static void setDefa

2020-06-17 14:50:27 258

原创 Android进阶知识(三十一):Android性能优化

Android进阶知识(三十一):Android性能优化  Android设备作为一种移动设备,不管内存还是CPU的性能都受到了一定的限制,这意味着Android程序不可能无限制地使用内存和CPU资源,过多地使用内存会导致程序内存溢出,即OOM。而过多地使用CPU资源,一般指做大量的耗时任务,会导致手机变得卡顿甚至程序无响应,即ANR。  最后这个专题,笔者将总结一些Android性能优化的方法,主要内容包括布局优化、绘制优化、内存泄漏优化、响应速度优化、ListView优化、Bitmap优化、线程优

2020-06-12 16:11:05 424

原创 Android进阶知识(三十):ContentProvider的工作过程

Android进阶知识(三十):ContentProvider的工作过程  ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。需要注意的是ContentProvider内部的insert、delete、update和query方法需要处理好线程同步,因为这几个方法是在Binder线程池中被调用的,另外ContentProvider组件不需要手动停止。一、ContentProvider的启动过程  当ContentProvider所在进程启动时,ContentPro

2020-06-11 16:49:45 414

原创 Android进阶知识(二十九):BroadcastReceiver的工作过程

BroadcastReceiver是一种消息型组件,。BroadcastReceiver的工作过程主要包含两个方面,一个是广播的注册过程,另一个是广播的发送和接收过程。

2020-06-11 12:01:33 318

原创 Android进阶知识(二十八):Service的工作过程

Android进阶知识(二十八):Service的工作过程  Service是一种计算型组件,用于在后台执行一系列计算任务。Service分为两种工作状态:启动状态——主要用于执行后台计算;绑定状态——主要用于其他组件和Service的交互。需要注意的是,Service的两种状态可以共存。  笔者将对Service的两种状态工作过程进行介绍,这里笔者用的是Android 10.0的源码,但是同上一篇笔记:Android进阶知识(二十七):Activity的启动过程不一样,用于管理Service的为依旧是

2020-06-10 16:05:43 371

原创 Android进阶知识(二十七):Activity的启动过程

Android进阶知识(二十七):Activity的启动过程  Activity组件的主要作用是展示一个界面并和用户交互,其扮演的是一个前台界面的角色。关于Activity启动的触发(Intent)以及相关的启动模式等,笔者在Android基础知识(五):Activity的生命周期、Android基础知识(六):Activity的启动模式、Android基础知识(七):Activity互调之间的生命周期变化与onNewIntent()触发机制以及Android进阶知识(二):Activity启动模式进阶之

2020-06-07 21:43:31 597

原创 Android进阶知识(二十六):Android中的缓存策略

Android进阶知识(二十六):Android中的缓存策略  缓存策略在Android中有着很广泛的使用场景,尤其在图片加载的情景下,缓存策略更为重要。在图片加载的情景下,缓存的目的在于提高程序的效率,同时解决不必要的流量开销的问题。  缓存策略没有统一的标准,其主要包括缓存的添加、获取和删除三类操作。那缓存为何需要删除呢?  关键在于不管是内存缓存还是存储设备缓存,它们的缓存大小都是有限制的,当缓存容量已满,但是程序还需要添加缓存,这就需要删除旧的缓存添加新的缓存,而如何定义缓存的新旧就是一种策

2020-06-02 15:21:41 642

原创 Android进阶知识(二十五):Bitmap简介及其高效加载

Android进阶知识(二十五):Bitmap简介及其高效加载一、Bitmap  Bitmap代表一个位图,在Android中指的是一张图片,可以是png、jpg等格式的图片。BitmapDrawable里封装的图片就是Bitmap对象。Bitmap的创建  在Bitmap类中,Bitmap的构造方法是默认权限,因此开发者无法通过new来创建一个Bitmap对象。Bitmap提供了静态方法createBitmap用于创建Bitmap对象,这些方法可以分为4类(Android API 29)。

2020-06-01 15:43:33 494

原创 Android进阶知识(二十四):Android的线程池

Android进阶知识(二十四):Android的线程池  相比于线程,线程池有三点优点:  ① 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销。  ② 能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象。  ③ 能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。  Android中的线程池真正实现是ThreadPoolExecutor,其提供一系列参数配置线程池。从功能特性上,Android的线程池有4类,以下进行介绍。一、Thr

2020-05-29 18:05:04 179

原创 Android进阶知识(二十三):Android的线程

Android进阶知识(二十三):Android的线程  线程是Android的一个重要概念,从用途来说,线程分为主线程和子线程。线程作用主线程进程所拥有的线程,在Java中默认情况下一个进程只有一个线程,即为主线程。主线程主要处理界面交互相关的逻辑,在任何时候都必须有较高的响应速度,因此主线程中不能执行耗时任务子线程也叫工作线程,用于执行耗时操作,除了主线程之外的线程都是子线程  Android沿用了Java的线程模型,其中的线程也分为主线程和子线程,其中主线程也叫

2020-05-29 16:11:13 581

原创 Android进阶知识(二十二):Android的消息机制

Android进阶知识(二十二):Android的消息机制一、Android的消息机制概述  Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。MeeageQueue、Looper以及ThreadLocal的描述如下表。类描述MessageQueue消息队列,采用单链表的数据结构存储,内部存储了一组消息,以队列形式对外提供插入和删除工作。Looper消息循环,Looper以无限循环的形式去

2020-05-28 17:19:18 335

原创 Android进阶知识(二十一):Window的创建过程

Android进阶知识(二十一):Window的创建过程  View是Android中的视图呈现方式,但是View不能单独存在,它必须依附于Window,因此有视图的地方就有Window。这一篇章笔者将分析Activity、Dialog以及Toast的Window的创建过程,加深对Window的理解。一、Activity的Window创建过程  Activity中的Window创建过程涉及到Activity的启动过程(后续介绍),Activity的启动过程很复杂,最终会由ActivityThread中

2020-05-26 16:37:58 687

原创 Android进阶知识(二十):理解Window和WindowManager

Android进阶知识(二十):理解Window和WindowManager  Window表示一个窗口的概念,其实际上是View的直接管理者;它是一个抽象类,具体实现是PhoneWindow。Window的创建可以通过WindowManager来完成,WindowManager是外界访问Window的入口,Window的具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC过程。一、Window和WindowMan

2020-05-25 17:18:17 293

原创 Android进阶知识(十九):属性动画及动画使用注意事项

Android进阶知识(十九):属性动画及动画使用注意事项  View动画只能支持四种简单操作,除此之外View动画一个最大的缺陷:只是改变View的显示效果,并不会真正的改变View的属性。具体来说:例如屏幕左上角有一个Button,使用View动画将其移动到右下角,此刻点击右下角的Button,其绝对不会响应点击事件,而在左上角原位置则会响应。  为此,在API11的时候加入了新特性——属性动画,它对作用对象进行了扩展,属性动画可以对任何对象做动画,甚至可以没有对象。一、属性动画使用  属性动

2020-05-22 17:01:10 762

原创 Android进阶知识(十八):View动画、帧动画与View动画的特殊应用

Android进阶知识(十八):View动画、帧动画与View动画的特殊应用  Android的动画可以分为三种:View动画、帧动画和属性动画,其实帧动画也属于View动画的一种,只不过它和平移、旋转等常见的View动画在表现形式上略有不同。一、View动画  View动画作用对象为View,其通过对场景里的对象不断做图形变换(平移、旋转、缩放、透明度)从而产生动画效果,它是一种渐近式动画,并且View动画支持自定义。View动画的种类  View动画的四种变换效果对应着Animation的

2020-05-12 11:52:29 125

原创 Android进阶知识(十七):Android的Drawable

Android进阶知识(十七):Android的Drawable一、Drawable简介  Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念,其种类很多,最常见的颜色和图片都可以是一个Drawable。  在实际开发中,Drawable常被用来作为View的背景使用。Drawable一般通过XML定义,如我们最经常接触的在项目的目录app\src\main\res\drawable下就是XML定义的Drawable。同样可以通过代码来创建具体的Drawable对象,只是稍微复杂。

2020-05-09 14:32:06 299

原创 Android进阶知识(十六):理解RemoteViews

Android进阶知识(十六):理解RemoteViews一、RemoteViews及其应用  RemoteViews表示的是一个View结构,一种远程View,它可以在其它进程中显示,由于它在其他进程中显示,为了能够更新它的界面,RemoteViews提供了一组基础的操作用于跨进程更新它的界面。  RemoteViews在Android中的使用场景有两种:通知栏和桌面小部件。  通知栏主...

2020-05-07 16:30:46 606

原创 Android进阶知识(十五):自定义View的那些事

Android进阶知识(十五):自定义View的那些事  这一篇章,笔者并不打算介绍如何自定义View,毕竟诸如此类的博客众多,而且从笔者前几篇对View的层次结构、事件分发机制以及工作原理的介绍,对自定义View的实现所涉及的技术都有一定的了解了。这一篇,笔者将简单的介绍以下自定义View的分类以及需要注意的地方。一、自定义View的分类  自定义View的分类标准不唯一,这里将自定义Vi...

2020-05-07 14:31:42 126

原创 关于属性layout_weight及其与Measure过程的那些事

layout_weight:值表示。要和wrap_content(推荐用0dp替代)、match_parent配合使用。需要注意的是,。举个例子,屏幕宽度为W,设置两个按钮的layout_width=wrap_content,那么按钮1宽度BW1,按钮2宽度BW2,若增加设置layout_height=1,那么按钮1最终宽度BW1+(W–BW1–BW2)/2;按钮2最终宽度BW2+(W-BW1-BW2)/2。

2020-05-02 15:12:56 396 1

原创 关于Activity中获取View宽高的那些事

关于Activity中获取View宽高的那些事  现在有一个业务需求,需要在Activity已启动的时候做一个任务,该任务需要获取某个View的宽/高。直接的想法是从Activity的onCreate或者onResume里面去获取这个View的宽/高。但是实际上在onCreate、onStart、onResume中均无法获取正确的宽/高信息。  原因在于View的Measure过程和Acti...

2020-05-02 14:17:08 790

原创 Android进阶知识(十四):View的工作流程之Layout过程和Draw过程

Android进阶知识(十四):View的工作流程之Layout过程和Draw过程一、Layout过程  Layout过程的作用是ViewGroup用来确定子元素的位置,当ViewGroup的位置被确定后,它在onLayout方法中会遍历所有子元素并调用其layout方法,在layout方法中onLayout方法又会被调用。  Layout过程比Measure过程简单,layout方法确定V...

2020-04-30 16:20:37 241

原创 Android进阶知识(十三):View的工作流程之measure过程

Android进阶知识(十三):View的工作流程之measure过程  View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,其中measure确定View的测量宽/高,layout确定View的最终宽/高和四个顶点的位置,而draw则将View绘制在屏幕上。  measure过程要分情况来看,如果只是一个原始的View,那么通过measure方法...

2020-04-30 15:20:20 259

原创 Android进阶知识(十二):View的工作原理之基本概念

Android进阶知识(十二):View的工作原理之基本概念  从这一篇章开始,笔者将介绍关于View的工作原理与自定义View的相关内容。在介绍View的工作原理(三大流程)之前,读者有必要了解一些基本概念。一、Activity的视图层结构  在ActivityThread中,当Activity对象被创建完毕之后,会将DecorView添加到Window中。Window是一个抽象类,其唯一...

2020-04-29 16:41:35 202

原创 Android进阶知识(十一):View的滑动冲突

Android进阶知识(十一):View的滑动冲突  在界面中只要内外两层同时可以滑动,这个时候就会产生滑动冲突。以下内容将对View的滑动冲突常见情景,以及如何解决滑动冲突进行解析。一、常见的滑动冲突场景  常见的滑动冲突场景可以简单的分为以下三种(三种场景的图示如下图所示):场景1——外部滑动方向和内部滑动方向不一致;场景2——外部滑动方向和内部滑动方向一致;场景3——上面两种情...

2020-04-25 15:05:13 234

原创 Android进阶知识(十):View的事件分发机制

Android进阶知识(十):View的事件分发机制  这一篇章中,笔者将介绍View的事件分发机制,需要提及的是,View的事件分发机制是View事件体系中极其重要的一点。以下对View的事件分发机制的解析,都是基于源代码的基础上进行的总结与分析,若有兴趣的读者可以通过《Android开发艺术探索》一书阅读任玉刚老师是如何通过源码来解释以下内容的,笔者就不完全照搬了。一、点击事件的传递规则...

2020-04-23 16:49:56 635

原创 Android进阶知识(七):Binder连接池

Android进阶知识(七):Binder连接池  笔者不要做一只搬运代码的无聊肥柴。(啪啪啪,啊,好疼)  为了介绍Binder连接池,笔者感觉还是得介绍Binder连接池的实现,不然就只有工作原理没有代码实现介绍,感觉过意不去(懒的话还是可以直接贴链接的,但想想还是自己写好了)。一、Binder连接池的工作原理  在AIDL的实现中,其大致流程为:首先创建一个Service和一个AI...

2020-04-18 15:24:21 484

原创 Android进阶知识(六):IPC方式及其适用场景

Android进阶知识(六):IPC方式及其适用场景  这一篇将简单的介绍关于Android中的IPC方式,但对于这些方式如何实现的不做详细介绍,读者可以看《Android艺术开发探索》或者查看相应博客。笔者想要做一只知识帮运的快乐肥柴,而不是代码帮运的无聊肥柴。一、Android中的IPC方式  Android中IPC的方式有很多:通过Intent中附加extras来传递信息、通过共享文...

2020-04-12 16:10:59 1286

Android开发艺术探索.pdf

任玉刚大神的《Android开发艺术探索》pdf文档,属于扫描版,虽然不清晰,但是还是能够阅读的

2019-05-09

Android Volley的jar包

Android最新版本的Volley的jar包,Volley官方git地址:https://android.googlesource.com/platform/frameworks/volley

2019-04-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除