- 博客(38)
- 资源 (4)
- 收藏
- 关注
原创 AudioTrack 深度解析:从原理到实战
Android 里播声音的"最低层" API。ExoPlayer都在它之上封装了一层,只有当你需要时,才会直接面对它。
2026-11-10 12:06:18
306
原创 Android 四大 Interpolator 源码解析:从数学公式到速度曲线
*** 二次方减速插值器:等价于 DecelerateInterpolator,但用幂函数表达* f(t) = 1 - (1 - t)^p,p 越大后段减速越猛*/@Overridepower = 2时就是 DecelerateInterpolator,power = 3时后段减速更狠,视觉上更"利落"。
2026-11-04 09:36:42
612
原创 拆解 ComponentActivity.viewModels()
类型参数不再需要"运行时存在",自然也就绕开了擦除。一调用就把工厂造出来,那么"声明了但这次没用上"的情况就白付了这份开销。靠 lambda 把这一步推迟了,但这不代表可以自己在构造函数里直接写。返回带参数支持的工厂——延迟读取让多态在任何时候都成立。:函数体必须能搬到调用点,才可能带着具体类型一起搬。但"类型对不上"只是表层原因,真正有价值的是。:不能赋给变量,不能返回,不能传给非内联函数。,Kotlin 就会为它生成真正的函数对象(属性是在 lambda 里读的,读的时机是。
2026-11-02 17:01:08
631
原创 CRC-16/MODBUS 详解:原理 + Java 实现
它的检错能力远强于简单累加和,且硬件/软件实现都很快,所以串口、Modbus、CAN 总线全在用它。不同的组合就是不同的 CRC 变体,算出来的值完全不同。(0x8005 的位倒序)。收发两端只要有一端把顺序写反,设备就会校验失败、静默丢帧,且这种问题串口工具看不出来——务必用上面的测试帧先自测。:把整帧数据当作一个超长的二进制数,用一个约定的"生成多项式"去模除它,得到的余数就是校验值。,这和大多数协议的"大端"习惯相反,是 Modbus 串口通信最常见的翻车点。算出 CRC 只完成了一半,
2026-10-30 13:51:38
472
原创 Java 并发集合:锁的众生相
集合锁类型读操作写操作Vectorsynchronized 方法加锁加锁Hashtablesynchronized 方法加锁加锁Stacksynchronized 方法(继承Vector)加锁加锁synchronized 包装加锁加锁ReentrantLock(写时复制)无锁加锁一把 ReentrantLock + 两个 Condition加锁加锁读写分锁(2 把 ReentrantLock)加锁加锁一把 ReentrantLock(扩容时短暂释放)
2026-10-26 09:53:11
597
原创 Android 设备锁定:Kiosk Mode 实战
关键点内容必备条件核心 API拦截 HOME不能直接拦截,但通过成为 launcher 绕开重启防御持久首选 launcher 重启后仍生效物理攻击拔电拦不住,但开机后仍在锁定页核心难点在于理解 Android 设备管理的权限层级(普通应用 → Device Admin → Device Owner → 系统 app),以及 Kiosk Mode 与 launcher 接管的关系。
2026-10-20 21:23:26
317
2
原创 把 Android App 打包成系统应用(System App)
系统应用必须用设备的 platform 私钥签名。签名后的 APK 要放到。配置目录权限644root:rootrestorecon后重启。必须声明。按这套流程走下来,看到和,就说明系统应用模式已经跑通。
2026-10-19 14:37:08
397
原创 从零实现一个支持跨进程(IPC)的自定义 Toast
ToastView这是最基础的"长得像 Toast 的东西"。AIDL 文件必须放在下,包名要和 Java/Kotlin 代码一致。/*** 回调接口:远程 Service 通过它把消息回传给客户端进程*/// 非基本类型参数必须标明方向:in 表示数据流向服务端// 即使同包,AIDL 也要求显式 import/*** 跨进程 Toast 服务(对应系统里的 NotificationManagerService)*//** 发一条消息,服务端会广播给所有已注册的客户端 */
2026-10-18 21:39:33
1219
原创 LiveEventBusCore 跨 Activity 通讯源码解析
单例:全局共享消息通道。LiveEvent内部持有一个:所有订阅同一 key 的 Activity/Fragment 共享同一个LiveData。重写:把激活阈值从默认的STARTED降到CREATED,让 Activity 从onCreate起就能收到消息,且生命周期销毁后自动解绑。:在保留 LiveData 粘性的基础上,给普通observe增加“非粘性”语义。理解了这四点,就能明白为什么 Activity A 的一条post。
2026-10-16 11:47:54
261
原创 flatMapLatest:为什么它永远只认最新值?
flatMapLatest 会在新值到达时,立刻取消旧值对应的 Flow 收集,因此它天然适合"只有最新请求才有效"的场景;凡是旧结果可以丢弃的异步任务,优先考虑它。
2026-10-13 15:00:04
220
原创 Android 嵌套滑动冲突:内部拦截 vs 外部拦截实战
嵌套滑动冲突的解法可以归为两类:**外部拦截**(父 View 在 `onInterceptTouchEvent` 里决定要不要抢事件)和 **内部拦截**(子 View 在 `onTouchEvent` 里调用 `requestDisallowInterceptTouchEvent` 决定是否上交事件)。
2026-10-12 12:13:47
650
原创 Android View 事件分发:用“快递签收”看懂源码
触摸事件就像一份快递。`Activity` 发货 → `Window / DecorView` 转运 → `ViewGroup` 分拣 → `View` 签收。`dispatchTouchEvent` 是门卫,`onTouchEvent` 是签收人;`OnTouchListener` 是代收人;`ViewGroup` 还能半路截胡,子 View 可以贴“请勿代签”。
2026-10-11 00:05:39
941
原创 Chat 聊天模块功能总结
基于 Vue 2 + Element UI + WebSocket 的企业级即时通讯模块,支持单聊、群聊、审批消息推送、翻译等功能。文件大小限制 50MB,工具栏配置。
2026-10-10 13:42:57
275
原创 InputStage 责任链核心执行流程
`InputStage` 是 Android 输入事件分发中的**责任链处理器**,输入事件从链头开始依次经过每个 Stage,每个 Stage 决定自己处理还是传给下一个。
2026-10-09 08:30:11
566
原创 一个公式看懂动态跨表查找:P8 + VLOOKUP
如果工作表名里包含空格、特殊符号,或者和区域地址连在一起,Excel 要求用单引号包裹工作表名。VLOOKUP 的第三个参数表示返回查找区域中的第几列。这样整条公式向下填充时,查找的表名不会跟着变。把一段文本变成真正的 Excel 引用。加单引号是最稳妥的写法,所有表名都兼容。也就是说,查找哪个工作表,是由。,无论公式复制到哪里,都锁定在。这是整个公式最灵活的部分。列里找不到,公式会返回。如果想模糊匹配,可以改成。所以返回的是目标表中。
2026-10-08 14:24:28
475
原创 告别 5555:Android 11 无线调试连不上的原因与解法
Android 11 起,无线调试改用新的握手协议,**不再默认监听固定的 5555 端口**,端口号由系统随机分配。所以照着老教程直接连 5555,必然被拒。
2026-09-30 14:11:36
235
原创 子 View 被压小时,如何向父容器“告状“?——MEASURED_STATE_TOO_SMALL 向上传递机制
`MEASURED_STATE_TOO_SMALL = 0x01000000`,它占用测量结果高 8 位中的最低位,用来标记"子 View 想要的尺寸比父容器给的多"。
2026-09-29 12:12:56
352
原创 Android 稀疏数组设计取舍:LongSparseLongArray 源码解析与 HashMap 对比
在一个每帧调用上千次、但缓存条目永远只有一两条的地方,这笔交易稳赚。选它的理由从来不是数组比哈希表快,而是——在元素极少的前提下,能用原始类型数组彻底消灭对象分配。
2026-09-28 11:33:11
1055
原创 深入理解 Java 的四种引用:强引用、软引用、弱引用、虚引用
写 Java 时我们每天都在new答案取决于"谁在引用它,以及引用有多强"。JVM 把引用分为四个等级:强引用 > 软引用 > 弱引用 > 虚引用。下面逐个介绍,每讲完一种就给出对应的测试代码,跑一遍印象更深。
2026-09-24 10:36:28
340
原创 Android MeasureSpec 详解
MeasureSpec 是父容器向子 View 传递尺寸约束的唯一载体:一个 32 位 int,高 2 位是测量模式,低 30 位是测量尺寸。
2026-09-21 14:56:50
1141
原创 Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
zip 是严格按顺序一一配对(第 1 个配第 1 个,第 2 个配第 2 个),任一上游慢下来整体就等着;combine 是各自取最新值,谁快谁多都能跟上。要「配对」用 zip,要「组合状态」用 combine
2026-09-15 16:50:16
339
原创 FusibleFlow:Kotlin Flow 的融合机制原理
本文以 `FusibleFlow` 为核心,通过源码片段解析 Flow 的"融合"(fuse)优化:`flowOn` 如何触发融合、`fuse` 如何把多层上下文合并为一次线程切换,以及无法融合时 `ChannelFlow` 兜底方案(`collectTo`)的工作方式。
2026-09-13 16:23:59
1555
原创 Android WorkManager 笔记
本文档整理了 Android Jetpack `WorkManager` 的几种典型使用方式:同步阻塞任务、协程挂起任务、`Function` 函数式接口,以及任务状态映射的实现思路。
2026-09-10 21:10:15
266
原创 async 函数结果获取机制分析
async 的返回值最终存放在 JobSupport 的 state 字段中,await() 只是去读这个字段——读到了就直接返回(快路径);读不到就挂起自己,等协程完成回调把自己唤醒后再读一次(慢路径)。结果传递的本质是「共享状态 + 完成回调」,不是消息推送。
2026-09-10 02:20:24
196
原创 Kotlin 协程作用域源码剖析
GlobalScope、MainScope、lifecycleScope、viewModelScope 四者的实现原理与正确使用姿势
2026-09-09 14:42:23
136
原创 Kotlin 协程上下文:从 plus 到 CombinedContext,彻底搞懂左偏结构
协程上下文(CoroutineContext)是 Kotlin 协程中用于承载调度器、异常处理器、命名参数等元素的不可变容器。它的内部实现采用左偏结构:合并时右侧(新加入)元素优先,相同 Key 的元素由右侧覆盖左侧。
2026-09-09 00:04:36
335
原创 Kotlin 协程:一文搞懂 CoroutineExceptionHandler 与 ContinuationInterceptor 的区别
执行时序:拦截器贯穿全程,异常处理器最后出场。
2026-09-08 00:04:37
400
原创 Messenger:Android 最轻量的 IPC 方式
Messenger 就是 Handler 的"跨进程版",一端发消息、一端 Handler 处理,双向通信靠 replyTo 贴地址
2026-09-08 00:02:32
733
原创 不用 AIDL,手把手教你手写 Binder 代理类
在日常 Android 开发中,我们习惯了用 AIDL 来定义跨进程接口。但 AIDL 本质上只是一个代码生成工具,它自动生成的 Stub 和 Proxy 类完全可以手写。理解手写 Binder 的过程,能帮助你深入掌握 Android IPC 机制的核心原理
2026-09-07 00:02:40
1531
原创 Kotlin 协程上下文(CoroutineContext)深度解析
普通 Job 遇到子协程异常会向上传播取消,而 SupervisorJob 对非 CancellationException 异常返回 false,实现异常隔离。
2026-09-06 12:44:00
311
原创 SendChannel 与 ReceiveChannel 通信机制
Channel 的设计灵感来源于 Java 中的 BlockingQueue,但其专为非阻塞挂起协程而设计。
2026-09-06 00:55:28
615
图书管理系统数据库文件
2010-05-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅