<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[杨殿生的博客]]></title><description><![CDATA[Android开发的小学生]]></description><link>https://blog.youkuaiyun.com/LovelyProgrammer</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; LovelyProgrammer]]></copyright><item><title><![CDATA[多线程知识点总结]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/89396394</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/89396394</guid><author>LovelyProgrammer</author><pubDate>Fri, 19 Apr 2019 11:24:42 +0800</pubDate><description><![CDATA[原文地址https://www.jianshu.com/p/2f1c94551038

多线程一直都是面试高级的必问高发区，并且很难掌握。特别是对于客户端的同学，因为我们在写客户端时，虽然会使用多线程场景，但不会有后端那种强要求高并发的场景。但这并不应该成为掌握不好多线程的借口，以下是我总结的思维导图，通过这个思维导图我们能更加清晰的理解多线程的知识框架




...]]></description><category></category></item><item><title><![CDATA[适配器模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86595987</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86595987</guid><author>LovelyProgrammer</author><pubDate>Tue, 22 Jan 2019 15:50:48 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/fd417a917ed4

适配器模式就是把一个类或接口转换成其他的接口或类

类图如下

 



适配器模式类图

适配器模式分成两种一种是类适配，通过继承的方式，一种是对象适配，通过组合的方式

类适配

假设我们现在有自己的一个运行系统，由用户信息接口


public interface UserInfo {
    Stri...]]></description><category></category></item><item><title><![CDATA[策略模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86594328</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86594328</guid><author>LovelyProgrammer</author><pubDate>Tue, 22 Jan 2019 14:36:42 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/b2ab047ea687

定义一组算法，将算法都封装起来，并且是他们之间可以互换的
简单的说就是把方法封装在方法中，调用不同对象的相同方法实现的算法是不同的
类图如下

 



策略模式类图

Strategy是策略的抽象类
ConcreteStrategy是策略的具体实现类
Context是策略的管理类

假设一种场景
我们可以用...]]></description><category></category></item><item><title><![CDATA[装饰者模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86586213</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86586213</guid><author>LovelyProgrammer</author><pubDate>Mon, 21 Jan 2019 22:46:17 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/2fe021a2a9df

为现有的类增加功能，是继承的一种替代方式
类图如下

 



装饰者模式类图

假设一个场景
我们在学校要考试，然后要给家长签字，说分数之前你要先汇报一下班级最好成绩，然后说出你的分数之后，在说出你在班级的排名
1，建立一个抽象的报告接口


public interface SchoolReport {
...]]></description><category></category></item><item><title><![CDATA[责任链模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86586191</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86586191</guid><author>LovelyProgrammer</author><pubDate>Mon, 21 Jan 2019 22:45:27 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/86c531761d05

责任链模式重在一个链上，处理一件事要经过层层审批才能执行，或者在我请求某件事之前要有很多对象需要给我的请求添加更多参数
类图如下

 



责任链模式类图

假设一种场景，古代妇女的地位比较低，做什么事情都要请求男人，也就是父亲，丈夫，儿子其中有一个处理了这个请求才能去做
1，妇女的抽象类


public...]]></description><category></category></item><item><title><![CDATA[命令模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86529267</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86529267</guid><author>LovelyProgrammer</author><pubDate>Thu, 17 Jan 2019 18:25:51 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/95690a7e549b

命名、命令就是我下一个命令你就要来执行，我不关心谁来实现的，我只关心我的命令执没执行。命令模式就是将命令和执行封装在一起，并且高层组件是接触不到底层组件的，实现了调用者和执行者解耦合

看一下类图

 



命令模式类图

Command：定义了命令的抽象
ConcreteCommand：是具体的命令实现类...]]></description><category></category></item><item><title><![CDATA[中介模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86524459</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86524459</guid><author>LovelyProgrammer</author><pubDate>Thu, 17 Jan 2019 14:53:12 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/298ef103b484

中介模式是用来解决多个对象显示相互调用造成的耦合，使用一个中介来使耦合松散，减少类之间的依赖

看一下类图

 



中介模式类图

联系一个场景。
角色有采购，销售，和库房。
采购在采购的时候要依赖销售的状态，销售在销售的时候要依据库房的库存，并且销售后要修改库存。清空库存时要让采购停止采购，销售打折销售...]]></description><category></category></item><item><title><![CDATA[原型模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86508962</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86508962</guid><author>LovelyProgrammer</author><pubDate>Wed, 16 Jan 2019 15:44:59 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/47297cc49919

原型模式就是通过原型创建多个对象，简单来说就是通过一个对象去复制多个对象
类图如下

 



原型模式类图

 

需要实现Cloneable接口，复写clone()方法
具体代码如下


public class Mail implements Cloneable{
    private String ...]]></description><category></category></item><item><title><![CDATA[动态代理]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86507481</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86507481</guid><author>LovelyProgrammer</author><pubDate>Wed, 16 Jan 2019 14:44:54 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/46d5c64e0459

代理代理，就是找个人代替你做你该做的事，分为静态代理和动态代理，一个一个说

准备工作

我们先假设一种场景，打游戏，我们创建一个游戏人物去打游戏，让一个代理帮我们打游戏
1，建立一个游戏人物的抽象类


public interface GamePlayer {
    void login(String ...]]></description><category></category></item><item><title><![CDATA[建造者模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86492552</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86492552</guid><author>LovelyProgrammer</author><pubDate>Tue, 15 Jan 2019 14:47:16 +0800</pubDate><description><![CDATA[原文地址：https://www.jianshu.com/p/91c650a590e3

1，建造者模式是一个创建对象的模式
2，与工厂模式很像，建造者模式主要思考的方向是零件的顺序不同创建对象不同，工厂方法不会关注创建零件时的顺序
3，建造者模式经常和模板方法一起使用

看一下类图

 



建造者模式类图

 

1，需要有产品的抽象类定义产品生成规则
2，产品实现类实现产品具体行为（这里就...]]></description><category></category></item><item><title><![CDATA[模板方法模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86489809</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86489809</guid><author>LovelyProgrammer</author><pubDate>Tue, 15 Jan 2019 11:27:16 +0800</pubDate><description><![CDATA[原味地址：https://www.jianshu.com/p/5aa0b7f5815e

首先来看一下类图

 



模板方法模式类图

 

原理就是，通过抽象的父类来控制子类的行为，具体的行为由子类定义
1，定义一个抽象的父类将公共执行部分抽取到父类中


public abstract class AbstractClass {
    //基本方法
    protected abstr...]]></description><category></category></item><item><title><![CDATA[抽象工厂]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86476634</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86476634</guid><author>LovelyProgrammer</author><pubDate>Mon, 14 Jan 2019 14:15:31 +0800</pubDate><description><![CDATA[原文地址 https://www.jianshu.com/p/38c99d5e11a3

先来看一下抽象工厂的类图

 



抽象工厂类图

 

这里抽象工厂和工厂模式很相似，抽象工厂是产生产品族的，产品族就是一系列产品
比如我们之前说创建人，人分黑种人，黄种人，白种人，那现在我在加入一个性别，我需要如何设计呢，这就需要抽象工厂模式了
1，人类的接口


public interface Hu...]]></description><category></category></item><item><title><![CDATA[工厂模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86472707</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86472707</guid><author>LovelyProgrammer</author><pubDate>Mon, 14 Jan 2019 11:17:01 +0800</pubDate><description><![CDATA[原文地址 https://www.jianshu.com/p/ec991512f83b

生产对象的一种模式，通过增加一个工厂类使创建产品的时候延迟到子类
工厂模式是理解依赖倒置的法宝，


依赖倒置
1，高层组件不依赖底层组件
2，他们都依赖于抽象


工厂模式里的工厂是高级组件，产品是低级组件，要想建立产品你就需要实现工厂的产品接口，也就是高层组件不依赖底层组件
工厂类和产品类都是依赖，抽象工...]]></description><category></category></item><item><title><![CDATA[单例模式]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86243245</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/86243245</guid><author>LovelyProgrammer</author><pubDate>Thu, 10 Jan 2019 17:27:40 +0800</pubDate><description><![CDATA[原文地址 https://www.jianshu.com/p/9f88630d9667

 

这可能是我们遇上的最简单的模式了，不过他真的简单么？面试的时候如果真的细问你，你可能真的会被问的哑口无言。什么你不信，那我们来一起思考一下下面几个问题
1，单例模式定义
2，写一下你知道的所有单例模式
3，写一个饿汉式单例模式
4，写一个懒汉式单例模式
5，写出你知道的能保证线程安全的单例模式，以及说一...]]></description><category></category></item><item><title><![CDATA[Apk签名，安装校验过程]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/85112321</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/85112321</guid><author>LovelyProgrammer</author><pubDate>Thu, 20 Dec 2018 09:58:29 +0800</pubDate><description><![CDATA[原文地址 https://www.jianshu.com/p/1e8cfea539e6

首先要了解是整个应用生成的过程

 



编译过程 .png

 

再来看一下最后生成的apk解压后的文件结构

 



Apk结构.png


这里主要关注未签名和签名的apk的区别
未签名的apk是没有MEAT-INF文件夹的，只有签名的apk才有这个文件夹。分别来看一下这个文件夹下的文件的含义

...]]></description><category></category></item><item><title><![CDATA[Client请求ServiceManager的交互过程]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/84528048</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/84528048</guid><author>LovelyProgrammer</author><pubDate>Mon, 26 Nov 2018 10:45:26 +0800</pubDate><description><![CDATA[原文链接https://www.jianshu.com/p/8924a84b6aea

首先要了解一下Binder使用的各个实体对象和代理对象，这个在Android智能指针中有体现，链接地址https://www.jianshu.com/p/e4379961ad74

那么具体在Client请求ServiceManager的时候都是实现了什么操作呢？

这里牵扯到两个进程Client和Servic...]]></description><category></category></item><item><title><![CDATA[ServiceManger注册过程]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/84314358</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/84314358</guid><author>LovelyProgrammer</author><pubDate>Wed, 21 Nov 2018 10:15:27 +0800</pubDate><description><![CDATA[原文链接https://www.jianshu.com/p/ef6359f63305

ServiceManager他是单独跑在一个叫system_manager进程中的，是用来管理服务和查询服务的，类似网络中的DNS
他自己本身也是一个服务，使用的是binder机制，那客户端如果要检索服务如何找到ServiceManager呢？ServiceManager有自己固定的handle值是0，客户端沟...]]></description><category></category></item><item><title><![CDATA[Binder驱动]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/84289317</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/84289317</guid><author>LovelyProgrammer</author><pubDate>Tue, 20 Nov 2018 11:07:19 +0800</pubDate><description><![CDATA[原文链接https://www.jianshu.com/p/5dd4c5a8333a

要学习Android进程间通信那么第一步要掌握的就是Binder驱动，Binder驱动提供很多命令其中最常用的三个命令是open，mmap，ioctl，分别看一下这三个命令都是干啥的

binder_open

上层需要访问binder驱动时，首先需要打开/dev/binder结点。实现是在binder_ope...]]></description><category></category></item><item><title><![CDATA[Android中智能指针]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/84236990</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/84236990</guid><author>LovelyProgrammer</author><pubDate>Mon, 19 Nov 2018 11:32:27 +0800</pubDate><description><![CDATA[原文链接 https://www.jianshu.com/p/e4379961ad74

首先智能指针是应用在C++层面的，java中是把指针这个东西隐藏了的，回收对象使用GC不需要程序员自己去处理

为什么要引入智能指针

C++中使用对象会存在几个问题

1，对象创建后的初始化问题

2，new和delete不成对出现问题

3，野指针问题

什么是野指针，比如ptr指向一个对象，这个对象使用...]]></description><category></category></item><item><title><![CDATA[Java高手要会的小知识]]></title><link>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/81026586</link><guid>https://blog.youkuaiyun.com/LovelyProgrammer/article/details/81026586</guid><author>LovelyProgrammer</author><pubDate>Fri, 13 Jul 2018 10:01:22 +0800</pubDate><description><![CDATA[1，在重写equals的时候需要注意哪几点？并说说这些点的含义？自反性 x.equals(x)为true对称性 x.equeals(y)为true那么y.equals(x)也为true传递性 x.equeals(y)为true，y.equeals(c)为true。那么x.equeals(c)为true一致性 当两个对象都未作修改反复调用x.equeals(y)为true非空性 x.equeals(...]]></description><category></category></item></channel></rss>