自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 Java 集合迭代器源码及工作过程分析

Java 为我们提供了现成的集合类库,我们常用的 List Set Map 等都是在开发过程中可以直接使用的,设计到集合就不得不说集合的遍历,之前分析迭代器模式时我们提到了在 Java 的集合功能实现中也使用了迭代器模式,这里先简单介绍一下迭代器模式。一、迭代器模式迭代器模式(Iterator Pattern) 又称游标(Cursor) 模式,是行为型设计模式之一。迭代器模式源于对容器...

2018-07-09 13:51:49 681

原创 SimpleArrayMap 源码分析

SimpleArrayMapSimpleArrayMap 是 Andorid V4 包提供的一种用来代替 HashMap 的数据结构,由于 HashMap 在数据容量过大时时间复杂度会越来与趋近于 O(N) , 故而效率不高。SimpleArrayMap 的实现方式和工作过程使其内存占用更小,在数据量不大时效率更高,所以在 Android 开发中我们可以择机选择适合的方式来实现 Map下面...

2018-07-05 20:42:41 710

原创 SparseArray 稀疏数组源码分析

SparseArray sparse 稀疏介绍SparseArray 用来实现 int 类型与 Object 类型的映射,跟普通的 Map 不同,普通 Map 中有更多的空索引,对比 HashMap 来说,稀疏数组实现了更高效的内存使用,因为稀疏数组避免了 int 类型 key 的自动装箱,且稀疏数组每个 value 都不需要使用 Entry 对象来包装。所以在 Android 开发中...

2018-07-05 15:54:40 528

原创 RecyclerView 使用及源码解析

首先在学习 RecyclerView 的源码之前,建议先阅读 ListView 的源码分析,之后学 RecyclerView 会更快更轻松。 传送门在这里 http://blog.youkuaiyun.com/coderr/article/details/76679870一、使用导包: compile ‘com.android.support:recyclerview-v7:23.4.0’1、创建 Adapt

2017-08-04 13:30:02 483

原创 ListView 源码解析

源码解析的习惯也要开始养成呀,ListView 的一些工作流程当时看懂了,可过了一段时间再看彻底忘了,这次又花了时间顺了一遍,所以必须要记下来了,以便跟 RecyclerView 作对比,所以先看 ListView 继承结构ListView 和 GridView 都继承自 AbListView ,AbListView 继承自 AdapterView,再往上就是 ViewGroup 和 View 了在

2017-08-04 13:28:20 585 1

原创 Java 集合类实现原理

Collection & MapCollection 子类有 List 和 SetList –> ArrayList / LinkedList / VectorSet –> HashSet / TreeSet Map –> HashMap / HashTable / TreeMap一、ArrayListArrayList 是 List 接口的可变数组的实现。实现了所有可选列表操作,并允许包

2017-07-23 09:34:59 1420

原创 Android 序列化 Parcelable VS Serializable

Android 的序列化方式 ParcelableParcel 介绍:Parcel 内部包装了可序列化的数据,可以在 Binder 中自由传输Parcelable 是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过 Intent 和 Binder 传递。 package com.renxl.touchevent.scrollview; import android.

2017-07-21 17:31:57 622

原创 LayoutInflater 源码分析

LayoutInflater 在开发中是经常使用的一个类,一般我们都通过 from 方法获取 LayoutInflater 的实例,并通过其 inflate 方法解析 xml 文件。这么常用与重要的类值得我们去追着源码更深程度的去理解 xml 文件的加载和解析过程。一、LayoutInflater 工作过程public static LayoutInflater from(Context conte

2017-07-21 17:13:29 387

原创 Android 系统启动时 PackageManagerService 对应用组件信息表的构建过程

PackageManagerService 作为及其重要的系统服务,在系统启动的时候就会启动,PMS 在应用开发中为我们提供了很多获取系统中应用信息的方法,如下所示,那么这些跟应用相关的信息是什么时候放入 PMS 的,PMS 又是如何工作的,下面就来一一探究。首先说明 PMS 作为一个系统进程中的服务,是不能直接跟应用进程进行交互的,所以在应用中通过 Context 对象的 getPackageMa

2017-07-21 17:09:43 475

原创 Android 系统服务的注册以及 getService() 方法源码解析

写在前面开发过程中,我们经常需要一些系统服务,比如 LayoutInflater、ActivityManager 等等,每次获取的时候我们都直接调用 Activity,Service 的 getSystemService(String name) 这个方法,然而这个方法是什么工作的?每次获取的对象是不是一个?我们都不太清楚,今天,我们就来揭开 getSystemService 方法的面纱,剖析他的工

2017-07-21 17:03:50 4082

原创 Android 自定义 View 开发

经过前面几篇文章 View 基础 View 的测量过程 View 的布局和绘制 Android 滑动原理与方式 Android 事件分发与滑动冲突 一步比一步深入的分析 View 知识,终于迎来的最后的大 BOSS - 自定义 View。其实只说自定义 View 这或许没有什么难的,但是如果要是跟其他 View 有了交互,有了滑动冲突,有了位置冲突,这时候要是没有前面几篇的基础,那绝对懵圈。所以前面

2017-07-06 20:48:16 434

原创 Android 事件分发和 View 的滑动冲突

Android 事件分发和滑动冲突都是开发中经常遇到的难点问题,遇到问题时可能会通过 Google 或者 StackOverflow 按照别人的经验解决了问题,但每次遇到这种问题都去 Google 也是非常不合适的事情。本篇文章将从 Android 事件分发的源码入手,首先分析源码,当我们了解了源码,不但能从源码中总结到常见问题的解决方式,并且遇到更加深入问题时也能冷静的从源码入手来解决问题,做到知

2017-07-05 20:05:29 999

原创 View 的滑动原理和实现方式

开发中,为了增加更多炫丽的效果,我们经常在应用中添加滑动效果,今天就来分析一下 View 中滑动效果的实现原理以及几种常见的实现方式。一、滑动原理1. Android 中的坐标系在 View 基础 中我们提到了 View 中的 X、Y、mLeft、mTop… 等属性,其中这些属性的值都是相对坐标系来说的,Android 中有两种坐标系,这里一一来简单说一下Android 坐标系: 以屏幕左上角为坐标

2017-07-05 11:05:06 585

原创 View 的 layout 布局和 draw 绘制过程

上篇文章View 的测量分析了 View 的工作原理中最复杂的测量过程,接着测量过程的是布局和绘制的过程,这里两个过程相对比较简单,所以放到一篇文章中来写View 的测量过程中,确定了 View 的测量宽高的信息,布局过程则是为了确定 View 在其父 View 中的位置以及 ViewGroup 确定其所有子 View 元素的位置;布局结束后会执行绘制过程,绘制过程将 View 需要显示的内容绘制到

2017-07-04 15:53:40 602

原创 View 的测量

接着上篇 View 基础 来讲 View 的工作原理,View 的工作原理中最重要的就是测量、布局、绘制三大过程,而其中测量是最复杂的,今天的主要任务是讲明白 View 的测量过程 ,不过在讲测量过程之前还会将一些有关 View 测量中使用到的其他知识进行讲解,例如 View 的展示过程、MeasureSpec 类的原理和使用等。所以整篇内容会稍多,不过条理很简单。让我们开始吧。View的展示过程首

2017-07-04 11:34:13 406

原创 View 基础

从今天开始,我会来分析一下 Android 中有关 View 的一些知识,包括基础、View 的工作原理、自定义 View 等相关内容,今天的内容比较简单,是 View 基础,这里记录的基础内容可能并不是很多,但肯定是开发中比较常用和容易混淆的,比如 View 的各个位置属性钟 x 和 translationX 以及 mLeft 各自代表的是什么、MotionEvent 事件得到的坐标到底坐标原点在

2017-07-04 11:26:57 507

原创 ContentProvider 工作过程

简介ContentProvider 是一种内容共享型组件,其主要职责是向其他组件以及其他应用提供数据。当 ContentProvider 所在的进程启动时,ContentProvider 会同时启动并被发布到 AMS 中。注意:ContentProvider 的 onCreate 要先于 Application 的 onCreate 执行是否是单例一般来说,ContentProvider 都应该是单

2017-07-03 16:48:07 364

原创 BroadcastReceiver工作过程

BroadcastReceiver 注册过程静态注册:程序安装时由 PackageManagerService 即 PMS 解析并完成注册,与 Activity Service ContentProvider 注册相同。动态注册从 ContextImpl 的 registReceiver 方法开始,调用 registReceiverInternal 方法应用进程注册过程需要将 Receiver

2017-07-03 16:47:40 381

原创 Service 工作过程

Service 启动模式工作过程Service 的启动过程从 ContextWrapper 的 startService 方法开始应用进程ContextWrapper 的 startService 实现为 ContextImpl 的 startService , 该方法中调用 startServiceCommon 方法startServiceCommon 方法中调用 ActivityManagerN

2017-07-03 16:46:23 339

原创 Activity 启动过程

Activity 启动过程启动应用进程启动,调用 ContextImpl 的 startActivity(); 最终调用的 startActivityForResult(); 方法startActivityForResult 中调用 Instrumentation 的 execStartActivity();execStartActivity 中调用 ActivityManagerNative.ge

2017-07-03 16:45:06 355

原创 Android 的 IPC 机制

IPC Inner-Process Communication 进程间通信线程 线程是CPU调度的最小单元,同时线程是一种有限的系统资源进程 进程指一个执行单元,PC 和 移动设备中指一个程序或者一个应用process 开启多进程native 层也可以 fork 新的进程有 : 以冒号简写和写完整进程名两种方式以 :冒号方式,表明该进程是属于该应用的私有进程,其他应用组件不可以和他跑在同

2017-07-03 16:41:18 299

原创 Android 中的 Binder 机制

Binder简析直观来说,Binder 是 Android 中的一个类,是继承了 IBinder 接口;从 IPC 角度考虑 Binder 是进程间通信的一种方式;从 Framework 层,Binder 是 连接 ServiceManager 和 各种 Manager(AM,WM) 以及各种 ManagerService 的桥梁;从应用层来说,Binder 是客户端和服务器端进行通信的媒介,当 b

2017-07-03 16:38:45 396

原创 AsyncTask原理

AsyncTask 异步执行AsyncTask 中持有了静态的 InternalHandler (初始化时默认绑定 MainLooper),静态的串行执行任务的线程池和静态的并行执行任务的线程池但是串行执行任务的线程池并不会自己处理任务,而是调用并行线程池处理任务。执行任务时将任务添加到串行线程池中的 mTask 队列中,队列中会依次取出任务并调用并行线程池来执行任务,在传递任务时通过 Workde

2017-07-03 16:37:31 1640

原创 Android 中的线程池

Android 中的四种线程池在开发中使用线程池的优点重用线程池中的线程,避免因为线程的创建和销毁带来的性能开销 开辟一块内存空间,存放许多未死亡的线程,池中线程执行调度有池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样就可以避免反复创建线程对象所带来的性能开销,节省了系统的资源能有效控制线程池的最大并发数,避免大量的线程之间因为互相抢占系统资源而导致的阻塞现象能够

2017-07-03 16:36:43 307

原创 ThreadLocal 源码解析

引言ThreadLocal 可以在每个线程中存取数据,并且不同的线程中的数据互不影响。使用在数据以线程为作用域并且不同的线程拥有不用的数据副本,或者是复杂的参数传递时(参数在同一线程中的不同类中传递)。在分析消息机制源码的时候,涉及到了 ThreadLocal,使用是在 Looper 类中通过 ThreadLocal 对象的 set 方法和 get 方法存取当前线程的 Looper 对象我们发现 T

2017-07-03 16:36:11 383

原创 HandlerThread 与 IntentService 源码分析

HandlerThread 是线程类,主动绑定 Looper ,为 Handler 提供了消息队列,IntentService 中通过为 Handler 绑定 HandlerThread 提供的子线程 Looper,从而使 Handler 处理消息在子线程,由于 Looper 是死循环,所以在 IntentService 销毁时,必须停止 Looper 中消息队列的循环 MessageQueue.q

2017-07-03 16:35:04 348

原创 Android 消息机制

异步消息处理一、LooperLooper负责的就是创建一个MessageQueue,然后进入一个无限循环体不断从该MessageQueue中读取消息,而消息的创建者就是一个或多个Handler 。在构造方法中,创建了一个MessageQueue(消息队列)。private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quit

2017-07-03 16:23:22 315

原创 Activity 进阶

Activity一、四种形态运行状态: 当 Activity 处于栈的顶层,可见,并可与用户进行交互 onResume()–> onPause() 暂停状态: 当 Activity 被非全屏的或者透明的 Activity 遮挡后,原来的 Activity 处于暂停状态 onPause() 被调用 ,系统内存极低时会被回收停止状态: 当 Activity 被置于后台(例如被其它Activity完

2017-07-03 16:17:48 425

空空如也

空空如也

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

TA关注的人

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