- 博客(2888)
- 资源 (15)
- 收藏
- 关注
原创 第130篇WorkManager:后台任务的最终归宿
它的核心能力只有三样——。。每次面试讲到 WorkManager,都有人栽在追问上。这篇把追问最密集的地方提前标出来。
2026-10-09 05:56:12
8
原创 第129篇前台服务与后台限制:通知与省电的平衡
代价是必须持续展示通知(Android 14 起还有声明与运行时权限要求),以及后台启动受严格限制。——答出这层理解,才算过了这题。前台服务与后台限制这题的答案可以很短,也可以很长——这篇把它讲成有层次的长答案。
2026-10-09 05:55:25
5
原创 第128篇Service 生命周期:started 与 bound 两条线
走onCreate→onBind→;走onCreate→。这两条能立住,后面的线程、进程、后台限制就都能挂上。Service 生命周期这题的主角是 Service:它是什么、底层怎么运转、真实项目里长什么样,层层往下讲。
2026-10-09 05:54:40
7
原创 第127篇ViewPager2 与 Fragment:懒加载的正确实现
页面项由托管,Fragment 的生命周期由它按可见性自动触发。所以"RecyclerView 复用"的那套坑——getItemId的抖动——在 ViewPager2 上同样存在,。ViewPager2 相比旧版 ViewPager 的改进不只是 API 变化,这题的坑都在边界上,逐个踩一遍才算真懂。
2026-10-09 05:53:49
5
原创 第125篇Fragment 通信演进:从接口回调到共享 ViewModel
成常量放在一个文件里,避免拼写不一致导致静默收不到;② 共享 ViewModel 只放"领域数据 + 事件",不持有 View/Context;③ 单测覆盖"先发后收"的时序,这是 Result API 最核心也最容易退化的地方。
2026-10-09 05:51:56
3
原创 第124篇Fragment 生命周期:与 Activity 的联动陷阱
最需要立住的一句话是「到之间,视图生命周期开始,Fragment 实例还在;onDestroy之后视图才彻底消失」。围绕这条主线,配置变更行为、内存与线程约束都能自然挂上去。Fragment 生命周期看起来简单,追问起来全是细节。这篇把它掰开揉碎,从概念到坑点过一遍。
2026-10-09 05:50:17
4
原创 第123篇状态保存与恢复:onSaveInstanceState 的时机
Activity 状态保存走拿到的 Bundle,有约 1MB 的事务上限,任何大对象进去都会在提交时抛。这一关立住了,后面全是取舍。这篇面试里聊到状态保存与恢复,最怕只背结论。要答好,得先知道常见的错误长什么样,再反向把正确姿势讲清。
2026-10-09 05:38:52
137
原创 第122篇 Activity 启动模式:standard 到 singleInstance
上一节讲生命周期,这一节讲"Activity 是怎么被放进栈里的"。启动模式是 Android 框架层里的一块——因为它的行为由"系统、任务栈、launchMode、Intent flags 四者共同决定",只讲launchMode的四个枚举值,等于只讲了四分之一。标题说"你要答账",指的就是把这四层都算进去。launchMode有standard(默认)、singleTopsingleTask(已废弃,不该再用)。但,所以真正要掌握的是standardsingleTopsingleTask)与。
2026-10-09 05:26:13
86
原创 第121篇 Activity 生命周期全解:七个回调的成对关系
Kotlin 语言线到此收尾,从这一篇开始进入 Android 框架层。第一个切入口就是 Activity 生命周期——它看起来是最基础的八道题,但面试里真正能区分人的是这两层。先把结论放在前面:Activity 生命周期有。onCreateonStartonResumeonPauseonStoponDestroy)描述界面从创建到销毁;)描述"Activity 对象可能还在但系统随时会杀掉进程"这件事带来的状态保存问题。面试里绝大多数人只会背第一组,第二组才是分水岭。
2026-10-09 05:24:47
6
原创 第120篇 tailrec 与尾递归:递归优化的编译期支持
所以尾递归只适用于"结果可以在递归过程中线性累积"的问题——像求和、遍历计数、状态机转移。而"路径搜索""回溯""分治后需合并结构"这类问题,递归结果之间存在依赖,无法线性累积,尾调用优化帮不上忙。
2026-10-08 22:42:16
10
原创 第119篇 扩展属性与扩展伴生:工具方法的进阶形态
扩展函数前面讲过(070 篇),这一节讲它的"孪生兄弟"——。这两个话题面试里问得不多,但一旦问了,能答上来的候选人很少,因为它触及"Kotlin 编译期到底做了什么"这一层。。它本质上是一个,每次访问都调用一次 getter;var形式的扩展属性则对应 getter + setter 一对方法。所以扩展属性保存状态,每次读都是一次计算——这是它与普通属性的根本差别。扩展伴生对象则是给"某个类的伴生对象"补扩展方法,语法上写作,用来给别人的类加静态方法而不用改动原类。
2026-10-08 22:41:17
10
原创 第118篇 const 与编译期常量:延迟初始化之外的第三个选择
const val是 Kotlin 里最简单的一个关键字,也是最容易暴露"只用过、没理解"的点。面试里问"编译期常量是什么意思",能答"编译时直接替换、不进内存"是及格;能答清才是高分——而那个坑在真实项目里造成过线上事故。const val的值在,编译产物里。——一旦某个库里的const常量值发生变化,依赖方即使不重新编译,运行时拿到的也还是旧值(因为旧值已经内联进它的字节码了)。这与 Java 的恰好相反,是这一题最值得讲清楚的地方。
2026-10-08 22:40:16
10
原创 第117篇 Kotlin 阶段面试通关地图:高频题怎么连成网
一张图:六大知识块 × 三层深度,按"会用 / 懂机制 / 能取舍"分清保底分与区分度,协程 + Flow 占复习权重的 40% 以上。一个模板:每个知识点都备"定义 → 机制 → 项目案例"三层答案,第三层(真实案例)最拉差距。三个坑:知识零散连不成网、只准备第一层、把项目经验讲成 API 调用序列——多数候选人恰恰栽在后两者。一个工具:用把知识点结构化(所属块 + 深度 + 追问跳转 + 项目案例),靠jumps和caseRef两个字段自检薄弱区。
2026-10-08 07:46:35
88
原创 第116篇 Kotlin 代码评审清单:团队规范与静态检查
前面几节讲的是"怎么写",这一节讲"怎么保证团队写出来的代码跟你一样好"。这题的面试形态很特别——它不考语法也不考 API,考的是。答得浅的人说"团队 review 很严格",答得深的人会讲清"哪些交给机器、哪些必须留给人,以及告警怎么管"。先把结论放在前面:Kotlin 代码质量保障分三层,。①工具层:ktlint(格式)、detekt(潜在缺陷)、Kotlin 编译器警告——;②约定层:团队规范文档 + PR 模板 + 关键检查项——;③设计层:架构边界、抽象选择、命名语义——。。
2026-10-08 07:45:33
15
原创 第115篇 卫语句与早返回:可读性重构实战
它的价值不在语法,而在于把"正常路径"和"异常路径"在视觉上分开,从而降低嵌套深度与认知负担。先把结论放在前面:卫语句的本质是。?与let做空值卫语句、?(Elvis)做默认值/早返回、requirecheckerror做显式契约。判据很简单——。
2026-10-08 07:36:33
11
原创 第114篇 函数式编程思维:纯函数与副作用管理
这是 Kotlin 语言线的收尾。前面讲的具体特性(作用域函数、集合流水线、sealed、value class)背后其实是同一套思维方式——。这一节把它作为"思维方法"讲清,因为它是所有 Kotlin 风格的源头。先把结论放在前面:函数式编程思维在 Android 侧不是"必须全面 FP",而是三条的纪律。①val优先,状态用不可变对象表达,变更就是"生成新状态"而非"改旧状态"。②。
2026-10-08 07:35:46
19
原创 第113篇 Compose 与 Kotlin 特性:为什么 Compose 离不开 Kotlin
前面第 103 篇讲过 DSL 的三个语言特性,这一节把它们落到 Compose 上——因为 Compose 是 Kotlin 特性最集中的体现场:带接收者的 Lambda、注解、编译器插件、状态模型。面试里问"Compose 和 Kotlin 什么关系",答得浅的人说"Compose 是新的 UI 框架",答得深的人会讲清楚。先把结论放在前面:Compose 的"声明式"能成立,靠的正是上一节讲的 DSL 三特性(带接收者 lambda + 扩展函数 + 尾随语法),再叠加提供的两项能力——①。
2026-10-08 07:34:55
121
原创 第112篇 Kotlin 2.x 演进:K2 编译器带来了什么
前面几节讲的是语言特性,这一节讲。这类题的形态通常是:"Kotlin 2.0 带来了什么?K2 是什么?升级要注意什么?"答得好不好,取决于能不能把"编译器重写"这件事和日常开发体验连起来,而不是背发布说明。先把结论放在前面:Kotlin 2.0 的核心是(Kotlin Frontend 全面重写)与。K2 带来的收益是(大型工程增量编译体感明显)与;伴随的代价是。guard条件、上下文接收者(Context Receivers)进入实验、集合字面量注解等。
2026-10-08 07:33:50
9
原创 第110篇 Flow 与 RxJava 对比:响应式迁移指南
前面几节把 Flow 的操作符、状态流、生命周期都讲完了,这一节做一次横向对照:Flow 和 RxJava 到底什么关系、能不能互相替代、迁移时哪些地方会踩坑。面试里这题很常见,因为它考的是"你是否理解两者的设计取向",而不是 API 记忆。先把结论放在前面:两者。RxJava 是"响应式流 + 背压策略"体系,核心对象是Flowable(支持背压)与Observable(不支持);Flow 是"协程 + 挂起函数"体系,靠emit天然挂起实现背压,没有枚举。结论有三层:①(网络流、状态流、UI 事件)
2026-10-07 23:53:53
18
原创 第109篇 Mutex 与信号量:协程世界的锁
上一节讲 Channel 是怎么传数据的,这一节讲共享资源怎么保护。在 Java 里管用,是因为"线程"既是执行单位也是互斥单位;协程世界里执行单位是协程、跑在线程池上,同一个块可能由不同线程执行——这直接导致在协程里。这一节讲清 Mutex、信号量,以及这套机制在 Android 里的实际落点。先把结论放在前面:synchronized(编译器会直接报错,因为它持锁时会跨越挂起点)。协程环境下的互斥要用Mutex;限制并发数要用Semaphore。两者都由提供。
2026-10-07 23:53:12
17
原创 第108篇 Channel 与 select:协程间通信
上一节讲协程与线程的性能差别,这一节讲协程之间怎么传数据。Channel是协程世界里最基础的原语之一——比 Flow 更底层、比回调更结构化。面试里问它的追问往往很刁:Channel 和 Flow 到底什么关系、send满了会怎样、select解决了什么问题、什么时候该用Channel而不是Flow。这一节把这些一次讲清。先把结论放在前面:ChannelFlow。Channel 有明确的容量(capacity)与缓冲策略(),满了会挂起发送方或丢弃;Flow 没有容量概念,靠emit的挂起实现背压。
2026-10-07 23:52:32
10
原创 第107篇 协程与线程性能对比:为什么更轻
面试里问"协程和线程的性能区别",十个人里有八个会答"协程更轻量,所以更快"——这句话半对半错,说错的那一半正是这一题要考的坑。先把结论放在前面:协程的"轻量"体现在上,不体现在"单个任务跑得更快"上。协程的创建是分配一个对象 + 一次状态机初始化,切换发生在——编译器把suspend点的状态写进 continuation 对象,恢复时读回来,全程不进内核、不做上下文切换、不刷新 CPU 缓存。线程切换则要走内核调度、切换栈与寄存器上下文。
2026-10-07 23:51:49
7
原创 第106篇 data class 的 equals 与 copy:深浅拷贝的坑
data class自动生成的equalshashCodetoStringcopycomponentN。它看起来是"语法糖",但——尤其是可变集合参与equals、以及copy后共享同一份可变对象这两件事,在项目里出问题的频率相当高。data class自动生成的equals只比较(按声明顺序逐个用==比较),是内容的)。copy是"逐字段取旧值、覆盖指定字段"的新实例,——被复用的可变对象仍是同一份引用。这两条决定了它的正确用法:immutable data class 用copy。
2026-10-07 23:51:02
9
原创 第105篇 Kotlin 编译期陷阱:Companion、默认参数与混淆
前面几节讲的是"怎么用",这一节讲"为什么会出事"。Kotlin 编译期陷阱的特点是——代码能编译、测试也可能过,但上到特定环境(混淆、序列化、多进程、泛型擦除)才暴露。面试里问"你踩过哪些 Kotlin 的坑",答不出的解释,就只是背诵。先把结论放在前面:Kotlin 的编译期陷阱集中在五个来源。①:自动生成的方法被 R8 改名/移除,JSON 反射失配。②:注解不强制。③is检查与reified的边界。④:类加载时机与@JvmStatic的位置。⑤:上一节讲过装箱,本节补充它与混淆、序列化的交互。
2026-10-07 23:50:12
10
原创 第104篇 Kotlin 惯用法精选:一行替代十行 Java
这一题的面试形态往往不是"讲讲 Kotlin 有什么惯用法",而是给一段代码问"这段可以怎么改",或者直接问"你在项目里怎么用 Kotlin 写得更 Kotlin"。答好这一题,靠的是知道每种惯用法和——只罗列语法没用。先把结论放在前面:值得内化的 Kotlin 惯用法可以分成五组,每组解决一类问题。①??letrunalsoapply)——把 null 处理与副作用控制显式化;②mapfilterfoldbuildList)——用声明式替代可变循环;③——let管 null、run管计算、apply。
2026-10-07 23:49:29
11
原创 第103篇 DSL 构建原理:type-safe builder 如何工作
Kotlin 的 DSL 能力是它最容易被高估也最容易被低估的特性。面试里常见两种问法:一种是"用 Kotlin 写一个 DSL 需要什么"(答:带接收者的 lambda + 扩展函数 + 尾随语法),另一种是"项目里的 DSL 框架是怎么设计的"(这才是真问题)。上一节讲的是运行时反射,这一节讲的编译期结构替换——两者正好是 Kotlin 的两极。先把结论放在前面:Kotlin DSL 的底层,只靠三个语言特性组合实现。①)让it变成this,从而在作用域内直接访问接收者的成员;②。
2026-10-07 23:48:31
15
原创 第102篇 Kotlin 反射与 KClass:运行时元编程
反射在 Kotlin/Java 面试里的出场率很高,但绝大多数人只停留在"能拿到 Class、调用方法"。依赖意味着什么、遇到反射会怎样、以及 R8 混淆之后反射还能不能用。这一节专挑这些"埋得很深"的部分。先把结论放在前面:Kotlin 的KClass提供 JavaClass之上的一层(属性、函数、构造函数、泛型参数),但它需要独立的依赖,而 Java 反射只需要 JDK 自带的。;需要读属性名/泛型/注解默认值时再用 KClass。
2026-10-07 23:47:41
132
原创 第100篇 密封类加 when 的状态机:ViewModel 状态范式
前面几节讲的是"数据怎么流动",这一节讲"状态怎么组织"。在 Kotlin 里最常见的用途就是建模状态机——把界面/业务可能处于的若干种状态显式列出来,让编译器帮你检查所有分支。上一节的属性委托是"怎么存",这一节是"有哪些状态以及怎么在状态间迁移"。先把结论放在前面:这一题的核心不是语法,而是。①:所有可能状态必须写进 sealed 的子类或 object 分支,漏一个编译器就报错。②:同一时刻只能处于一个状态,用 sealed 的互斥结构保证,而不是靠多个可空字段拼凑。③。
2026-10-06 03:00:56
87
原创 第099篇 属性委托实战:SharedPreferences 的现代写法
前面几节把属性委托的机制讲完了——getValuesetValue运算符重载、标准库里的lazyobservablevetoable。。面试里这题被答好的比例不高,原因很直接——大多数人只知道by lazy,一旦要求"用委托把 SharedPreferences 包成属性"就卡住。先把结论放在前面:属性委托的价值是。适用前提有三条:①这个状态有自己的存储位置(SP、DataStore、MMKV、内存、Bundle);②读写前后需要加工(加密、默认值、类型转换、埋点);③同一份读写逻辑要在多处复用。
2026-10-06 02:59:38
21
原创 第098篇 空安全与 Java 混编:平台类型的风险控制
Kotlin 的可空类型是编译期检查,可 Java 侧的代码、第三方 SDK 的字节码、以及各种反射/序列化路径都不受这套检查保护。面试里问"你怎么保证混编项目里不出现 NPE",背"用?和?"是及格线,能讲清在哪、该怎么设防,才是及格线以上。先把结论放在前面:混编工程里的空安全是,缺一层就会漏。①类型层:Kotlin 侧尽量用非空类型,把可能为空的返回值包进Result/sealed;②断言层:对 Java 与第三方返回值或包成 Kotlin 非空类型),把风险挡在边界;③约定层:禁止在项目里裸用!
2026-10-06 02:58:42
106
原创 第096篇 协程与生命周期:repeatOnLifecycle 的正确用法
这是初级与高级候选人的分水岭——初级答"用",高级答"为什么是而不是Fragment、为什么不能只用就完事、到底解决了什么、配置变更重建时协程怎么活下来"。先把结论放在前面:Android 侧有——进程生命周期、Fragment生命周期、生命周期。协程该绑哪个,取决于协程任务用到了什么:只用到Fragment自身(如 ViewModel 数据)绑;只要碰 View(渲染、控件、动画)就必须绑。这是唯一需要记牢的判据,其余都是从它推出来的。
2026-10-06 02:56:33
160
原创 第095篇 Flow 操作符进阶:debounce 与 combine
上一节把 StateFlow 与 SharedFlow 的分工讲清了,这一节继续往下走操作符层。面试里 Flow 操作符的追问有一个共同特点:代码能跑,所以"看起来没问题",但线上会出现延迟、丢数据、重复请求这类症状。能答出"为什么这个操作符放在这里会出问题"的候选人,比能背出操作符清单的候选人高一个档次。这一节按"分类 → 位置 → 语义"三条线把常用操作符过一遍。先把结论放在前面:Flow 操作符按作用分四类——mapfilter)、combinezipmerge)、onEachonStart。
2026-10-06 02:55:28
8
原创 第094篇 StateFlow 与 SharedFlow:UI 状态分发的标配
StateFlow和SharedFlow。它们的 API 只有几行,但面试官的问题往往在"什么时候不该用"上:为什么 StateFlow 适合做 UI 状态、为什么它不适合弹一次性的提示、replay 到底重放什么、两个界面临时停订阅会怎样。这一节把这几个追问一次性讲透。StateFlow是的——它始终持有一个value,新收集者立刻收到当前值(replay=1 语义),并且(用equals比较);SharedFlow是的——它不持有值,可配replay=0。
2026-10-06 02:53:32
15
原创 第093篇 Flow 入门:冷流、热流与背压
上一节收在异常处理,本节开始一个新主题:为什么需要 Flow、它和 RxJava 的 Flowable 差在哪、冷流为什么"有订阅才生产"、以及collect与"直接在协程里 while 循环读队列"到底差在哪里。这题常被当成热身,但面试官往往在最后一句追问里放一个能筛掉人的问题:同一个 Flow 连续 collect 两次会怎样。先把结论放在前面:Flow 是三件事的组合。冷流意味着每个收集者都独立触发一次上游生产(和热流相对);一对一意味着collect是suspend函数、发射不能并发;
2026-10-06 02:52:17
17
原创 第092篇 协程异常处理:从 try-catch 到 CoroutineExceptionHandler
协程里最贵的 bug 不是崩溃,是"静默地不干活"。上一节把 Job 的取消传播讲清了,本节顺着异常这条线往下走:异常从协程抛出后经过哪些环节、到哪儿被接住、为什么要特殊对待、以及究竟在什么位置生效。这题在面试里的分层非常明显——只答"用 try/catch"是入门,能把传播路径和取消语义讲完整,才算过了这一关。先把结论放在前面:协程异常处理有三条主线。①launch的异常会取消父 Job 并向上抛,async的异常被Deferred持有、需await()才会重新抛出;②是协程的正常终止信号,不该被。
2026-10-06 02:51:02
9
原创 第091篇 Job 与 SupervisorJob:异常传播的分水岭
结构化并发讲的是"任务属于谁",而 Job 是这套体系里真正干活的那一层:它记录任务状态、持有取消句柄、决定异常往哪传。上一节把作用域树画出来之后,自然要问一句——树上每根枝干到底是什么在撑着?答案就是 Job。更常见的问法是:普通Job和差在哪、什么时候该用后者、用了之后异常又从哪冒出来。这一题答得好,靠的不是背 API,而是把"失败级联"这件事在真实业务里演算一遍。Job是协程的身份与状态载体,普通Job之间是父子关系,子协程失败会把异常抛给父,父随之取消,连带所有兄弟;
2026-10-06 02:49:35
19
android7.0 源代码
2018-06-30
最新知更鸟begin5.2官方完美版
2018-10-27
N皇后问题 C程序设计
2008-12-29
移动开发Android高频面试题库:涵盖Compose、Kotlin协程、Binder、性能优化及架构设计核心知识点解析
2026-07-04
coding-copilot-jetbrains-4.9.29148844-17541489
2026-06-26
textgen-main
2026-06-05
ollama-main
2026-06-05
vllm-project/vllm
2026-06-05
browser-use-main
2026-06-05
AutoGPT-master
2026-06-05
openclaw-main
2026-06-05
LM-Studio-0.4.16-1-x64.exe
2026-06-05
CodeGeeX4-main
2026-06-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅