android
文章平均质量分 92
尤教授
这个作者很懒,什么都没留下…
展开
-
Android图片三级缓存的原理及实现
为什么要使用三级缓存如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知所以提出三级缓存策略,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量什么是三级缓存网络缓存, 不优先加载, 速度慢,浪原创 2021-12-19 15:49:07 · 338 阅读 · 0 评论 -
LayoutInflate布局加载原理详解
布局加载源码分析书接上文,从View的绘制流程开始:Window、DecorView、ViewRootImp详解View的绘制流程-measure、layout、draw先从Activity.setContentView开始简单回顾下布局是如何被加载的Activity.javapublic void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initW原创 2021-12-16 14:08:55 · 2427 阅读 · 0 评论 -
View的绘制流程-measure、layout、draw
承接上文——Window、DecorView、ViewRootImp详解我们打开一个Activity后,在ActivityThread中 的performLaunchActivity方法中,回调Activity onCreate()之前 会先调用Activity.attach(),这个方法中初始化了PhoneWindow和WindowManager对象。然后在resume之前,会将DecorView和WindowManager关联,WindowManager的具体实现类WindowManagerImpl把原创 2021-12-16 01:26:28 · 2038 阅读 · 0 评论 -
Window、DecorView、ViewRootImp详解
Window和DecorView的创建先从比较熟悉的activity.setContentView说起。Activity.javaprivate Window mWindow; ......public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar();} ......public .原创 2021-12-15 00:30:41 · 623 阅读 · 0 评论 -
Fragment启动流程分析
1.概述Fragment已经成为Android开发中应用比较广泛的方案了,几乎每一个APP都离不开它的影子。为了更深入的理解其中原理,我们从Fragment中源码开始分析。Fragment生命周期如果我们需要在Activity添加一个Fragment,代码如下://MainActivitypublic class MainActivity extends Activity{ ContentFragment mContentFragment; @Override protecte原创 2021-12-12 21:44:43 · 2313 阅读 · 0 评论 -
ThreadLocal 源码深入分析
以前只知道 ThreadLocal 的大致思路,没有去深入研究。今天读了读源码,果然博大精深~ThreadLocal 提供了线程本地变量,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同,而同一个线程在任何时候访问这个本地变量的结果都是一致的。当此线程结束生命周期时,所有的线程本地实例都会被 GC。ThreadLocal 相当于提供了一种线程隔离,将变量与线程相绑定。ThreadLocal 通常定义为 private static 类型。假如让我们来实现一个变量与线原创 2021-12-07 23:26:57 · 218 阅读 · 0 评论 -
ContentProvider流程详解
ContentProvider是一种内容共享型组件,它通过Binder向其他组件乃至其他应用提供数据。当ContentProvider所在的进程启动时,ContentProvider会同事启动并被发布到AMS中。需要注意的是,这个时候ContentProvider的onCreate要先于Application的onCreate而执行,这是四大组件中一个少有的现象。当一个应用启动时,入口方法为ActivityThread的main方法,main方法是一个静态方法,在main方法中会创建ActivityThr原创 2021-12-07 20:58:21 · 1868 阅读 · 0 评论 -
BrocastReceiver流程详解
广播的注册分为静态注册,以及动态注册。静态注册是在xml中配置receiver节点,在应用程序启动后会解析xml文件,具体的注册流程是交给PackagerManagerService来处理。本篇文章主要分析广播的动态注册,也就是在Java代码中调用registerReceiver方法来注册广播,开发中具体的使用这里不再介绍。1.注册广播不管是在Activity,还是Service中注册广播,都是调用ContextWrapper$registerReceiver方法。其中,ContextWrapper是C原创 2021-12-05 01:13:09 · 392 阅读 · 0 评论 -
bindService流程详解
bindService的流程,入口同样在ContextImpl中。ContextImpl.javapublic boolean bindService(Intent service, ServiceConnection conn, int flags) { warnIfCallingFromSystemProcess(); return bindServiceCommon(service, conn, flags, mMainThread.getHandler(), Process.my原创 2021-12-04 19:29:28 · 1133 阅读 · 0 评论 -
startService流程详解
1.Service整体交互结构Service作为Android四大组件之一,其生命周期是通过system_server进程中的ActivityManagerService(AMS)管理的,大致了解Service通信过程中涉及到的几个主要角色。App端进程:ContextImplContext抽象类所有api的实现,是Service、Activity和其他组件base Context。ActivityThread代表着App的主线程,是App的入口,Application、Activ原创 2021-12-04 16:00:47 · 3010 阅读 · 0 评论 -
Activity的启动流程详解
前言activity启动的流程分为两部分:一是在activity中通过startActivity(Intent intent)方法启动一个Activity;二是我们在桌面通过点击应用图标启动一个App然后显示Activity;第二种方式相较于第一种方式更加全面,所以本文会以第二种流程来分析。简要我们手机的桌面是一个叫做Launcher的Activity,它罗列了手机中的应用图标,图标中包含安装apk时解析的应用默认启动页等信息。在点击应用图标时,即将要启动的App和Launcher、AMS、Zygot原创 2021-11-28 16:23:33 · 7553 阅读 · 0 评论 -
Java8特性——Lambda表达式
在 Java 8 以前,若我们想要把某些功能传递给某些方法,总要去写匿名类。以前注册事件监听器的写法与下面的示例代码就很像:manager.addScheduleListener(new ScheduleListener() { @Override public void onSchedule(ScheduleEvent e) { // Event...原创 2019-12-22 23:59:21 · 217 阅读 · 0 评论 -
Android设计模式之策略模式
1.前言策略模式在开发中也常常用到,当实现某一个功能时如支付功能时,支付功能可以有多种实现方式,比如微信支付、支付宝支付、一网通支付。再比如实现分享时也可以有多种策略,可以分享到QQ、微信、微博等社交平台。在众多的实现方式中,可以将功能中涉及到的通用方法或策略提取出来,提供一个统一的接口,不同的算法或者策略有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法或者策略的动态策略...原创 2019-12-22 22:12:37 · 267 阅读 · 0 评论 -
Android Sutdio类结构查看工具Structure详解
android studio可以非常方便地查看当前类的结构,包括类的方法与成员变量等等。只须点击Project栏下侧的Structure即可查看类的结构。里面的工具栏可以对类的信息进行筛选,非常方便。所谓工欲善其器,必先利其器,现将类结构的图标含义与头栏工具选项的作用详细研究一番,将心得记录归纳,以免遗忘,如有错误之处,还请各位同学指出。TextView的类结构信息如下图(筛选全选)1...原创 2019-11-15 19:13:58 · 868 阅读 · 0 评论 -
OkHttp 源码解析(三)
简介上一篇文章分析了 OkHttp 建立连接的过程,主要涉及到的几个类包括 StreamAllocation、RealConnection 以及 HttpCodec,其中 RealConnection 封装了底层的 Socket。Socket 建立了 TCP 连接,这是需要消耗时间和资源的,而 OkHttp 则使用连接池来管理这里连接,进行连接的重用,提高请求的效率。OkHttp 中的连接池由 ...原创 2019-10-26 10:05:03 · 201 阅读 · 0 评论 -
OkHttp 源码解析(二)
简介上本文主要看一下 RetryAndFollupInterceptor 并引出建立连接相关的分析。RetryAndFollowUpInterceptorInterceptor 最主要的代码都在 intercept 中,下面是 RetryAndFollowUpInterceptor#intercept 中的部分代码:@Override public Response intercept(...原创 2019-10-26 10:00:20 · 234 阅读 · 0 评论 -
OkHttp源码解析(一)
简介OkHttp 是一款用于 Android 和 Java 的网络请求库,也是目前 Android 中最火的一个网络库。OkHttp 有很多的优点:在 HTTP/2 上允许对同一个 host 的请求共同一个 socket连接池的使用减少请求延迟(如果 HTTP/2 不支持)透明的 GZIP 压缩减少数据量大小响应的缓存避免重复的网络请求基本用法下面是 OkHttp 的使用示例:...原创 2019-10-24 20:44:13 · 176 阅读 · 0 评论 -
Activity、Window、DecorView与ViewRoot之间的关系
1.概述ActivityActivity负责控制生命周期和处理事件,负责统筹视图的添加与显示,以及通过一些回调方法与Window和View进行交互。一个Activity包含一个Window,真正控制视图的是Window,Window才是真正代表一个窗口。WindowWindow是视图的承载者,是一个抽象类,Activity中持有的实际上是Window的子类PhoneWindow,Windo...原创 2019-09-25 19:29:37 · 1305 阅读 · 0 评论 -
Android虚拟机及编译过程
一、什么是Dalvik虚拟机Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Andro...原创 2019-09-26 19:19:50 · 585 阅读 · 0 评论 -
深入理解ReentrantLock
一、 概述本文首先介绍Lock接口、ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lock方法和unlock方法,来解释ReentrantLock的内部原理,最后做一个总结。本文不涉及ReentrantLock中的条件变量。1.1、Lock接口Lock接口,是对控制并发的工具的抽象...原创 2019-10-07 16:49:18 · 124 阅读 · 0 评论 -
Android框架学习—EventBus源码分析
参考文章:https://blog.csdn.net/u011240877/article/details/73196808https://blog.csdn.net/sted_zxz/article/details/79949465EventBus是一个事件发布/订阅轻量级框架,能够简化组件间的通信,有效地将事件发送者和订阅者解耦,能避免复杂的依赖性和生命周期问题。EventBus可以代替...原创 2019-02-25 14:03:44 · 283 阅读 · 0 评论 -
Activity详解
1.activity的启动过程:启动activity的请求由instrumentation处理,通过binder向AMS发起请求,AMS内部维护着一个ActivityStack,负责同步Activity的状态,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。2.异常情况下Activity的生命周期分析:(1)资源相关的系统配原创 2017-09-19 21:21:21 · 2572 阅读 · 0 评论 -
RxJava源码解析
转自:https://blog.csdn.net/sted_zxz/article/details/82317400本文基于RxJava2.2.1版本分析。简介官方介绍:RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based...转载 2019-09-19 17:58:37 · 123 阅读 · 0 评论 -
Java中的静态代理与动态代理
一、代理模式**定义:**给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。1、代理模式的理解代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问。现实世界的代理人被授权执行当事人的一些事宜,无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信。而事实上代理人是要有当事人的授权,并且在核心问题上...原创 2019-09-12 20:18:13 · 138 阅读 · 0 评论 -
View的事件分发机制源码解析
1.点击事件的传递规则点击事件的分发就是对MotionEvent事件的分发过程,即当一个MontionEvent产生以后,系统需要把这个事件传递给一个具体的View,传递的过程就是分发过程。 点击事件的分发由三个方法共同完成dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。1).public boolean dispatchT...原创 2018-02-22 21:41:55 · 175 阅读 · 0 评论 -
Android中的compileSdkVersion,minSdkVersion,targetSdkVersion和buildToolsVersion
compileSdkVersioncompileSdkVersion 告诉 Gradle 用哪个 Android SDK 版本编译你的应用。使用任何新添加的 API 就需要使用对应 Level 的 Android SDK。需要强调的是修改 compileSdkVersion 不会改变运行时的行为。当你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误,但新...原创 2018-02-27 14:47:36 · 6695 阅读 · 0 评论 -
Serializable和Parcelable的区别
parcelable与serializable都是序列化的操作,那么我们先看 一下为何要使用序列化!1)永久性保存对象,保存对象的字节序列到本地文件中;2)通过序列化对象在网络中传递对象;3)通过序列化在进程间传递对象。 我们在项目中最经常遇到的情况就是,我们需要在activity或者service中传递对象,这个时候就需要用到序列化了!(需要在多个部件(Activit原创 2017-12-13 16:27:17 · 400 阅读 · 0 评论 -
Eclipse开发Android报错Jar mismatch! Fix your dependencies
当项目中引用了其他项目作为Library的时候,如果这几个项目中都使用了android-support-v4.jar这个包时,很可能出现这个问题,出现这个问题的原因下图中Error信息第一行说的很清楚,发现两个版本不同的android-support-v4.jar在使用。解决办法:只需要保证让所有包含android-support-v4.jar的项目使用同版本的原创 2017-10-16 09:06:59 · 293 阅读 · 0 评论 -
Retrofit 2.0 使用教程
本文转载自:http://blog.csdn.net/carson_ho/article/details/73732076前言在Andrroid开发中,网络请求十分常用而在Android网络请求库中,Retrofit是当下最热的一个网络请求库今天,我将献上一份非常详细Retrofit v2.0的使用教程,希望你们会喜欢。如果对Retrofit v2.0的转载 2017-08-28 22:56:56 · 1677 阅读 · 0 评论 -
侧滑菜单SlidingMenu的使用方法
1.导入和修改相library2.sliding menu的使用3.解决与viewpager的滑动冲突原创 2017-07-28 16:40:28 · 342 阅读 · 0 评论 -
View的坐标相关和滑动
1.基本坐标值上面两图很清楚的描述了View和MotionEvent提供的关于自身坐标的方法。View提供的方法:getLeft:View的左边到父容器左边的距离 getRight:View的右边到父容器左边的距离 getTop:View的顶边到父容器顶边的距离 getBottom:View的底边到父容器顶边的距离getWidth:获得View的宽度,值为mRig...原创 2018-03-02 15:44:07 · 200 阅读 · 0 评论 -
View的绘制流程
在ActivityThread中,当Activity被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl和DecorView建立关联。View的绘制流程是从ViewRoot的performTraversals方法开始,performTraversals会一次调用performMeasure、performLayout、per...原创 2018-03-05 15:19:03 · 138 阅读 · 0 评论 -
自定义View构造函数详解
初始Custom View的构造函数通常我们在实现Custom View的时候,都会先继承View并实现View的三个构造函数,例如:import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.View;publ...原创 2018-03-05 21:56:16 · 348 阅读 · 0 评论 -
JVM之GC总结
什么是垃圾回收垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。Java 语言出来之前,大家都在拼命的写 C 或者 C++ 的程序,而此时存在一个很大的矛盾,C++ 等语言创建对象要不断的去开辟空间,不用的时候又需要不断的去释放控件,既要写构造函数,又要写析...原创 2019-09-12 14:52:40 · 150 阅读 · 0 评论 -
Rxjava入门之创建操作符+网络轮询实例
Rxjava提供了丰富、功能强大的操作符,几乎能完成所有功能的需求,这篇文章主要详细介绍Rxjava中最常用的创建操作符。1.基本创建需求场景完整的创建被观察者对象对应操作符类型create()作用完整创建一个被观察者对象(Observable)具体使用/ ** * 1. 通过creat()创建被观察者 Observable 对象 */ Obser...原创 2019-09-08 11:01:57 · 149 阅读 · 0 评论 -
RxJava入门之基本使用
1.简介Rxjava 是一个 基于事件流、实现异步操作的库,类似于 Android中的 AsyncTask 、Handler作用,由于其基于事件流的链式调用、逻辑简洁使用简单的特点,深受各大 Android开发者的欢迎。Rxjava基于一种扩展的观察者模式4种不同角色:被观察者(Observable):产生事件观察者(Observer):接收事件,并给出响应动作订阅(Subscribe...原创 2019-09-07 11:23:54 · 194 阅读 · 0 评论 -
Handler内存泄漏原理解析
1. 简介在写Android应用程序时,Handler应该是很常见的一个类。我们一般在使用该类时有采用如下方法:// 1.新建一个匿名的Handler内部类,并重写handleMessageprivate Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) {...原创 2019-09-04 23:45:28 · 170 阅读 · 0 评论 -
Android音视频处理—通过MediaMuexr合成MP4文件
参考文章:http://blog.51cto.com/ticktick/17107431.MP4基本概念MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。一个MP4文件首先会有且只有一个“ftyp”类型的b...原创 2019-02-11 16:46:50 · 1252 阅读 · 1 评论 -
Java内存模型JMM
由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了。基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是引入了一个新的问题:缓存...原创 2018-04-03 13:20:24 · 147 阅读 · 0 评论 -
Activity启动流程中AMS的具体流程
调用Activity的startActivity实际是内部是调用了startActivityForResult.而在startActivityForResult内部是调用了Instrumentation的execStartActivity。execStartActivity内部调用AmS的startActivity(Binder机制)。AmS执行startActivity期间先做一些与栈相关的工作...原创 2018-03-14 10:19:31 · 835 阅读 · 0 评论