<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Gdeer 的专栏]]></title><description><![CDATA[关注为什么]]></description><link>https://blog.youkuaiyun.com/Gdeer</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Gdeer]]></copyright><item><title><![CDATA[详解 View 的构造函数]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/109017479</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/109017479</guid><author>Gdeer</author><pubDate>Mon, 12 Oct 2020 10:31:39 +0800</pubDate><description><![CDATA[我们经常用到自定义 View，它有四个参数，但往往不太关心它们，等用到的时候就很容易混淆，今天来看看它们到底是什么意思。
View( 
   Context context, 
   @Nullable AttributeSet attrs, 
   int defStyleAttr, 
   int defStyleRes 
) 

AttributeSet attrs
从 xml 中提取的 Attribute 集合，通过 context.obtainStyledAttributes 生成的 TypedA]]></description><category></category></item><item><title><![CDATA[集成 Google 登录]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/106392716</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/106392716</guid><author>Gdeer</author><pubDate>Wed, 27 May 2020 23:03:25 +0800</pubDate><description><![CDATA[官网：https://developers.google.com/identity/sign-in/android/start-integrating

基本按官网步骤进行，下面列举一些错误码。
错误码
code=7
NETWORK_ERROR，检查网络是否通畅（是否科学）
code=10
sha1 签名不对
如果已经设置过一遍，在设置的地方修改 sha1，最终的值不会改变，需要删除后重新添加才能生效。
在 consoler 中可以查看和删除生成的 key。
code=12500
A non-recove.]]></description><category></category></item><item><title><![CDATA[应用覆盖安装后桌面图标消失问题]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/105450142</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/105450142</guid><author>Gdeer</author><pubDate>Sat, 11 Apr 2020 12:14:19 +0800</pubDate><description><![CDATA[一、现象
当一个 app 有两个入口 Activity（标记了 main、launcher 的 Activity，如集成了 LeakCanary 的 app），安装后，桌面上会出现两个图标。
当在 androidManifest 中删除一个 activity 或将其 disable，再覆盖安装，桌面上的两个图标都会消失（有些机器会这样，如 mix2；在模拟器上只有被删除或者 disable 的那个...]]></description><category></category></item><item><title><![CDATA[Gradle 理解：incremental task]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/105340950</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/105340950</guid><author>Gdeer</author><pubDate>Mon, 06 Apr 2020 11:56:24 +0800</pubDate><description><![CDATA[基于 Gradle 5.3.1

文章目录一、概述1.1 incremental task 与 incremental task action1.2 判断标准二、执行实例2.1 IncrementalReverseTask 类2.2 IncrementalReverseTask 类型的 task2.3 第一次执行2.4 无改变第二次执行2.5 更新 input 后执行2.6 移除 input 后...]]></description><category></category></item><item><title><![CDATA[为什么 Dialog 不能用 Application 的 Context]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/105323123</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/105323123</guid><author>Gdeer</author><pubDate>Sun, 05 Apr 2020 10:44:10 +0800</pubDate><description><![CDATA[抛出的异常：
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.view.ViewRootImpl.setView(ViewRootImpl.java:685)
at android.view...]]></description><category></category></item><item><title><![CDATA[ConnectivityManager.CONNECTIVITY_ACTION 广播的粘性]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104844242</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104844242</guid><author>Gdeer</author><pubDate>Fri, 13 Mar 2020 16:44:15 +0800</pubDate><description><![CDATA[项目中在 Application 初始化的时候监听了 ConnectivityManager.CONNECTIVITY_ACTION （即网络状态变化）的广播。
结果每次 Application 初始化的时候都会收到这个广播，找了很久都没发现是哪里发的。
后来才发现，原来这个广播是一个粘性广播，在每次注册的时候都会直接收到当前网络状态的一个广播。

...]]></description><category></category></item><item><title><![CDATA[gitignore 的模式匹配]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104843929</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104843929</guid><author>Gdeer</author><pubDate>Fri, 13 Mar 2020 16:37:01 +0800</pubDate><description><![CDATA[gitignore pattern：

空白行、# 开始的行会被忽略
使用标准的 glob pattern 时，将会在整个文件树里递归匹配
可以在前面加上 / 来阻止递归，只匹配当前目录
可以在后面加上 / 来表明是一个目录（默认目录和文件都会匹配）
可以在签名加上 ! 来对一个 pattern 取反

glob pattern（和 shell 使用的简化的正则表达式很像）：

? 代表一个字符
...]]></description><category></category></item><item><title><![CDATA[Gradle 理解：configuration、dependency]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104815986</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104815986</guid><author>Gdeer</author><pubDate>Thu, 12 Mar 2020 22:23:23 +0800</pubDate><description><![CDATA[概念
什么是 dependencies 的 configuration？
不同的 configuration 用来引用不同领域（或不同用途）的 dependencies。
如：implementation、api、testRuntime。
也就是 configuration 用来管理一批 dependencies。
configuration 的继承与复合

...]]></description><category></category></item><item><title><![CDATA[Gradle 理解：Artifact]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104808635</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104808635</guid><author>Gdeer</author><pubDate>Wed, 11 Mar 2020 23:23:36 +0800</pubDate><description><![CDATA[文章目录一、概念ArtifactPublishArtifactConfigurablePublishArtifactartifact {}artifact {} 中内容二、使用2.1 使用 archives2.2 使用自定义 Configuration2.3 使用 maven 插件2.4 使用 maven-publish 插件
一、概念
Artifact
翻译为：构件、工件。
代表的是一个领域对象...]]></description><category></category></item><item><title><![CDATA[Java 中的锁：悲观锁、乐观锁、自旋锁、偏向锁、公平锁、可重入锁、独享锁...]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104650182</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104650182</guid><author>Gdeer</author><pubDate>Wed, 04 Mar 2020 11:44:26 +0800</pubDate><description><![CDATA[文章目录一、悲观锁、乐观锁二、自旋锁、适应性自旋锁三、偏向锁、轻量级锁、重量级锁四、公平锁、非公平锁五、可重入锁、不可重入锁六、独享锁、共享锁
一、悲观锁、乐观锁

这里的锁，是一种多线程同步操作资源的方式，即悲观方式与乐观方式。

悲观方式：

加锁，如：synchronized、ReentrantLock

乐观方式：

不加锁，如：concurrent 包的原子类

不加锁是如何保证多个线程...]]></description><category></category></item><item><title><![CDATA[MotionLayout 的使用]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104595602</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104595602</guid><author>Gdeer</author><pubDate>Sun, 01 Mar 2020 17:30:59 +0800</pubDate><description><![CDATA[文章目录一、概述二、设置项2.1 MotionScene 设置项2.1.1 基础项2.1.2 可配置属性2.2 MotionLayout 设置项
一、概述
MotionLayout 是 ConstraintLayout 的子类。
每个 MotionLayout 需引用一个 MotionScene，其中包含相应布局的所有运动描述。
MotionLayout：布局信息

MotionScene：运动描...]]></description><category></category></item><item><title><![CDATA[Java 获取泛型对象的参数类型]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104591155</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104591155</guid><author>Gdeer</author><pubDate>Sun, 01 Mar 2020 13:48:28 +0800</pubDate><description><![CDATA[文章目录一、类中有 class 信息二、父类中有 class 信息2.1 子类2.2 匿名子类三、持有者中有 class 信息
由于类型擦除，java 中的泛型对象在运行时是不知道自己类型参数的类型的。
但有几种特殊情况，能够获取泛型对象的参数类型：

1、类中有 class 信息（类中有一个 Class 字段）
2、父类中有 class 信息（父类是泛型类，并指定了参数类型）
3、持有者中有 c...]]></description><category></category></item><item><title><![CDATA[设计模式：工厂方法模式与抽象工厂模式]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104506275</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104506275</guid><author>Gdeer</author><pubDate>Tue, 25 Feb 2020 21:51:42 +0800</pubDate><description><![CDATA[文章目录一、定义1.1 工厂方法模式1.2 抽象工厂模式二、类图三、实例3.1 Retrofit（2.5.0）3.2 Okhttp3（3.12.0）3.3 Glide（4.9.0）
一、定义
1.1 工厂方法模式
工厂方法模式，又称工厂模式
着重于方法，一个工厂只有一个方法，生产一种产品。
（我称之为，单方法工厂模式）
abstract class BaseFactory {
    abstra...]]></description><category></category></item><item><title><![CDATA[Retrofit 源码解析]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104505720</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104505720</guid><author>Gdeer</author><pubDate>Tue, 25 Feb 2020 21:30:19 +0800</pubDate><description><![CDATA[文章目录一、名词解释二、使用三、原理四、问题
一、名词解释
Service：定义的接口类
ServiceMethod：Service 中的方法
Call&lt;R&gt;：参数类型是 R 的 Call，实际发起网络请求的类
responseType（R）：Call&lt;&gt; 的参数类型；如 Call&lt;AClass&gt; 的 responseType 为 AClass
CallAdap...]]></description><category></category></item><item><title><![CDATA[类图的图示和关系说明]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104450002</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104450002</guid><author>Gdeer</author><pubDate>Sat, 22 Feb 2020 20:42:43 +0800</pubDate><description><![CDATA[框中的符号
+ public
- private
# protected
~ default
_ static
斜体 抽象

图示
参考：维基百科类图、IBM 类图说明

关联、聚合、组合：可以带箭头，也可以不带监听
关系说明
参考：知乎、掘金
继承、实现很清晰，表示两个类的归属关系。
依赖、关联、聚合、组合的界限并不清晰，它们表示两个类的引用关系，关系强弱：依赖 &lt; 关联 &lt; 聚合 ...]]></description><category></category></item><item><title><![CDATA[ARouter 源码解析]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104431214</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104431214</guid><author>Gdeer</author><pubDate>Fri, 21 Feb 2020 17:23:51 +0800</pubDate><description><![CDATA[一、名词解释
Postcard：明信片，用于发起启动请求
path：指定一个请求的路径：如 /modulea/home
group：path 的分组，为 path 中的第一个节点：如 modulea
RouteMeta：存储基础路由数据（如 Activity 类对象等）
xxxService：接口，用于提供某种功能，继承了 IProvider 接口；如要使用，需自己实现接口
routes：path...]]></description><category></category></item><item><title><![CDATA[后台启动 Activity]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104377856</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104377856</guid><author>Gdeer</author><pubDate>Tue, 18 Feb 2020 20:01:09 +0800</pubDate><description><![CDATA[Android 21 及以上，可以通过 makeTaskLaunchBehind 来在后台启动一个 Activity。

执行代码：
val intent = Intent(this, ActivityA::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
val compat = ActivityOptionsCompa...]]></description><category></category></item><item><title><![CDATA[加载外部 apk 中的资源]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104377660</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104377660</guid><author>Gdeer</author><pubDate>Tue, 18 Feb 2020 16:38:15 +0800</pubDate><description><![CDATA[文章目录原理实例
原理
apk 中的资源放在 resources.arsc、assets 中，它们都要靠 AssetManager 来访问，我们又通过 Resources 来调用 AssetManager。

要访问外部 apk 中的资源，就要通过该 apk 的 resources.arsc，创建一个新的 AssetManager 和一个新的 Resources。
实例
下面的例子，会在宿主 ap...]]></description><category></category></item><item><title><![CDATA[启动没有在 AndroidManifest 中注册的 Activity]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/104288017</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/104288017</guid><author>Gdeer</author><pubDate>Wed, 12 Feb 2020 22:15:05 +0800</pubDate><description><![CDATA[文章目录一、报错二、思路三、启动流程3.1 hook 点的选择3.2 版本差异四、代码4.1 Hook4.2 替换点4.3 恢复点
一、报错
启动没有在 AndroidManifest 中注册的 Activity，会报错：
android.content.ActivityNotFoundException: Unable to find explicit activity class {...};...]]></description><category></category></item><item><title><![CDATA[ListView 嵌套 ListView，为什么里面的 ListView 不能滑动]]></title><link>https://blog.youkuaiyun.com/Gdeer/article/details/103732987</link><guid>https://blog.youkuaiyun.com/Gdeer/article/details/103732987</guid><author>Gdeer</author><pubDate>Fri, 27 Dec 2019 16:19:49 +0800</pubDate><description><![CDATA[ListView 嵌套 ListView，child 是不能滑动的，为什么呢？我们来看看。
文章目录一、源码分析二、结论2.1 不做处理的 ListView 嵌套 ListView2.2 重写父 ListView 的 onInterceptTouchEvent()，使其返回 false
一、源码分析
ListView 的滚动在 scrollIfNeeded() 方法中实现。
scrollIfNee...]]></description><category></category></item></channel></rss>