<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[四月葡萄的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/u011810352</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u011810352]]></copyright><item><title><![CDATA[提升开发效率之自定义Android Studio代码模板]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/95999150</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/95999150</guid><author>u011810352</author><pubDate>Tue, 16 Jul 2019 10:45:53 +0800</pubDate><description><![CDATA[1.前言
有时，我们会使用一些重复的模板代码，通常都是使用CV大法来完成。但是，这样的搬砖效率并不高，因此，我们需要使用高级搬砖技能–自定义代码模板。
我们使用Android Studio创建新工程时，可以选择不同的模板，然后Android Studio就会自动生成相应的代码模板了。如下图：

这实际上是Android Studio内置的一些默认模板。我们先来研究一下内置的代码模板，然后再实现自定...]]></description><category></category></item><item><title><![CDATA[提升开发效率之修改Android Studio默认的project和module模板]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/95999466</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/95999466</guid><author>u011810352</author><pubDate>Tue, 16 Jul 2019 10:45:02 +0800</pubDate><description><![CDATA[1.前言
每次使用Android Studio创建新的工程时，可能都需要手动去修改一些配置，有没有觉得很烦呢？下面教你如何修改Android Studio默认的project和module模板。整完这些之后，相信能够节省你三秒的时间喔~~
本文主要介绍以下几种配置，可以按需去修改：

1.移除单元测试
2.配置私有maven库
3.移除默认的V7库以及相关资源
4.修改默认的.gitignore模...]]></description><category></category></item><item><title><![CDATA[Android视图和布局优化实战演练]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/82754323</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/82754323</guid><author>u011810352</author><pubDate>Thu, 20 Sep 2018 09:30:02 +0800</pubDate><description><![CDATA[目录0.版权声明1.概述2.过度绘制(Overdraw)2.1 什么是过度绘制？2.2 如何检测过度绘制2.3 过度绘制优化2.3.1 移除布局中不需要的背景2.3.1.1 移除Window默认的Background2.3.1.2 移除控件中不需要的背景2.3.2 将layout层级扁平化2.3.2.1 使用Layout Inspector去查看layout的层次结构2.3.2.2 使用嵌套少的布...]]></description><category></category></item><item><title><![CDATA[Android内存泄露分析实战演练]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/82753816</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/82753816</guid><author>u011810352</author><pubDate>Tue, 18 Sep 2018 11:00:47 +0800</pubDate><description><![CDATA[目录@[TOC](目录)0.版权声明1.内存泄露简介1.1 什么是内存泄露1.2 内存泄露对APP性能的影响1.3 内存泄露产生原因分析1.4 常见的内存泄露点2.常见内存泄露例子及解决方案2.1 静态变量内存泄露单例模式造成的内存泄露2.2 非静态内部类（匿名类）内存泄露2.2.1 Handler内存泄露2.2.2 多线程引起的内存泄露2.3 集合类内存泄露2.4 未关闭资源对象内存泄露3. 常...]]></description><category></category></item><item><title><![CDATA[带你了解Android约束布局ConstraintLayout]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/82752934</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/82752934</guid><author>u011810352</author><pubDate>Tue, 18 Sep 2018 10:34:11 +0800</pubDate><description><![CDATA[目录1 ConstraintLayout简介2 引入ConstraintLayout3 相对位置4 尺寸约束5 宽高比6 百分比宽高7 位置偏向8 权重9 链10 Guideline辅助线11 小结
ConstraintLayout是Android新推出的一个布局，其性能更好，连官方的hello world都用ConstraintLayout来写了。所以极力推荐使用ConstraintLayout...]]></description><category></category></item><item><title><![CDATA[Android框架组件--LiveData的使用]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/81334339</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/81334339</guid><author>u011810352</author><pubDate>Wed, 01 Aug 2018 17:14:09 +0800</pubDate><description><![CDATA[1.前言

LiveData是Google推出的一系列的框架组件的其中一个，它是一个可以被观察的数据持有类，能够感知Activity、Fragment等组件的生命周期。

一个观察者去观察LiveData后，当观察者的生命周期处于STARTED或RESUMED状态时（即onStart()、onResume()、onPause()），LiveData的数据发生变化，则会通知观察者；若观察者处于其他状...]]></description><category></category></item><item><title><![CDATA[Android框架组件--Lifecycle的使用]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/81203095</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/81203095</guid><author>u011810352</author><pubDate>Wed, 25 Jul 2018 15:05:12 +0800</pubDate><description><![CDATA[1.前言

Lifecycle是Google推出的一系列的框架组件的其中一个，主要是用来感知Activity和Fragment的生命周期。

本文主要介绍如何使用Lifecycle。

2.一个常见的开发例子



public class TestActivity extends Activity{
    @Override
    protected void onCreate(@Nulla...]]></description><category></category></item><item><title><![CDATA[使用Retrofit下载文件并实现进度监听]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/81134654</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/81134654</guid><author>u011810352</author><pubDate>Fri, 20 Jul 2018 16:31:45 +0800</pubDate><description><![CDATA[1.前言

最近要做一个带进度条下载文件的功能，网上看了一圈，发现好多都是基于OkHttpClient添加拦截器来实现的，个人觉得略显复杂，所以还是采用最简单的方法来实现：基于文件写入来进行进度的监听。

2.实现步骤



2.1 设计监听接口

根据需求设计一下接口：



public interface DownloadListener {
    void onStart();//下载开...]]></description><category></category></item><item><title><![CDATA[ThreadLocal源码剖析]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/80975092</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/80975092</guid><author>u011810352</author><pubDate>Tue, 10 Jul 2018 09:54:16 +0800</pubDate><description><![CDATA[1.ThreadLocal概述

本文源码基于android 27。



1.1 简介

ThreadLocal提供了线程内的局部变量，这个局部变量是只存在于当前线程的。同时，它是独立于其他线程，即其他线程无法访问。这样就不会存在线程安全的问题了。



1.2 常用方法



    public void set(T value) //设置当前线程中变量的副本
    public T ge...]]></description><category></category></item><item><title><![CDATA[Android消息机制分析：Handler、Looper、MessageQueue源码分析]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/80924885</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/80924885</guid><author>u011810352</author><pubDate>Thu, 05 Jul 2018 12:00:54 +0800</pubDate><description><![CDATA[1.前言

关于Handler消息机制的博客实际上是非常多的了。 
之前也是看别人的博客过来的，但是过了一段时间之后，一些细节也就忘了。 
所以，就自己撸一篇，权当笔记，方便以后翻阅。

这篇文章主要是分析Handler消息机制原理以及收集一些面试题来讲解，熟悉的话可以不用看了。

本文源码基于android 27。



2.Android消息机制概述



2.1 本质

Android的消息...]]></description><category></category></item><item><title><![CDATA[BroadcastReceiver广播的注册、发送和接收过程分析]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/79642122</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/79642122</guid><author>u011810352</author><pubDate>Tue, 03 Jul 2018 10:20:26 +0800</pubDate><description><![CDATA[1. 简介

广播作为Android的四大组件之一，能够实现组件之间的通信。广播过程主要就是注册、发送和接收过程。广播使用了设计模式中的观察者模式：基于消息的发布 / 订阅事件模型，消息的生产者发布事件，而使用者订阅感兴趣的事件。因此，广播能够实现组件间的松耦合，即广播的发送者和接收者事先是可以不用知道对方存在的。接下来，我们来研究一下广播的注册、发送和接收过程的源码。

本文源码基于androi]]></description><category></category></item><item><title><![CDATA[RxJava的消息订阅和线程切换原理]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/80518426</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/80518426</guid><author>u011810352</author><pubDate>Wed, 13 Jun 2018 09:49:10 +0800</pubDate><description><![CDATA[0.版权声明

1.前言

本文主要是对RxJava的消息订阅和线程切换进行源码分析，相关的使用方式等不作详细介绍。

本文源码基于rxjava:2.1.14。



2. RxJava简介...]]></description><category></category></item><item><title><![CDATA[Android 刘海屏适配全攻略]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/80587531</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/80587531</guid><author>u011810352</author><pubDate>Fri, 08 Jun 2018 10:04:50 +0800</pubDate><description><![CDATA[Android 刘海屏适配全攻略

0.版权声明

本文由玉刚说写作平台提供写作赞助，版权归玉刚说微信公众号所有 
原作者：四月葡萄 
版权声明：未经玉刚说许可，不得以任何形式转载



1.前言

先吐槽一下，刘海屏真丑。然而作为苦逼的开发者，还是要去适配刘海屏的。好了，吐槽完毕，进入正题。 
 
这里主要是介绍一下Android P中刘海屏的适配以及Android P之前的适配。为什么要分开呢...]]></description><category></category></item><item><title><![CDATA[从一个class文件深入理解Java字节码结构]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/80316870</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/80316870</guid><author>u011810352</author><pubDate>Tue, 15 May 2018 10:01:56 +0800</pubDate><description><![CDATA[前言

我们都知道，Java程序最终是转换成class文件执行在虚拟机上的，那么class文件是个怎样的结构，虚拟机又是如何处理去执行class文件里面的内容呢，这篇文章带你深入理解Java字节码中的结构。



1.Demo源码

首先，编写一个简单的Java源码：



package com.april.test;

public class Demo {
    private int n...]]></description><category></category></item><item><title><![CDATA[自定义View实践篇（2）- 自定义ViewGroup]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/79486938</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/79486938</guid><author>u011810352</author><pubDate>Mon, 19 Mar 2018 19:21:14 +0800</pubDate><description><![CDATA[1. 简介

上一章：自定义View实践篇（1）- 自定义单一View 
我们实现了自定义单一View，这章我们来看下自定义ViewGroup。



2. 自定义ViewGroup

自定义ViewGroup同样分为两类，一类是继承系统已有的ViewGroup(如：LinearLayout)，另一类是直接继承ViewGroup类，我们分开来看下。



2.1 继承系统已有ViewGroup]]></description><category></category></item><item><title><![CDATA[自定义View实践篇（1）- 自定义单一View]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/79486432</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/79486432</guid><author>u011810352</author><pubDate>Tue, 13 Mar 2018 18:27:54 +0800</pubDate><description><![CDATA[1. 简介

前面分析了一大堆原理： 
自定义View原理篇（1）- measure过程 
自定义View原理篇（2）- layout过程 
自定义View原理篇（3）-  draw过程 
现在来看看是如何实现自定义View：



2.自定义View的分类

自定义View可以分为两大类，一种是自定义单一View，另一种是自定义ViewGroup。具体如下图所示：




  类型
  实现
 ...]]></description><category></category></item><item><title><![CDATA[自定义View原理篇（3）- draw过程]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/79389643</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/79389643</guid><author>u011810352</author><pubDate>Fri, 09 Mar 2018 23:15:42 +0800</pubDate><description><![CDATA[1. 简介


View的绘制过程分为三部分：measure、layout、draw。


  measure用来测量View的宽和高。 
  layout用来计算View的位置。 
  draw用来绘制View。

measure过程可以查看这篇文章：XXX。
layout过程可以查看这篇文章：XXX。
本章主要对draw过程进行详细的分析。
本文源码基于android 27。




2. D...]]></description><category></category></item><item><title><![CDATA[自定义View原理篇（2）-  layout过程]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/79385937</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/79385937</guid><author>u011810352</author><pubDate>Fri, 09 Mar 2018 11:05:09 +0800</pubDate><description><![CDATA[1. 简介


View的绘制过程分为三部分：measure、layout、draw。


  measure用来测量View的宽和高。 
  layout用来计算View的位置。 
  draw用来绘制View。

本章主要对layout过程进行详细的分析。
本文源码基于android 27。




2. Layout的始点

跟measure一样,layout也是始于ViewRootImpl]]></description><category></category></item><item><title><![CDATA[自定义View原理篇（1）-Measure过程]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/79380439</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/79380439</guid><author>u011810352</author><pubDate>Thu, 08 Mar 2018 14:53:28 +0800</pubDate><description><![CDATA[1. 简介


View的绘制过程分为三部分：measure、layout、draw。


  measure用来测量View的宽和高。 
  layout用来计算View的位置。 
  draw用来绘制View。

本章主要对measure过程进行详细的分析。
本文源码基于android 27。


2. measure的始点

measure是从ViewRootImpl的performTrav...]]></description><category></category></item><item><title><![CDATA[ViewRootImpl介绍]]></title><link>https://blog.youkuaiyun.com/u011810352/article/details/79380243</link><guid>https://blog.youkuaiyun.com/u011810352/article/details/79380243</guid><author>u011810352</author><pubDate>Tue, 27 Feb 2018 11:16:24 +0800</pubDate><description><![CDATA[1. 简介

从上一篇文章:从setContentView揭开DecorView 中可以看到，Activity是怎么将我们的布局加载到DecorView，但是这时还不是可见的，因为这时布局还没有绘制。那么它是怎么绘制的，我们来研究一下。

本文源码基于android 27



2. 源码分析

虽然DecorView已经被创建出来了，但是目前DecorView跟PhoneWindow是没有任何关]]></description><category></category></item></channel></rss>