- 博客(110)
- 资源 (3)
- 收藏
- 关注
原创 TabLayout初始化后onTabSelected首次没有被回调的问题
我们经常使用TabLayout控件来管理多个页面的展示,但是应用不当的话,可能会给我们带来一些小小的困扰。比如说,我就曾经遇到过TabLayout 初始化后OnTabSelectedListener中 onTabSelected首次没有被回调的问题。为了深刻了解问题的缘由,还需要从代码中一窥究竟。这篇文章主要是记录当时的学习的过程。首先列出能够避免上述问题的使用代码: tabLayout...
2019-07-26 20:17:19 3486 1
原创 Android开发笔记(二) 关于弹窗
Android中提供几种不同的弹窗模式,Toast,Dialog,PopupWindow 每种弹窗又对应了不同的应用场景,我们可以根据不同业务场景来选择。下面将会分别介绍上面四种不同弹窗的应用,同时也对每中弹窗的源码和所遇到的问题进行分别分析。1.ToastToast是Android中最轻量级的视图,该视图已浮于应用程序之上的形式呈现给用户。它并不获得焦点,即使用户正在输入什么也不会受到影响,...
2018-10-25 19:27:15 686
原创 Android开发笔记(一)沉浸式状态栏
在Android开发中我们越来越重视用户的App操作体验,在使用App中我们主张减少对用户的干扰,经常会提到一致性体验。为了追求界面的风格的一致性,Google官方在Android 4.4 开始,支持了系统最上方的状态栏(StatusBar)和最下方的导航栏(Navigation Bar)可以被透明化,使得APP中的设计可以过渡更加平滑,不像之前那样的割裂感,让整个APP更加一致。而且后续的系统版...
2018-09-21 09:45:16 439
原创 为何在onCreate中通过View.post能获取宽高
我们在获取View的宽高时,其实执行的代码是:/** * Return the width of the your view. * * @return The width of your view, in pixels. */@ViewDebug.ExportedProperty(category = "layout")public final int getWidth() {...
2018-08-16 17:45:53 488
原创 Android 从程序启动startActivity到生命周期变化的过程
在上篇文章中,我们了解了Android应用程序是如何启动的,也介绍了具体的流程调用。知道了整个APP的启动过程都是由ActivityThread类中执行的,而且启动中的生命周期的变化都是通过Handler消息机制来完成的。那么这篇将要具体介绍从启动到startActivity时生命周期变化的过程。 从上篇知道执行了ApplicationThread中scheduleLaunchActivity,...
2018-07-31 11:00:47 1879
原创 Android 程序在系统中如何完成启动
一段程序的调用都有它的程序入口,众所周知Java程序的入口在main方法。作为Android来说应用程序的启动是通过 ActivityThread 类 来执行的。系统中对于该类的介绍如下:该类是管理应用程序进程中主线程的执行,调度和执行活动,广播以及活动管理者请求的其他操作。当我打开App时,首先调用的是这个类中的main方法,也就是说这里控制着程序的启动。ActivityThread...
2018-07-24 09:57:01 781
原创 Fragment启动过程,从getFragmentManager开始
概述时至今日,Fragment已经成为Android开发中应用最广泛的方案了,几乎每一个APP都离不开它的影子。为了更深入的理解其中原理,我们从Fragment中源码开始分析。这里我们选择V4包中的Fragment来进行分析。
2017-12-27 17:38:21 1927
原创 关于Android混淆文件统一管理
概述对于学习Android开发的我们都知道,在发布生产包时需要对项目开启混淆,这样可以避免项目代码暴露在别人面前。而Android Studio在build.gradle文件配置上也非常贴心的提供了开启代码混淆的方式,开发者只要按照官方建议进行配置即可。
2017-11-17 09:15:23 890
原创 LinkedList源码解析(jdk1.8)
概述LinkedList实现了List接口,底层是基于双向链表的结构实现的。相对于ArrayList的数组结构,它在执行插入和删除操作时要比ArrayList更加高效,但是它的随机访问查找要比ArrayList逊色。
2017-09-21 10:09:46 388
原创 Vector源码解析(jdk1.8)
概述Vector实现了List的接口,底层同样是基于数组实现的,可以存储null。功能结构与ArrayList的类似,不同的是线程安全的。
2017-09-19 09:12:47 706
原创 RxJava2.0中flatMap操作符用法和源码分析(五)
flatMap基本使用flatMap是变换操作符,使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这个函数返回一个本身也发射数据的Observable,然后flatMap合并这些Observable发射的数据,最后将合并后的结果当作它自己的数据序列发射。注意:flatMap对这些Observable发射的数据做的是合并(merge)操作,因此它们可能是交错的。
2017-09-07 16:03:13 5403 2
原创 RxJava2.0中map操作符用法和源码分析(四)
map基本使用map是变换操作符,对原始Observable发射的每一项数据应用一个你选择的函数生成新的结果,然后返回一个发射这些结果Observable。
2017-09-04 09:07:48 1902
转载 (转)Android Support兼容包详解
背景来自于知乎上邀请回答的一个问题Android中AppCompat和Holo的一个问题?, 看来很多人还是对这些兼容包搞不清楚,那么干脆写篇博客吧. Support Library我们都知道Android一些SDK比较分裂,为此google官方提供了Android
2017-09-01 09:56:52 361
原创 RxJava2.0中fromArray操作符用法和源码分析(三)
fromArray基本使用fromArray用来创建一个Observable对象,可以将一个数组转化为可被观察的序列并且将它的数据逐个发射。 fromArray与just相似,都可以用来发射单个或一组数据,但是区别是当fromArray发射一组数据到观察序列中来时,它会先进行遍历,然后再逐个发射。而just发射一组数据时,会把它当成一个整体,一次性发射。
2017-08-23 08:31:56 8610
原创 RxJava2.0中just操作符用法和源码分析(二)
just基本使用just是用来创建一个Observable来发射指定值,可以将任何对象转化为一个用来被发射的ObservableSource数据。这个方法与fromArray相似,除了from会将数组或者Iterable中的元素逐个取出然后在逐个依次发射,而just会直接将数组或者Iterable对象作为单个数据来发射。
2017-08-22 08:48:41 5294
原创 RxJava2.0中create操作符用法和源码分析
create基本使用create是用来从头开始创建一个Observable的对象,应该调用ObservableEmitter的onNext, onError 和onComplete方法
2017-08-21 08:28:26 735
原创 AsyncTask源码解析
概述我们知道在Android应用开始程序运行时,系统会为应用启动一个单独的进程。默认情况下,该应用中的所有组件都会运行在相同的进程和主线程中。一个Android程序默认只有一个进程,但是你可以在清单文件中通过android:process 属性设置多进程。在同一个进程中,可以拥有多个线程。在这些线程中,可以分为两种:主线程(Main Thread/UI Thread)和工作线程(Worker Thr
2017-08-14 11:02:44 227
原创 深入理解 Android 之 View 的绘制流程(五)_invalidate,postInvalidate和requestLayout
上几篇文章里,我们分别介绍了View的三大工作流Measure,layout,draw。在分析源码的过程中我们会发现View的绘制流程还会受到其他方法的影响。比如:requestLayout,invalidate,postInvalidate。下面我们来分别解析下这三个方法的不同调用。
2017-07-26 08:54:16 938
原创 深入理解 Android 之 View 的绘制流程(四)_Draw
前面我们介绍了Measure和layout,下面我们就开始分析Draw。先从ViewRootImpl中开始。
2017-07-25 08:45:20 643
原创 深入理解 Android 之 View 的绘制流程(三)_Layout
上篇介绍了ViewRootImpl调用View的测量操作,下面就开始介绍ViewRootImpl中的布局操作了。
2017-07-20 16:01:07 310
原创 深入理解 Android 之 View 的绘制流程(二)_Measure
上一篇中介绍了将xml布局文件加载到Activity中之后,对View进行开始绘制之前的一些操作进行了说明。知道了View的绘制主要是由ViewRoot负责执行,并且对执行的核心方法进行了图示说明,如下:
2017-07-20 09:32:15 636
原创 深入理解 Android 之 View 的绘制流程(一)
上一篇中我们介绍了通过setContentView方法将xml布局文件加载到Activity中,知道了在PhoneWindow中的setContentView方法里,有分别调用了installDecor方法,mLayoutInflater.inflate(layoutResID, mContentParent),才使得布局能够显示出来,那么现在我们就要介绍xml的布局中的view是如何被绘制出来的。
2017-07-14 18:42:15 525
原创 源码分析setContentView加载布局文件的过程
我们都知道通过setContentView方法将xml布局文件加载到Activity中,然后屏幕才能显示出xml中定义的view。在整个过程中,无须做太多的操作,屏幕就能显示出正常的内容。现在我们从源码的角度来看看系统到底帮我们处理了哪些操作。
2017-07-12 09:13:50 556
原创 再一次撸Handler、Looper、Message源码
从事Android开发的人,一定对Handler非常熟悉。Handler是一套消息处理机制,允许你发送,处理消息来实现线程间的通讯。每个Handler实例与一个线程和该线程的消息队列关联。当你创建一个Handler时,它会绑定到创建它的线程的消息队列上。将传递的消息加入到这个消息队列中,通过轮询取出消息,然后Handler可以接收并处理出队的消息。Handler发送消息通过 post、postAtT
2017-07-05 09:45:01 1729
原创 Android中Service和Thread区别
在工作中,有时会被人问到,Android中的Service和Thread有什么区别,为什么有时放着方便的Thread不用,而去使用Service呢? 首先,要说明的是,进程是系统中最小的资源分配单位,而线程是最小的执行单位,线程需要的资源通过它所在的进程获取。
2017-03-21 10:46:36 447
原创 Android 开源框架Glide应用(二)_占位&动画&Gif
在APP显示图片时,拥有一个良好的体验是非常重要的,即图片不会突兀的出现,同样在出错时,需要有明显的提示,对于这些Glide都提供了接口,帮你去提升APP的体验。
2017-03-20 11:28:47 2297
转载 Android获取窗口可视区域大小: getWindowVisibleDisplayFrame()
getWindowVisibleDisplayFrame()方法getWindowVisibleDisplayFrame()是View类下的一个方法,从方法的名字就可以看出,它是用来获取当前窗口可视区域大小的。
2017-03-14 09:21:52 816
原创 仿微信可折叠效果的TextView
在微信朋友圈中,发送大量的文本信息时,在展示的时候微信会将该文本信息进行折叠处理,出现“全文”,“收起”的操作提示。当点击全文时,才能看到全部的文本信息,正好最近的项目中也提出了类似的需求,这里就对该自定义View的实现的方法进行了整理。
2017-03-08 14:37:32 1631 1
原创 Fragment的填坑之旅
前言目前主流的应用中,多是采用单Actvity多Fragment的方式实现的。随着应用功能越来越多,界面越来越复杂,我们会利用Fragment对Activity的界面进行模块化编程。Fragment有着种种优点吸引着我们,如比Activity有着更好的性能,能够轻量切换,开销比Activity小等等。
2017-03-02 16:26:02 744
原创 当FragmentTransaction在add和replace时,它们之间的区别
前言我们在使用FragmentTransaction的时候,经常会遇到add,replace这两个方法。
2017-02-26 16:11:27 9719 3
原创 Android 开源框架Glide应用(一)
前言介绍谷歌在2014开发者论坛上,为我们介绍了一个名叫Glide的图片加载库,这个库被广泛的运用在Google的开源项目中。 Glide是Android中的一个快速和高效的开源媒体管理,图片加载框架。它封装了媒体解码,内存和磁盘缓存,将资源池变成一个简单一用的界面。支持获取解码,显示视频,图片,和Gif动画。Glide提供了一个灵活的API,允许开发人员自定义使用任何网络框架。默认情况下,使用一
2017-02-24 14:15:56 510
原创 判断Android app退后台、进前台
在某些特定的场景下,我们需要判断App是否进入后台运行状态。然后根据App处在前台/后台分别进行不同的操作行为。我们可以通过Activity的生命周期来,实现这一需求。
2017-02-22 10:01:13 1264
原创 Android 应用启动时优化白屏问题
默认情况下 App在启动的时候,屏幕会出现一段时间的白屏,不同的设备可能白屏显示的时间长短不同,显然影响用户体验,我们只要设置第一个页面的主题,便可以消除这个问题。
2017-02-21 11:27:07 9740 4
原创 Gradle for Android应用
概述我们都已经知道Gradle是基于JVM的一种构建工具。它是基于Groovy语言的声明式构建,还支持java,C,C++等项目。我们在进行Android开发时,需要在Android Studio中对build.gradle文件进行配置。
2017-01-18 17:38:20 404
原创 ImageView的圆角或圆形使用原生support v4中的RoundedBitmapDrawable实现
前言之前曾使用Xfermode和BitmapShader实现了ImageView的圆角/圆形的效果。后来无意中在support v4包中,发现了一个类:RoundedBitmapDrawable。原来Google已经提供了直接实现图片的圆角,根本不需要使用第三方的类库,可以直接使用ImageView控件,重要的是还能和各种图片加载库配合使用。
2017-01-05 21:32:43 3664
原创 ImageView 绘制圆角效果_BitmapShader
前言之前我们已经提到过,我们可以使用两种方式来实现圆角图片的效果。一种是使用Xfermode,另一种是BitmapShader来实现。下面我将介绍BitmapShader用法。
2017-01-04 11:23:38 449
原创 ImageView 绘制圆角效果_Xfermode
前言Android 开发中,我们经常需要实现图片的圆形/圆角的效果,我们可以使用两种方式来实现这样的效果。一种是使用Xfermode,另一种是BitmapShader来实现。下面我将分别介绍这两种用法。使用Xfermode的方式实现 使用该方式的关键代码
2017-01-02 12:28:49 730
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人