<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zhanlan5211的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zhanlan5211</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zhanlan5211]]></copyright><item><title><![CDATA[android软件架构]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/132779860</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/132779860</guid><author>zhanlan5211</author><pubDate>Sat, 09 Sep 2023 17:15:32 +0800</pubDate><description><![CDATA[系统应用：Android系统还包括了一些系统应用，这些应用程序是Android系统的一部分，用于提供系统级的功能和服务，如电话、短信、联系人、日历、设置等。提供统一的接口：硬件抽象层为每个硬件设备定义了一组标准的API接口，这使得上层的应用程序和系统组件可以使用统一的方式来访问和控制各种硬件设备。总之，硬件抽象层在Android系统中起到了桥梁的作用，它提供了一种统一的方式来访问和控制各种硬件设备，使得Android系统能够在不同的硬件平台上运行，并且为上层的应用程序和系统组件提供了简单和统一的硬件接口。]]></description><category></category></item><item><title><![CDATA[java 锁相关知识总结]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/126004699</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/126004699</guid><author>zhanlan5211</author><pubDate>Tue, 26 Jul 2022 22:36:35 +0800</pubDate><description><![CDATA[synchronized是一个同步关键字，是可重入的、独享的、悲观锁、非公平锁，在某些多线程并发改变临界资源（共享数据）场景下，如果不进行同步会导致数据不安全，而synchronized关键字就是用于代码同步。synchronized修饰普通同步方法锁对象是当前实例对象；synchronized修饰静态同步方法锁对象是当前的类Class对象；synchronized修饰同步代码块synchronized修饰普通同步方法锁对象是当前实例对象；synchronized修饰静态同步方法。......]]></description><category></category></item><item><title><![CDATA[Java 线程池知识总结]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/125476339</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/125476339</guid><author>zhanlan5211</author><pubDate>Mon, 27 Jun 2022 00:02:53 +0800</pubDate><description><![CDATA[​	在程序中经常需要用到多线程处理一些任务，这时候不建议单纯使用Thread或者实现Runnable接口的方式来创建线程，因为创建和销毁线程、和线程的上下文切换是需要耗费资源的，另一方面不加限制的创建线程可能导致系统资源耗尽。所以需要使用多线程的场景建议使用线程池，使用线程池会带来以下好处：创建一个固定大小的线程池，因为采用无界的阻塞队列，所以实际线程数量永远不会变化，适用于负载较重的场景，对当前线程数量进行限制。（保证线程数可控，不会造成线程过多，导致系统负载更为严重）
使用的构造方式为new Threa]]></description><category></category></item><item><title><![CDATA[volatile 可见性与指令重排]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/125353429</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/125353429</guid><author>zhanlan5211</author><pubDate>Sun, 19 Jun 2022 00:06:08 +0800</pubDate><description><![CDATA[​	现在的CPU都是多核，程序可以在多核上并行执行，指令在执行时，数据会从主存拷贝好CPU的各级缓存上，执行完之后在写回到主存上，此时同一个变量可能在两个核上被操作，该变量在两个拷贝分布在两个核上，此时就会出现问题，比如简单的自增操作，就会是你做你的，我做我的，最后结果会偏离预期。​	使用volatile修饰共享变量后，每个线程要操作变量时，会把变量拷贝到缓存中，当线程操作变量副本写回主存后，会通过CPU总线嗅探机制告知其他线程该变量副本已经失效，需要从主存中重新获取。​	总线嗅探机制：CPU和内存有极大速]]></description><category></category></item><item><title><![CDATA[双重校验锁单例为什么这样写]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/125213718</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/125213718</guid><author>zhanlan5211</author><pubDate>Fri, 10 Jun 2022 00:28:43 +0800</pubDate><description><![CDATA[详解双重校验锁的实现]]></description><category></category></item><item><title><![CDATA[二叉树前中后序遍历]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/119831057</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/119831057</guid><author>zhanlan5211</author><pubDate>Fri, 20 Aug 2021 20:34:40 +0800</pubDate><description><![CDATA[先序遍历
递归实现
class Solution {
    public List&lt;Integer&gt; preorderTraversal(TreeNode root) {
        List&lt;Integer&gt; res = new ArrayList&lt;Integer&gt;();
        preorder(root, res);
        return res;
    }

    public void preorder(TreeNode root, L]]></description><category></category></item><item><title><![CDATA[设计模式介绍]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/118642424</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/118642424</guid><author>zhanlan5211</author><pubDate>Sat, 10 Jul 2021 23:25:58 +0800</pubDate><description><![CDATA[设计模式简介
设计模式（Design pattern）代表了最佳的实践，通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问，设计模式于己于他人于系统都是多赢的，设计模式使代码编制真正工程化，设计模式是软件工程的基石，如同大]]></description><category></category></item><item><title><![CDATA[重构之重构方法]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/118638008</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/118638008</guid><author>zhanlan5211</author><pubDate>Sat, 10 Jul 2021 17:27:28 +0800</pubDate><description><![CDATA[坏味道与重构手法速查表




坏味道（中文）
常用重构




异曲同工的类
改变函数声明（124），搬移函数（198），提炼超类（375）


注释
提炼函数（106），改变函数声明（124），引入断言（302）


纯数据类
封装记录（162），移除设值函数（331），搬移函数（198），提炼函数（106），拆分阶段（154）


数据泥团
提炼类（182），引入参数对象（140），保持对象完整（319）


发散式变化
拆分阶段（154），搬移函数（198），提炼函数（106），提炼类（182）

]]></description><category></category></item><item><title><![CDATA[重构之坏味道]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/118637024</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/118637024</guid><author>zhanlan5211</author><pubDate>Sat, 10 Jul 2021 16:34:18 +0800</pubDate><description><![CDATA[坏味道


神秘的命名
命名是编程中最难的两件事之一，整 洁代码最重要的一环就是好的名字，所以我们会深思熟虑如何给函数、模块、变量和类命名，使它们能清晰地 表明自己的功能和用法。
改名不仅仅是修改名字而已。如果你想不出一个好名字，说明背后很可能潜藏着更深的设计问题。为一个恼人的名字所付出的纠结，常常能推动我们对代码进行精简。


重复代码
如果你在一个以上的地点看到相同的代码结构，那么可以肯定：设法将它们合而为一，程序会变得更好。
最单纯的重复代码就是“同一个类的两个函数含有相同的表达式”。这时候你需要做的]]></description><category></category></item><item><title><![CDATA[ContentProvide的生命周期]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/118437992</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/118437992</guid><author>zhanlan5211</author><pubDate>Sat, 03 Jul 2021 11:49:49 +0800</pubDate><description><![CDATA[ContentProvide的生命周期
https://blog.youkuaiyun.com/carson_ho/article/details/76101093
定义 &amp; 作用
定义：即内容提供者，是 Android 四大组件之一
作用：进程间 进行数据交互 &amp; 共享，即跨进程通信

原理
ContentProvider的底层是采用 Android中的Binder机制
具体使用
关于ContentProvider的使用主要介绍以下内容：

统一资源标识符（URI）


定义：Uniform Reso]]></description><category></category></item><item><title><![CDATA[Service生命周期]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/118437824</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/118437824</guid><author>zhanlan5211</author><pubDate>Sat, 03 Jul 2021 11:41:15 +0800</pubDate><description><![CDATA[Service的生命周期
https://www.jianshu.com/p/8d0cde35eb10
生命周期常用方法
在Service的生命周期里，常用的有：


4个手动调用的方法




手动调用方法
作用




startService()
启动服务


stopService()
关闭服务


bindService()
绑定服务


unbindService()
解绑服务




5个自动调用的方法




内部自动调用的方法
作用




onCreate()
创建服务


onStar]]></description><category></category></item><item><title><![CDATA[Binder系列1：初始Binder]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/118437648</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/118437648</guid><author>zhanlan5211</author><pubDate>Sat, 03 Jul 2021 11:28:21 +0800</pubDate><description><![CDATA[初始Binder
Binder 和 Linux其他IPC方式的对比
Linux现有的所有进程间IPC方式：

管道：在创建时分配一个Page大小的内存，缓存区大小比较有限
消息队列：消息复制两次，额外的CPU小号，不适合频繁或信息量大的通信
共享内存：无需复制，共享缓冲区直接附加到进程的虚拟进程空间，速度快；但进程间的同步问题操作系统无法实现，必须各进程利用同步工具解决；
套接字：作为更通用的接口，传输效率低，主要用于不同机器或跨网络的通信；
信号量：常作为一种锁机制，防止某进程正在访问共享资源时，其他进程]]></description><category></category></item><item><title><![CDATA[android工程师的四个阶段]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/118164320</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/118164320</guid><author>zhanlan5211</author><pubDate>Wed, 23 Jun 2021 22:55:58 +0800</pubDate><description><![CDATA[android 四个阶段学习路线
初级工程师
Android入门的时候，需要有一本入门书，好好学习书中的内容，同时花一年时间把Android官方文档中的training和guide看一遍，同时通过写博客和记笔记的方式来做总结，建议让自己的每篇博客都有价值些。通过一年时间的学习，相信每个人都可以达到中级工程师的水平。
技术要求：

基本知识点，比如四大组件如何使用、如何创建Service、如何进行布局、简单的自定义View、动画等常见技术
书籍推荐 《第一行代码 Android》、《疯狂Android》

中]]></description><category></category></item><item><title><![CDATA[Activity生命周期]]></title><link>https://blog.youkuaiyun.com/zhanlan5211/article/details/118164341</link><guid>https://blog.youkuaiyun.com/zhanlan5211/article/details/118164341</guid><author>zhanlan5211</author><pubDate>Wed, 23 Jun 2021 22:55:29 +0800</pubDate><description><![CDATA[Activity生命周期

activity从开始到结束的四个状态
activity的生命周期
activity的进程优先级

activity的四个状态
关于activity的四个状态：running-paused-stopped-killed

running-&gt;当前显示在屏幕的activity(位于任务栈的顶部)，用户可见状态。
paused-&gt;依旧在用户可见状态，但是界面焦点已经失去，此Activity无法与用户进行交互。
stopped-&gt;用户看不到当前界面,也无法与用户进行交互]]></description><category></category></item></channel></rss>