<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[xfb的博客]]></title><description><![CDATA[知识记录]]></description><link>https://blog.youkuaiyun.com/xfb1989</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xfb1989]]></copyright><item><title><![CDATA[C++ ＞ Cmake]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/130748347</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/130748347</guid><author>xfb1989</author><pubDate>Tue, 30 May 2023 19:14:50 +0800</pubDate><description><![CDATA[根目录可以使用 CMake 的 add_subdirectory 添加子目录, 子目录也包含一个 CMakeLists.txt,其中定义的库在 add_subdirectory 之后就可以使用。调用编译器程序g++, 读取main.cpp中源码, 根据C++标准生成相应的机器指令码, 输出到a.out可执行文件。跨平台的 CMake 的产生， 只需编写CMakeLists.txt，就能够在调用时生成当前系统所支持的构建系统。在 C++ 中常常用到很多的类, 和函数一样, 类的声明也会被放到头文件中。]]></description><category></category></item><item><title><![CDATA[Android Binder原理]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/91354288</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/91354288</guid><author>xfb1989</author><pubDate>Thu, 26 Nov 2020 17:31:30 +0800</pubDate><description><![CDATA[管道是Linux由Unix那里继承过来的进程间的通信机制，它是Unix早期的一个重要通信机制。管道的主要思想是，在内存中创建一个共享文件，从而使通信双方利用这个共享文件来传递信息。这个共享文件比较特殊，它不属于文件系统并且只存在于内存中。另外还有一点，管道采用的是半双工通信方式的，数据只能在一个方向上流动。信号是软件层次上对中断机制的一种模拟，是一种异步通信方式，进程不必通过任何操作来等待信号的到达。信号可以在用户空间进程和内核之间直接交互，内核可以利用信号来通知用户空间的进程发生了哪些系统事件。]]></description><category></category></item><item><title><![CDATA[Android Activity Fragment]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/110189444</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/110189444</guid><author>xfb1989</author><pubDate>Thu, 26 Nov 2020 15:38:11 +0800</pubDate><description><![CDATA[Activity的启动过程：由ActivityManagerService（AMS）对栈内的Activity状态进行同步管理 & 规定：新Activity启动前，栈顶的Activity必须先onPause（），才能启动新的Activity（执行onResume()）ActivityStack类记录需启动的Activity的信息 & 调整Activity栈 将其置于栈顶、通过 Binder 驱动 将 Activity 的启动信息传递到ApplicationThread线程中（即Binder线程）]]></description><category></category></item><item><title><![CDATA[Java 数据结构]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/110047271</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/110047271</guid><author>xfb1989</author><pubDate>Tue, 24 Nov 2020 10:38:10 +0800</pubDate><description><![CDATA[二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n )。二叉查找树是基础性数据结构，用于构建更为抽象的数据结构，如集合、多重集、关联数组等。树是一种数据结构，它是n(n>=0)个节点的有限集。循环链表 能通过任何一个节点找到其他所有的节点，将两种(双向/单向)链表的最后一个结点指向第一个结点从而实现循环。区别于线性表一对一的元素关系，树中的节点是一对多的关系。树有许多相关的术语与概念，在学习树的结构之前，我们要熟悉这些概念。单向链表 一个节点指向下一个节点。]]></description><category></category></item><item><title><![CDATA[Android Handler机制]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/109739782</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/109739782</guid><author>xfb1989</author><pubDate>Tue, 17 Nov 2020 11:52:04 +0800</pubDate><description><![CDATA[Handler 即处理器，常用于跨线程通讯：线程A 和线程 B 拥有同一个 handler 对象在线程 A 中使用 handler 的 sendMessage() 方法发送消息在线程 B 中使用 handler 的 handleMessage() 方法处理消息。]]></description><category></category></item><item><title><![CDATA[Android 如何使用AIDL]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/109655206</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/109655206</guid><author>xfb1989</author><pubDate>Thu, 12 Nov 2020 20:11:10 +0800</pubDate><description><![CDATA[界面上有三个按钮，分别是功能分别是bindService(绑定Service), unbindService(解除绑定Service), killProcess(杀死Service进程)。本例是为了演示进程间的通信机制，故需要将Service与Activity处于不同的进程，需要在AndroidManifest.xml中，把service配置成。android.os.IBinder obj 如何得到 IRemoteService （android.os.IInterface）?,进程也可以命名成其他的。]]></description><category></category></item><item><title><![CDATA[C++ binder 实现自定义Android Native Service]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/109652168</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/109652168</guid><author>xfb1989</author><pubDate>Thu, 12 Nov 2020 19:25:15 +0800</pubDate><description><![CDATA[代码很简单, 定义一个类继承自IInterface, 里面接口就是我们自己要用到的, 其中DECLARE_META_INTERFACE(DeviceMac);要实现跨进程, 自然是使用Binder了, 因此我们首先要定义一个用于跨进程的接口, 我们通过一个读取和设置蓝牙地址的例子为例, 来讲解具体实现方法, 接口名为。可以看到我们定义IDeviceMac后, 还定义了一个类BnDeviceMac,这个是Binder调用的一个规范, 即定义Ixxx接口后,Bpxxx和Bnxxx都需要我们去实现具体内容,]]></description><category></category></item><item><title><![CDATA[Launcher 启动过程]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/109639803</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/109639803</guid><author>xfb1989</author><pubDate>Thu, 12 Nov 2020 11:11:39 +0800</pubDate><description><![CDATA[我们再回到ActivityManagerService的startHomeActivityLocked函数，假设系统的运行模式不是低级工厂模式，在注释3处判断符合Action为Intent.ACTION_MAIN，Category为Intent.CATEGORY_HOME的应用程序是否已经启动，如果没启动则调用注释4的方法启动该应用程序。被SystemServer进程启动的ActivityManagerService会启动Launcher，Launcher启动后会将已安装应用的快捷图标显示到界面上。]]></description><category></category></item><item><title><![CDATA[Android Jetpack]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/108913015</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/108913015</guid><author>xfb1989</author><pubDate>Sat, 03 Oct 2020 20:33:09 +0800</pubDate><description><![CDATA[因为在Android Support Library 26.1.0 及其之后的版本，Activity和Fragment已经默认实现了LifecycleOwner接口，所以在注释1处可以直接使用getLifecycle方法获取Lifecycle对象，这样MyObserver就可以观察MainActivity的生命周期变化了，LifecycleOwner可以理解为被观察者，MainActivity默认实现了LifecycleOwner接口，也就是说MainActivity是被观察者。]]></description><category></category></item><item><title><![CDATA[Java 设计模式 结构型设计模式]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/108126586</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/108126586</guid><author>xfb1989</author><pubDate>Thu, 20 Aug 2020 16:26:37 +0800</pubDate><description><![CDATA[鸭子(Duck)和火鸡(Turkey)拥有不同的叫声，Duck 的叫声调用 quack() 方法，而 Turkey 调用 gobble() 方法。要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法，从而让火鸡冒充鸭子。RemoteControl 表示遥控器，指代 Abstraction。桥接模式将遥控器和电视分离开来，从而可以独立改变遥控器或者电视的实现。观看电影需要操作很多电器，使用外观模式实现一键看电影功能。TV 表示电视，指代 Implementor。]]></description><category></category></item><item><title><![CDATA[Android 手写实现简化版AMS]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/107355007</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/107355007</guid><author>xfb1989</author><pubDate>Wed, 15 Jul 2020 14:46:10 +0800</pubDate><description><![CDATA[接口，它声明了跨进程通信需要实现的一系列抽象方法，实现了这个接口就说明可 以进行跨进程通信，所有的Binder。代理对象它同样实现 了IBinder。和 Server都要实现此接口。中拿到的实际上是这个代理对象。，在Binder.java。，IBinder的子类，对象从而完成跨进程间通信。，跨进程通信的Base。这个文件中还定义了一个。]]></description><category></category></item><item><title><![CDATA[Android系统启动 init zygote]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/107321740</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/107321740</guid><author>xfb1989</author><pubDate>Mon, 13 Jul 2020 18:00:03 +0800</pubDate><description><![CDATA[init 启动 Zygote 时主要是调用 app_main.cpp 的 main 函数中的AppRuntime的 start 方法来启动 Zygote 进程的,我们就先从app_main.cpp 的 main函数开始分析，Zygote进程启动过程的时序图如图。init启动zygote时主要是调用app_main.cpp的main函数中的AppRuntime的start来启动zygote进程的，我们就从app_main.cpp的main函数开始分析，如下所示，]]></description><category></category></item><item><title><![CDATA[C++程序设计(II)兼谈对象模型（侯捷）—— 2.转换函数 conversion function & 3.non-explicit-one-argument ctor]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/106908454</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/106908454</guid><author>xfb1989</author><pubDate>Mon, 22 Jun 2020 20:05:24 +0800</pubDate><description><![CDATA[基本只会在构造函数前面加这个关键字（模板中有一个也可以加这个关键字，但是很少人用）告诉编译器不要自动帮我做事情，等我真的调用构造函数的时候你再调用。这样上面的 4 不会自动变成Fraction。]]></description><category></category></item><item><title><![CDATA[网络专题 http 和 https]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/106747463</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/106747463</guid><author>xfb1989</author><pubDate>Sun, 14 Jun 2020 16:15:03 +0800</pubDate><description><![CDATA[请求头中的If-Modified-Since：当需要再次请求服务器该资源的时候，客户端会将该资源的修改时间作为If-Midified-Since的值放到请求头，一起发送给服务器，服务器收到后返现有If-Modified-Since，则将该资源的最后修改时间与之对比，若最后修改时间较新，则说明资源又被修改过，则返回新资源，HTTP 200 OK；总体而言，HTTP 1.0和HTTP 1.1在性能和功能上有些局限性，而HTTP 2.0通过引入新的技术和改进，提高了性能和效率，并增加了新的功能。]]></description><category></category></item><item><title><![CDATA[Java 集合框架 ArrayList LinkedList]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/106709132</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/106709132</guid><author>xfb1989</author><pubDate>Fri, 12 Jun 2020 09:49:54 +0800</pubDate><description><![CDATA[ArrayList实现了List接口，是顺序容器，即元素存放的数据与放进去的顺序相同，允许放入。]]></description><category></category></item><item><title><![CDATA[Android Handler native]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/106601211</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/106601211</guid><author>xfb1989</author><pubDate>Sun, 07 Jun 2020 14:18:31 +0800</pubDate><description><![CDATA[从 Android 2.3 开始，Google 把 Handler 的阻塞/唤醒方案从 Object#wait() / notify()，改成了用 Linux epoll 来实现。]]></description><category></category></item><item><title><![CDATA[Android类加载器ClassLoader 和 热修复原理]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/106070558</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/106070558</guid><author>xfb1989</author><pubDate>Tue, 12 May 2020 10:21:27 +0800</pubDate><description><![CDATA[PathClassLoader: 主要用于系统和app的类加载器,其中optimizedDirectory为null, 采用默认目录/data/dalvik-cache/DexClassLoader: 可以从包含classes.dex的jar或者apk中，加载类的类加载器, 可用于执行动态加载,但必须是app私有可写目录来缓存odex文件. 能够加载系统没有安装的apk或者jar文件， 因此很多插件化方案都是采用DexClassLoader;]]></description><category></category></item><item><title><![CDATA[Android 网络编程 ＞ HTTP协议原理 ＞ OkHttp ＞ Retrofit]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/105488316</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/105488316</guid><author>xfb1989</author><pubDate>Mon, 13 Apr 2020 14:36:30 +0800</pubDate><description><![CDATA[网络分层网络分层（此处5层）从上到下分别是应用层、传输层、网络层、数据链路层和物理层。越靠下的层 越接近硬件。接下来我们从下而上来分别了解这些分层。物理层该层负责比特流在节点间的传输，即负责物理传输。该层的协议既与链路有关，也与传输介质有关。其通俗来讲就是把计算机连接起来的物理手段。数据链路层该层控制网络层与物理层之间的通信，其主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输，从网络层接收到的数据被分割成特定的可被物理层传输的帧。]]></description><category></category></item><item><title><![CDATA[Java＞多线程编程]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/104891831</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/104891831</guid><author>xfb1989</author><pubDate>Mon, 16 Mar 2020 09:26:12 +0800</pubDate><description><![CDATA[这两步操作在左边的线程执行完第一步，但还没执行第二步时右边的线程抢过CPU控制权开始完成+1的操作后写入到主内存，于是左边的线程工作内存中的count副本失效了，相当于左边这一次+1的操作就被覆盖掉了。，线程1会立即将自己工作内存的initFlag = false失效，当线程1的执行引擎需要用到initFlag变量时，线程1要重新执行read 和 load操作，那么线程1就能拿到最新值了。线程池对线程进行管理。如果两个线程存取相同的对象，并且每一个线程都调用了修改该对象的方法，这种情况通常被称为竞争条件。]]></description><category></category></item><item><title><![CDATA[Java 集合框架 Stack, Queue, Deque]]></title><link>https://blog.youkuaiyun.com/xfb1989/article/details/104856604</link><guid>https://blog.youkuaiyun.com/xfb1989/article/details/104856604</guid><author>xfb1989</author><pubDate>Sat, 14 Mar 2020 11:07:26 +0800</pubDate><description><![CDATA[操作，由于Deque是双向的，所以可以对队列的头和尾都进行操作，它同时也支持两组格式，一组是抛出异常的实现；是"double ended queue", 表示双向的队列，英文读作"deck". Deque 继承自 Queue接口，除了支持Queue的方法之外，还支持。的含义是“double ended queue”，即双端队列，它既可以当作栈使用，也可以当作队列使用。添加，删除，取值都有两套接口，它们功能相同，区别是对失败情况的处理不同。除非某种实现对容量有限制，大多数情况下，添加操作是不会失败的。]]></description><category></category></item></channel></rss>