<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[mrkyee的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/mrkyee</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; mrkyee]]></copyright><item><title><![CDATA[gradle 你是否想过task hello为什么不会报错？]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/121017517</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/121017517</guid><author>mrkyee</author><pubDate>Thu, 28 Oct 2021 16:33:59 +0800</pubDate><description><![CDATA[先来看一段代码，这是一个最简单常见的task
task hello{
	doLast{
		println'hello world!'
	}
}

hello是什么？它也不是String，之前也没有任何地方定义过hello。为什么不会报错？
书上《Android gradle权威指南》其中3.4中对于gradle task的说法错误有些多。

（a）task是Project类的create方法。
首先Project类中没有叫做create的方法，task是Project类中task方法的。只有在TaskCo]]></description><category></category></item><item><title><![CDATA[GC回收机制]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119183670</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119183670</guid><author>mrkyee</author><pubDate>Thu, 29 Jul 2021 01:21:29 +0800</pubDate><description><![CDATA[GC回收



首先gc回收的对象是堆区和方法区的垃圾对象，栈内的垃圾不在gc回收的范围内

如何判断是否是垃圾

引用计数法

•

为每个对象创建一个计数器，每被引用一次，计数器就+1；没被释放一次，就-1。直到 计数器等于0时，才标志为垃圾。

缺点是无法避免循环引用的问题。即A引用B，B引用A，此时A、B永远无法被回收。

可达性分析

•

不能通过引用链连接到gc root的对象，都可以标记为垃圾对象。gc root有四种虚拟机 栈，本地方法栈引用的对象，方法区中静态属性引用的对象，常量引用的对]]></description><category></category></item><item><title><![CDATA[binderService如何实现acitivity和service的绑定]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119185342</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119185342</guid><author>mrkyee</author><pubDate>Thu, 29 Jul 2021 01:21:18 +0800</pubDate><description><![CDATA[binderService如何实现acitivity和service的绑定
首先从bindService这个方法看起
@Override
public boolean bindService(Intent service, ServiceConnection conn,
        int flags) {
    return mBase.bindService(service, conn, flags);
}

调用的是ContextWrapper里的bindService。看一下这个mBase是何]]></description><category></category></item><item><title><![CDATA[关于阿里热修复sophfix需要冷启动才能生效的探索]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119182360</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119182360</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 16:00:59 +0800</pubDate><description><![CDATA[之前公司让我调研关于为什么很多情况下不能即时生效热修复。公司之前用的是阿里的sophfix热修。然后我反编译，通过对比原有包和热修复后的包的差距发现了一些R文件的改动。
最终总结下有两种情况下sophfix必须冷启动后才能完成bugfix。
1 修改涉及内部类的
内部类持有了外部类的引用，修改了外部类的方法，热修复后会使用补丁中的类的方法去替换掉旧的类的方法。但是这些方法所属类就变成补丁包中的类了，此时补丁类中的新方法访问匿名内部类是没有权限的。
原则是不涉及访问权限的变动。
（1）方法中不能包含有内部类
]]></description><category></category></item><item><title><![CDATA[rxjava学习笔记]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119182011</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119182011</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 15:43:55 +0800</pubDate><description><![CDATA[RxJava框架的学习笔记
1、什么是RxJava？
在github上的自我介绍是这样的：
RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.
It extends the observer pattern to support sequences of da]]></description><category></category></item><item><title><![CDATA[retrofit学习笔记]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119181956</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119181956</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 15:42:41 +0800</pubDate><description><![CDATA[1、什么是Retrofit 2.0 ？
github上的介绍是A type-safe HTTP client for Android and Java.翻译过来就是一个用于Android和Java的类型安全HTTP客户端。底层实际上就是封装了okhttp。
本质的工作流程：
客户端使用Retrofit 进行网络请求，封装请求方法、请求参数、Header、Ur等信息后 ，之后由 OkHttp 完成后续的请求操作。
在服务端返回数据之后，OkHttp 将原始的结果交给 Retrofit，Retrofit根据用户]]></description><category></category></item><item><title><![CDATA[gradle学习（二）]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119181779</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119181779</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 15:39:04 +0800</pubDate><description><![CDATA[gradle学习（二）
1、setting文件
在gradle中，设置文件默认名字是settings.gradle，放在根目录下，用于初始化和工程树的配置。根工程就是project，子工程就是moduel。
一个子工程或者说是moduel，只有在settings文件中配置了gradle才会去识别，构建的时候才会被打包。诸如
include ':app1',
        ':module_one',
        ':module_two',
        ':router',
        ':l]]></description><category></category></item><item><title><![CDATA[热修复学习笔记（一）]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119181827</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119181827</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 15:38:59 +0800</pubDate><description><![CDATA[1. 为什么需要热修复？

此外，如果有一些紧急需要上线的小需求，希望马上能上线的，也可以借助热修复快速迭代，当然也不能过于依赖热修复。
因此总结一下，它有几大优势
（1）不依赖发版。
（2）用户无感知，无需下载最新应用。
（3）修复成功率高，能快速把损失降到最低。
2. 热修复的原理
修复可以分成三种目标，分别是代码修复、资源修复以及so库修复。
代码修复是我们最经常使用的场景。代码修复又可以分为三种解决方案底层替换方案、类加载方案和Instant Run方案。
2.1类加载方案
类加载方案，基于dex分]]></description><category></category></item><item><title><![CDATA[java泛型]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119181664</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119181664</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 15:35:02 +0800</pubDate><description><![CDATA[java泛型

1、为什么需要泛型？

（1）在编译的时候提供安全检测的功能

（2）同时能支持多种类型参数。

概念有点抽象,举个例子比如List 我们在使用的时候，可以指定不同的类型。

  List&lt;String&gt; strList=new ArrayList&lt;&gt;();
  List&lt;Integer&gt; intList=new ArrayList&lt;&gt;();

为什么能支持这样呢，看ArrayList的源码，可以看到E就是不确定的类型，需要外部指定。
...]]></description><category></category></item><item><title><![CDATA[记录webView接入h5界面时，调起相册、文件、相机无效的解决办法]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119181373</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119181373</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 15:26:20 +0800</pubDate><description><![CDATA[记录webView接入h5界面时，调起相册、文件、相机无效的解决办法。
在开发项目时，接入一个h5界面。使用webview时，发现界面显示正常，但是按钮不论怎么点都无效，但是m站和ios都正常。后来上网查了相关资料，才发现原来这块是需要Android这边自己在webview这边开发的。需要重写WebChromeClient。
这里有一个需要区分的概念就是WebChromeClient和WebViewClient，因时间和精力关系只做简单的学习和介绍。
WebViewClient只和影响view有关系的事件到]]></description><category></category></item><item><title><![CDATA[Android开发艺术探索 第三章View]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119181294</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119181294</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 15:24:15 +0800</pubDate><description><![CDATA[第三章 View
1.View的基础知识
1.1 什么是View
View是Android所有控件的基类，比如button，listView等的基类都是View。除了View以外，还有一个ViewGroup。ViewGroup代表一组View的集合，ViewGroup也是一种View
1.2 View的参数
view的位置由四个顶点确定，分别对应四个属性top、left、right、bottom，其中top是左上角纵坐标，left是左上角的横坐标，right是右下角的横坐标，bottom是右下角的纵坐标。这]]></description><category></category></item><item><title><![CDATA[Android开发艺术探索学习笔记 第二章IPC]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/119181234</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/119181234</guid><author>mrkyee</author><pubDate>Wed, 28 Jul 2021 15:23:14 +0800</pubDate><description><![CDATA[最近将之前工作做本地的学习笔记上传一下
这里是Android艺术开发探索的前三章内容
文章目录1. android的多进程模式2. IPC基础概念介绍2.1 Serializable2.2ParcelabeQ&amp;A3.AIDL3.1使用(1)创建aidl文件(2)创建服务端服务供远程绑定(3)创建客户端3.2IBookManager.java类源码分析3.3定向Tag4. Android中的IPC方式4.1 Bundle使用方式4.2 文件共享4.3 Messenger4.4 ContentProvi]]></description><category></category></item><item><title><![CDATA[Android 自定义的mylog]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/116496000</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/116496000</guid><author>mrkyee</author><pubDate>Fri, 07 May 2021 16:12:03 +0800</pubDate><description><![CDATA[自定义的MyLog
1、为什么需要自定义一个MyLogger？
以Log.d为例,可以看到需要传入两个参数，分别是tag和message。tag用来过滤其他log从而找到自己需要的那条log。
public static int d(String tag, String msg) {
    return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
}

因此在每个需要打log的类，你都需要自己创建一个tag用于过滤，如下所示。
public class Ma]]></description><category></category></item><item><title><![CDATA[Android svga动画框架]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/116459569</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/116459569</guid><author>mrkyee</author><pubDate>Thu, 06 May 2021 18:06:42 +0800</pubDate><description><![CDATA[为什么需要动画播放框架？

Android中实现动画有几种方式

（1）Frame Animation（逐帧动画）

（2）Tween Animation (补间动画)

（3）Property Animation(属性动画)

（4）GIF/WebP动画图片

方案1的缺点在于需要将动画拆分成一张张图，体积大。

方案2、3实现难度大，开发人员需要每一步都细细调参，效率低低。

此外如果需要更换动画，需要进行客户端的更新。

方案4 gif实际上和帧动画类似，将一张张图片打包压缩成gif。随便一个gif的]]></description><category></category></item><item><title><![CDATA[Android gradle学习（一）]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/116208054</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/116208054</guid><author>mrkyee</author><pubDate>Tue, 27 Apr 2021 19:20:01 +0800</pubDate><description><![CDATA[Android gradle学习（一）
文章目录Android gradle学习（一）1、gradle配置2、初用gradle任务和项目生命周期3、Gradle Wrapper（1）生成wrapper（2）wrapper配置（3）gradle-wrapper.properties（4）自定义wrapper task4、gradle日志（1）gradle的日志（2）输出错误堆栈信息（3）自定义日志输出5、gradle命令（1）获取帮助（2）查看所有可执行的Task（3）强制刷新依赖（4）多任务调用（5）通过任]]></description><category></category></item><item><title><![CDATA[java反射和代理模式]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/116013386</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/116013386</guid><author>mrkyee</author><pubDate>Thu, 22 Apr 2021 14:57:53 +0800</pubDate><description><![CDATA[java反射和代理
1 什么是反射？
通常创建一个对象，都是以new的方式。
A a=new A（）;

反射则是一开始并不知道自己需要创建的对象，自然不能用new的方式。而是运行时才知道创建的类是什么，并且可以在运行时获取类的成员变量和构造方法等。
为什么这么做？
假如创建的类可能频繁改动或者，本身不知道需要具体创建哪个类时，就可以使用反射，体现了java的灵活性。
Person person=new Teacher();

下次需要改成Student，就需要修改源码，并且重新编译。假如这是已经交付给客户]]></description><category></category></item><item><title><![CDATA[Android 如何简便地将后端返回的字符串做部分高亮展示]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/113779882</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/113779882</guid><author>mrkyee</author><pubDate>Wed, 10 Feb 2021 14:32:13 +0800</pubDate><description><![CDATA[这个标题想了好久还是没想到如何简洁明了地把需求说清楚。。就随便取了一个。

先看需求，在开发过程中，有时候需要对后端返回对字符串做部分的高亮展示。如图所示，假定以下都是后端接口返回的，需要对部分特定对内容做高亮处理，包括了字体、颜色等做特殊处理。



如果是的话，你可以继续往下看了。

这个需求的难点在于，特殊处理的字符个数未知、位置未知（没办法将字符串分成多个接口字段），也没有固定的上下文，可能随机分布在字符串的各个地方，并且需要对一个textview的部分文字进行不同颜色大小的展示。因此不好进行处理。]]></description><category></category></item><item><title><![CDATA[Android View基础知识（一）]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/113629432</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/113629432</guid><author>mrkyee</author><pubDate>Thu, 04 Feb 2021 12:09:43 +0800</pubDate><description><![CDATA[一、View的种类

View主要分成两种：

一种是单一视图，只包含一个view,常见的有textview等。
	另一种是视图组，包含一组view，也就是viewgroup。可以看到viewgroup继承自view，比如Linearlayout等布局、listview。

public abstract class ViewGroup extends View implements ViewParent, ViewManager {
}


所以可以说Android中所有的UI组建都是继承自view。

]]></description><category></category></item><item><title><![CDATA[Android textwatcher监听文本框输入变化]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/108729123</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/108729123</guid><author>mrkyee</author><pubDate>Tue, 22 Sep 2020 14:52:43 +0800</pubDate><description><![CDATA[textwatcher 包含三个接口，分别对应文本框输入的三个状态，分别是输入前、输入中、输入完成。
1.改变前 beforeTextChanged
这个方法会在输入前调用,有四个参数分别是
CharSequence s: editview中原来的内容
int start :  本次替换的起始位置
int count: 本次替换内容的长度
int after:  新替换内容的长度
注释中说的很明白，这个方法被调用是用来通知你，原内容s从start位置开始的count个字符将为被长度为after的新内容替换，]]></description><category></category></item><item><title><![CDATA[Android editview和软键盘详解]]></title><link>https://blog.youkuaiyun.com/mrkyee/article/details/108660795</link><guid>https://blog.youkuaiyun.com/mrkyee/article/details/108660795</guid><author>mrkyee</author><pubDate>Tue, 22 Sep 2020 11:48:27 +0800</pubDate><description><![CDATA[editview和软键盘详解
1.editview焦点和软键盘的调用并无关系
一直以来大家可能都有一个误区就是，editiview的焦点变化会直接影响软键盘的显示和隐藏，最典型的观点就是，我点击editview出现光标，软键盘就弹出来了，不就说明了一旦editview获取焦点，就能调用软键盘了吗？一般来说当editview被点击时，会自动调用软键盘，但是本身editview焦点的获取与否不会影响键盘的显示或者隐藏，两者本身没有联系。看下面的例子。
这是MainActivity的xml文件,很简单就是一个ed]]></description><category></category></item></channel></rss>