<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Android的专栏]]></title><description><![CDATA[聚焦Kotlin高阶特性与当前主流Android开发架构，包含协程底层源码拆解、Flow全场景使用、MVVM架构落地、Jetpack组件深度适配等内容。]]></description><link>https://blog.youkuaiyun.com/hai324314</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; hai324314]]></copyright><item><title><![CDATA[AudioTrack 深度解析：从原理到实战]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/170428380</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/170428380</guid><author>hai324314</author><pubDate>Tue, 10 Nov 2026 12:06:18 +0800</pubDate><description><![CDATA[Android 里播声音的"最低层" API。ExoPlayer都在它之上封装了一层，只有当你需要时，才会直接面对它。]]></description><category></category></item><item><title><![CDATA[Android 四大 Interpolator 源码解析：从数学公式到速度曲线]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/170026217</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/170026217</guid><author>hai324314</author><pubDate>Wed, 04 Nov 2026 09:36:42 +0800</pubDate><description><![CDATA[*** 二次方减速插值器：等价于 DecelerateInterpolator，但用幂函数表达* f(t) = 1 - (1 - t)^p，p 越大后段减速越猛*/@Overridepower = 2时就是 DecelerateInterpolator，power = 3时后段减速更狠，视觉上更"利落"。]]></description><category></category></item><item><title><![CDATA[拆解 ComponentActivity.viewModels()]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/169845382</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/169845382</guid><author>hai324314</author><pubDate>Mon, 02 Nov 2026 17:01:08 +0800</pubDate><description><![CDATA[类型参数不再需要"运行时存在"，自然也就绕开了擦除。一调用就把工厂造出来，那么"声明了但这次没用上"的情况就白付了这份开销。靠 lambda 把这一步推迟了，但这不代表可以自己在构造函数里直接写。返回带参数支持的工厂——延迟读取让多态在任何时候都成立。：函数体必须能搬到调用点，才可能带着具体类型一起搬。但"类型对不上"只是表层原因，真正有价值的是。：不能赋给变量，不能返回，不能传给非内联函数。，Kotlin 就会为它生成真正的函数对象（属性是在 lambda 里读的，读的时机是。]]></description><category></category></item><item><title><![CDATA[CRC-16/MODBUS 详解：原理 + Java 实现]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/169550986</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/169550986</guid><author>hai324314</author><pubDate>Fri, 30 Oct 2026 13:51:38 +0800</pubDate><description><![CDATA[它的检错能力远强于简单累加和，且硬件/软件实现都很快，所以串口、Modbus、CAN 总线全在用它。不同的组合就是不同的 CRC 变体，算出来的值完全不同。（0x8005 的位倒序）。收发两端只要有一端把顺序写反，设备就会校验失败、静默丢帧，且这种问题串口工具看不出来——务必用上面的测试帧先自测。：把整帧数据当作一个超长的二进制数，用一个约定的"生成多项式"去模除它，得到的余数就是校验值。，这和大多数协议的"大端"习惯相反，是 Modbus 串口通信最常见的翻车点。算出 CRC 只完成了一半，]]></description><category></category></item><item><title><![CDATA[Java 并发集合：锁的众生相]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/169141648</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/169141648</guid><author>hai324314</author><pubDate>Mon, 26 Oct 2026 09:53:11 +0800</pubDate><description><![CDATA[集合锁类型读操作写操作Vectorsynchronized 方法加锁加锁Hashtablesynchronized 方法加锁加锁Stacksynchronized 方法（继承Vector）加锁加锁synchronized 包装加锁加锁ReentrantLock（写时复制）无锁加锁一把 ReentrantLock + 两个 Condition加锁加锁读写分锁（2 把 ReentrantLock）加锁加锁一把 ReentrantLock（扩容时短暂释放）]]></description><category></category></item><item><title><![CDATA[Android 设备锁定：Kiosk Mode 实战]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/168560522</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/168560522</guid><author>hai324314</author><pubDate>Tue, 20 Oct 2026 21:23:26 +0800</pubDate><description><![CDATA[关键点内容必备条件核心 API拦截 HOME不能直接拦截，但通过成为 launcher 绕开重启防御持久首选 launcher 重启后仍生效物理攻击拔电拦不住，但开机后仍在锁定页核心难点在于理解 Android 设备管理的权限层级（普通应用 → Device Admin → Device Owner → 系统 app），以及 Kiosk Mode 与 launcher 接管的关系。]]></description><category></category></item><item><title><![CDATA[把 Android App 打包成系统应用（System App）]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/168443128</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/168443128</guid><author>hai324314</author><pubDate>Mon, 19 Oct 2026 14:37:08 +0800</pubDate><description><![CDATA[系统应用必须用设备的 platform 私钥签名。签名后的 APK 要放到。配置目录权限644root:rootrestorecon后重启。必须声明。按这套流程走下来，看到和，就说明系统应用模式已经跑通。]]></description><category></category></item><item><title><![CDATA[从零实现一个支持跨进程（IPC）的自定义 Toast]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/168345302</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/168345302</guid><author>hai324314</author><pubDate>Sun, 18 Oct 2026 21:39:33 +0800</pubDate><description><![CDATA[ToastView这是最基础的"长得像 Toast 的东西"。AIDL 文件必须放在下，包名要和 Java/Kotlin 代码一致。/*** 回调接口：远程 Service 通过它把消息回传给客户端进程*/// 非基本类型参数必须标明方向：in 表示数据流向服务端// 即使同包，AIDL 也要求显式 import/*** 跨进程 Toast 服务（对应系统里的 NotificationManagerService）*//** 发一条消息，服务端会广播给所有已注册的客户端 */]]></description><category></category></item><item><title><![CDATA[LiveEventBusCore 跨 Activity 通讯源码解析]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/168126207</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/168126207</guid><author>hai324314</author><pubDate>Fri, 16 Oct 2026 11:47:54 +0800</pubDate><description><![CDATA[单例：全局共享消息通道。LiveEvent内部持有一个：所有订阅同一 key 的 Activity/Fragment 共享同一个LiveData。重写：把激活阈值从默认的STARTED降到CREATED，让 Activity 从onCreate起就能收到消息，且生命周期销毁后自动解绑。：在保留 LiveData 粘性的基础上，给普通observe增加“非粘性”语义。理解了这四点，就能明白为什么 Activity A 的一条post。]]></description><category></category></item><item><title><![CDATA[flatMapLatest：为什么它永远只认最新值？]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/167806331</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/167806331</guid><author>hai324314</author><pubDate>Tue, 13 Oct 2026 15:00:04 +0800</pubDate><description><![CDATA[flatMapLatest 会在新值到达时，立刻取消旧值对应的 Flow 收集，因此它天然适合"只有最新请求才有效"的场景；凡是旧结果可以丢弃的异步任务，优先考虑它。]]></description><category></category></item><item><title><![CDATA[Android 嵌套滑动冲突：内部拦截 vs 外部拦截实战]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/167684925</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/167684925</guid><author>hai324314</author><pubDate>Mon, 12 Oct 2026 12:13:47 +0800</pubDate><description><![CDATA[嵌套滑动冲突的解法可以归为两类：**外部拦截**（父 View 在 `onInterceptTouchEvent` 里决定要不要抢事件）和 **内部拦截**（子 View 在 `onTouchEvent` 里调用 `requestDisallowInterceptTouchEvent` 决定是否上交事件）。]]></description><category></category></item><item><title><![CDATA[Android View 事件分发：用“快递签收”看懂源码]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/167494772</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/167494772</guid><author>hai324314</author><pubDate>Sun, 11 Oct 2026 00:05:39 +0800</pubDate><description><![CDATA[触摸事件就像一份快递。`Activity` 发货 → `Window / DecorView` 转运 → `ViewGroup` 分拣 → `View` 签收。`dispatchTouchEvent` 是门卫，`onTouchEvent` 是签收人；`OnTouchListener` 是代收人；`ViewGroup` 还能半路截胡，子 View 可以贴“请勿代签”。]]></description><category></category></item><item><title><![CDATA[Chat 聊天模块功能总结]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/167485529</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/167485529</guid><author>hai324314</author><pubDate>Sat, 10 Oct 2026 13:42:57 +0800</pubDate><description><![CDATA[基于 Vue 2 + Element UI + WebSocket 的企业级即时通讯模块，支持单聊、群聊、审批消息推送、翻译等功能。文件大小限制 50MB，工具栏配置。]]></description><category></category></item><item><title><![CDATA[InputStage 责任链核心执行流程]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/167279694</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/167279694</guid><author>hai324314</author><pubDate>Fri, 09 Oct 2026 08:30:11 +0800</pubDate><description><![CDATA[`InputStage` 是 Android 输入事件分发中的**责任链处理器**，输入事件从链头开始依次经过每个 Stage，每个 Stage 决定自己处理还是传给下一个。]]></description><category></category></item><item><title><![CDATA[一个公式看懂动态跨表查找：P8 + VLOOKUP]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/167273741</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/167273741</guid><author>hai324314</author><pubDate>Thu, 08 Oct 2026 14:24:28 +0800</pubDate><description><![CDATA[如果工作表名里包含空格、特殊符号，或者和区域地址连在一起，Excel 要求用单引号包裹工作表名。VLOOKUP 的第三个参数表示返回查找区域中的第几列。这样整条公式向下填充时，查找的表名不会跟着变。把一段文本变成真正的 Excel 引用。加单引号是最稳妥的写法，所有表名都兼容。也就是说，查找哪个工作表，是由。，无论公式复制到哪里，都锁定在。这是整个公式最灵活的部分。列里找不到，公式会返回。如果想模糊匹配，可以改成。所以返回的是目标表中。]]></description><category></category></item><item><title><![CDATA[告别 5555：Android 11 无线调试连不上的原因与解法]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/166896611</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/166896611</guid><author>hai324314</author><pubDate>Wed, 30 Sep 2026 14:11:36 +0800</pubDate><description><![CDATA[Android 11 起，无线调试改用新的握手协议，**不再默认监听固定的 5555 端口**，端口号由系统随机分配。所以照着老教程直接连 5555，必然被拒。]]></description><category></category></item><item><title><![CDATA[子 View 被压小时，如何向父容器“告状“？——MEASURED_STATE_TOO_SMALL 向上传递机制]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/166840123</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/166840123</guid><author>hai324314</author><pubDate>Tue, 29 Sep 2026 12:12:56 +0800</pubDate><description><![CDATA[`MEASURED_STATE_TOO_SMALL = 0x01000000`，它占用测量结果高 8 位中的最低位，用来标记"子 View 想要的尺寸比父容器给的多"。]]></description><category></category></item><item><title><![CDATA[LruCache 图片浏览器内存缓存]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/166787471</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/166787471</guid><author>hai324314</author><pubDate>Mon, 28 Sep 2026 14:33:59 +0800</pubDate><description><![CDATA[两级缓存：可配合 `DiskLruCache` 实现内存 + 磁盘二级缓存。]]></description><category></category></item><item><title><![CDATA[Android 稀疏数组设计取舍：LongSparseLongArray 源码解析与 HashMap 对比]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/166784457</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/166784457</guid><author>hai324314</author><pubDate>Mon, 28 Sep 2026 11:33:11 +0800</pubDate><description><![CDATA[在一个每帧调用上千次、但缓存条目永远只有一两条的地方，这笔交易稳赚。选它的理由从来不是数组比哈希表快，而是——在元素极少的前提下，能用原始类型数组彻底消灭对象分配。]]></description><category></category></item><item><title><![CDATA[RecyclerView 缓存机制详解]]></title><link>https://blog.youkuaiyun.com/hai324314/article/details/166740928</link><guid>https://blog.youkuaiyun.com/hai324314/article/details/166740928</guid><author>hai324314</author><pubDate>Sun, 27 Sep 2026 22:23:22 +0800</pubDate><description><![CDATA[RecyclerView 缓存的所有设计都围绕一个问题： "这个 ViewHolder 还能不能信" 。]]></description><category></category></item></channel></rss>