<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[海纳百川Android的博客]]></title><description><![CDATA[一个Android程序员的经验分享]]></description><link>https://blog.youkuaiyun.com/baidu_27196493</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; baidu_27196493]]></copyright><item><title><![CDATA[源码解析ViewGroup的onDraw为什么不一定会调用]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/119147688</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/119147688</guid><author>baidu_27196493</author><pubDate>Wed, 28 Jul 2021 14:17:44 +0800</pubDate><description><![CDATA[网上有不少文章都说自定义ViewGroup的时候，如果需要自定义绘图，不能重写onDraw方法，而是要重写dispatch方法，因为ViewGroup绘制的时候不一定走onDraw方法，但是dispatchDraw方法是一定会走的。至于何时会走onDraw，何时不会走onDraw，有人说当ViewGroup设置背景的时候，会走onDraw方法，而没有背景的时候，不会走onDraw方法，这个说法也是有道理。

切到本文的问题，为什么ViewGroup会不一定走onDraw方法呢，而非容器类的View为什么都会]]></description><category></category></item><item><title><![CDATA[Android 源码解析measure机制-深入浅出]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/116702087</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/116702087</guid><author>baidu_27196493</author><pubDate>Wed, 12 May 2021 12:04:27 +0800</pubDate><description><![CDATA[Android 源码解析measure机制-深入浅出

1、ViewRootImpl.performTraversals方法

ViewRootImpl是最顶层控制一个Activity的UI显示的类，在View和WindowManager之间起一个中间管理的角色。该类的performTraversals方法里面会调用performMeasure、performLayout、performDraw三个方法，继而调用根布局DecorView的mersure、layout、draw方法，DecorView又会调用]]></description><category></category></item><item><title><![CDATA[Only fullscreen opaque activities can request orientation]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/116207171</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/116207171</guid><author>baidu_27196493</author><pubDate>Tue, 27 Apr 2021 19:21:06 +0800</pubDate><description><![CDATA[Only fullscreen opaque activities can request orientation

这个问题发生的必须同时满足三个条件：

（1）你的Activity是透明的或者悬浮在另一个Activity上；

（2）透明Activity限定了横竖屏方向，如下


android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"

（3）t]]></description><category></category></item><item><title><![CDATA[C4.5算法详解]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/115301995</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/115301995</guid><author>baidu_27196493</author><pubDate>Mon, 29 Mar 2021 15:14:48 +0800</pubDate><description><![CDATA[首先，C4.5是决策树算法的一种。决策树算法作为一种分类算法，目标就是将具有p维特征的n个样本分到c个类别中去。相当于做一个投影，c=f(n)，将样本经过一种变换赋予一种类别标签。决策树为了达到这一目的，可以把分类的过程表示成一棵树，每次通过选择一个特征pi来进行分叉。

那么怎样选择分叉的特征呢？每一次分叉选择哪个特征对样本进行划分可以最快最准确的对样本分类呢？不同的决策树算法有着不同的特征选择方案。ID3用信息增益，C4.5用信息增益率，CART用gini系数。

下面主要针对C4.5算法，我们用一个例]]></description><category></category></item><item><title><![CDATA[Android EditText禁止输入emoji表情的一种方法]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/115214760</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/115214760</guid><author>baidu_27196493</author><pubDate>Thu, 25 Mar 2021 18:25:33 +0800</pubDate><description><![CDATA[在安卓app开发中，会遇到EditText禁止输入emoji表情的需求，方法很简单，只需要给EditText添加一个InputFilter就行了，如下面代码：


public class EmojiInputFilter implements InputFilter {
        protected Pattern emoji = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27]]></description><category></category></item><item><title><![CDATA[Android ConstraintLayout属性简介（一、基础篇）]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/110489311</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/110489311</guid><author>baidu_27196493</author><pubDate>Wed, 02 Dec 2020 20:47:55 +0800</pubDate><description><![CDATA[Android ConstraintLayout属性简介（一）

本篇文章介绍ConstraintLayout下面几个最基本的属性：

layout_constraintLeft_toLeftOf
layout_constraintLeft_toRightOf
layout_constraintRight_toLeftOf
layout_constraintRight_toRightOf
layout_constraintTop_toTopOf
layout_constraintTop_toBottomOf]]></description><category></category></item><item><title><![CDATA[Program type already present: com.***.***.classA“的解决经验]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/109810535</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/109810535</guid><author>baidu_27196493</author><pubDate>Thu, 19 Nov 2020 15:11:40 +0800</pubDate><description><![CDATA[AGPBI: {"kind":"error","text":"Program type already present: com.***.***.classA","sources":[{}],"tool":"D8"}的解决经验

Android Studio在整合框架，导入第三方库的时候，会遇见各种各样的编译报错问题，根据我个人的经验，主要错误的原因是因为重复导入依赖包导致的，重复的可以是资源，也可以是类。重复导入报错的一般提示就是如本文标题中所写的“Program type already present]]></description><category></category></item><item><title><![CDATA[java如何动态获取泛型参数的类型]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/109180338</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/109180338</guid><author>baidu_27196493</author><pubDate>Tue, 20 Oct 2020 18:59:35 +0800</pubDate><description><![CDATA[Java如何动态获取泛型参数的类型

我们都知道java中的泛型其实是伪泛型，java在编译阶段会对变异类型进行擦除，擦出到泛型类的最小上限，编译后得到的class文件里面是没有任何泛型信息的，泛型的控制其实就是java编译器进行的控制，编译阶段进行泛型检查。那如果我们想在运行时知道泛型类的类型，如何做到呢？主要用到下面几个api：

1、public Type getGenericSuperclass()---Class类的方法

2、Type[] getActualTypeArguments()---P]]></description><category></category></item><item><title><![CDATA[android View的background何时加载的]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/108194434</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/108194434</guid><author>baidu_27196493</author><pubDate>Mon, 24 Aug 2020 10:44:18 +0800</pubDate><description><![CDATA[android View的background何时加载的

作为安卓开发者的我们，经常为view设置背景，而且大部分时候是在xml里面通过view的android:background属性进行设置的，或设置成一张图片，或设置成纯颜色。

然后呢，我们也知道view的绘制流程要经过三大步：onMeasure，这是测量view的大小的；onLayout，这是确定view的位置的；onDraw，这是具体绘制view的。那么，这里抛出一个问题：backgound应该也属于view的具体呈现，是否是在onDraw里面]]></description><category></category></item><item><title><![CDATA[android studio download maven-metadata.xml卡住问题]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/107752261</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/107752261</guid><author>baidu_27196493</author><pubDate>Sun, 02 Aug 2020 22:07:57 +0800</pubDate><description><![CDATA[android studio download maven-metadata.xml卡住问题

我的android studio版本已经升级到4.0.1了，Gradle插件版本，即com.android.tools.build:gradle后面跟着的版本，也是4.0.1，对应的gradle版本已经是6.1.1了，即使用的是gradle-6.1.1-all.zip。最近经常遇见更新代码后第一次编译dowlnad maven-metadata.xml文件卡住半天，最后还是sync fail的问题，最后的解决方法]]></description><category></category></item><item><title><![CDATA[java.lang.SecurityException: Not allowed to change Do Not Disturb state]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/106082018</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/106082018</guid><author>baidu_27196493</author><pubDate>Sat, 16 May 2020 22:34:44 +0800</pubDate><description><![CDATA[Not allowed to change Do Not Disturb state
    at android.os.Parcel.readException(Parcel.java:2013)
    at android.os.Parcel.readException(Parcel.java:1959)
    at android.media.IAudioService$Stub$Proxy.setStreamVolume(IAudioService.java:943)
...]]></description><category></category></item><item><title><![CDATA[判断链表中是否存在环的方法及证明]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/105720197</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/105720197</guid><author>baidu_27196493</author><pubDate>Fri, 24 Apr 2020 15:14:32 +0800</pubDate><description><![CDATA[一、判断链表中是否存在环的方法及证明

首先说明一点就是如果链中存在环，可能整个链是一个环，也可能是该链表的后面一部分形成了环。如何判断链表中是否存在环，经典的判断方法就是利用两个指向链表头节点的指针，同时移动，两个指针每次移动的节点数是不一样的，如果存在环，那么这两个指针随着移动次数的增加，肯定会某个节点相遇，否则移动快的指针会到率先达链表末尾，即不存在环。

有没有同学会疑惑：如果存在环，这两...]]></description><category></category></item><item><title><![CDATA[Andorid Parcelable序列化遇见List、数组、Map如何处理]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/103539551</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/103539551</guid><author>baidu_27196493</author><pubDate>Sun, 15 Dec 2019 23:27:08 +0800</pubDate><description><![CDATA[Andorid Parcelable序列化遇见List、数组、Map如何处理

安卓开发中，如果遇见需要序列化的场景，我们一般都会把我们的Bean类实现Parcelable接口，如下：


import android.os.Parcel;
import android.os.Parcelable;

public class Test implements Parcelable {
    pr...]]></description><category></category></item><item><title><![CDATA[SparseArray源码解读]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/103217496</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/103217496</guid><author>baidu_27196493</author><pubDate>Sun, 24 Nov 2019 17:34:54 +0800</pubDate><description><![CDATA[SparseArray源码解读

google推荐使用SparseArray来代替HashMap，可见SparseArray应该有其优点，至于是什么优点，我们先来看看源码，就比较清楚了。

一、构造方法

SparseArray有两个构造方法，一个无参构造方法和一个有参构造方法，无参构造方法本质上还是调用了有参构造方法。


public SparseArray() {
        this(...]]></description><category></category></item><item><title><![CDATA[Android使用https]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/101529608</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/101529608</guid><author>baidu_27196493</author><pubDate>Fri, 27 Sep 2019 13:37:53 +0800</pubDate><description><![CDATA[HTTP协议被用于在Web浏览器和网站服务器之间传递信息，HTTP协议以明文方式发送内容，不提供任何方式的数据加密，如果攻击者截取了Web浏览器和网站服务器之间的传输报文，就可以直接读懂其中的信息，因此，HTTP协议不适合传输一些敏感信息，比如：信用卡号、密码等支付信息。

为了解决HTTP协议的这一缺陷，需要使用另一种协议：安全套接字层超文本传输协议HTTPS，为了数据传输的安全，HTTPS在H...]]></description><category></category></item><item><title><![CDATA[解决default activity not found办法大全]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/100008417</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/100008417</guid><author>baidu_27196493</author><pubDate>Mon, 26 Aug 2019 14:08:37 +0800</pubDate><description><![CDATA[最近在项目中遇到一个问题，就是以前用android studio能正常打开的工程，今天突然报default activity not found错误，该错误导致app那块显示一个红叉，无法直接launch app，可以build工程产生apk文件，但是不能用studio直接launch app，这样对开发来讲还是很不方便的。正常情况下如下图



遇见该错误的时候如下图



进到Edit Con...]]></description><category></category></item><item><title><![CDATA[Java 数学三角函数正弦、余弦、正切以及反正弦、反余弦、反正切函数的使用]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/96159104</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/96159104</guid><author>baidu_27196493</author><pubDate>Tue, 16 Jul 2019 17:47:18 +0800</pubDate><description><![CDATA[Java 数学三角函数正弦、余弦、正切以及反正弦、反余弦、反正切函数的使用

Java中数据三角函数在Math类里面有封装好的对应方法，正弦函数是sin方法，余弦函数是cos方法，正切函数是tan方法，反正弦函数是asin方法，反余弦函数是acos方法，反正切函数是atan方法。（注意，Math类里面并没有提供余切及反余切函数，但是可以利用现有的函数计算出来）

下面是这些方法的代码举例及运行结果...]]></description><category></category></item><item><title><![CDATA[Java深拷贝和浅拷贝]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/95372688</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/95372688</guid><author>baidu_27196493</author><pubDate>Wed, 10 Jul 2019 19:57:58 +0800</pubDate><description><![CDATA[Java浅拷贝和深拷贝



一看就懂的，java深拷贝浅拷贝



将一个对象的引用复制给另外一个对象，一共有三种方式。第一种方式是直接赋值，第二种方式是浅拷贝，第三种是深拷贝。所以大家知道了哈，这三种概念实际上都是为了拷贝对象啊。



1、直接赋值

好，下面我们先看第一种方式，直接赋值。在Java中，A a1 = a2，我们需要理解的是这实际上复制的是引用，也就是说a1和a2指向的是...]]></description><category></category></item><item><title><![CDATA[adb shell查看进程方法]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/89359283</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/89359283</guid><author>baidu_27196493</author><pubDate>Wed, 17 Apr 2019 17:10:18 +0800</pubDate><description><![CDATA[adb shell查看进程方法

android开发过程中，有时候我们需要知道某个应用的进程号，下面介绍两种方法，都是要用到adb shell命令。

第一种：adb shell ps

该命令比较简单粗暴，会列出手机中的所有进程的信息，如下图所示：



我们只要在NAME那一列找到我们的app的包名了就可以了，PID就是进程号，不过面对这么多进程，很多人脑子估计一下子就懵了，特别当看了一天代码...]]></description><category></category></item><item><title><![CDATA[android NSD service使用介绍]]></title><link>https://blog.youkuaiyun.com/baidu_27196493/article/details/89222142</link><guid>https://blog.youkuaiyun.com/baidu_27196493/article/details/89222142</guid><author>baidu_27196493</author><pubDate>Sun, 14 Apr 2019 13:43:22 +0800</pubDate><description><![CDATA[android NSD service使用介绍

最近项目中要实现局域网设备发现，接触到了MDNS协议，什么是MDNS协议呢，下面摘抄自百度百科。

mDNS即组播DNS（multicast DNS）。使用5353端口，在内网没有DNS服务器时，就会出现此组播信息。

在一个没有常规DNS服务器的小型网络内，可以使用mDNS来实现类似DNS的编程接口、包格式和操作语义。

组播DNS是IETF零配...]]></description><category></category></item></channel></rss>