完整题目 · 参考答案 · 个人表现点评 · 复习指南
A.onPause()→ B.onCreate()→ B.onStart()→ B.onResume()→ A.onStop()A.onStop()不会调用。
startService:独立生命周期,需 stopService/stopSelf停止。bindService:随绑定组件存活,所有客户端解绑后自动销毁。stopService和所有 unbindService,顺序不限。onUnbind和 onDestroy何时调用?哪个更好?onUnbind:最后一个客户端解绑时调用(无论服务是否还会运行),可返回 true以支持 onRebind。onDestroy:服务正常销毁时调用(包括解绑后无 start 标记、或 stopService)。onServiceDisconnected被调用。应置空服务引用,并可尝试重连。
bindService→ AMS(系统进程)。onCreate→ onBind。onBind返回的 IBinder 包装后回传给客户端。LoadedApk.ServiceDispatcher调用 ServiceConnection.onServiceConnected。Stub.asInterface(IBinder)如何区分同/跨进程?IBinder.queryLocalInterface,本地 Binder 返回自身 → 直接返回 Stub;跨进程返回 null→ 创建 Proxy 代理。
runOnUiThread。
TransactionTooLargeException(Binder 缓冲区 ~1MB)。SharedMemory、降低分辨率。ArrayMap<IBinder, IInterface>,通过 IBinder.linkToDeath注册死亡通知,客户端死亡时自动移除。
synchronized方法内调用客户端回调,客户端回调中又调用服务端同步方法 → 死锁。如何避免?oneway回调。
Parcelable接口。Book.aidl,内容 parcelable Book;(包名与 Java 类一致)。import ...Book;。Book.aidl编译会报错。oneway。final:修饰类/方法/变量(不可变)。finally:异常处理必执行块。finalize:GC 前回调(已废弃,JDK 9 标记为 @Deprecated)。ArrayList:数组实现,随机访问快 O(1),增删慢 O(n)(除非尾部)。LinkedList:双向链表,增删快 O(1)(两端),随机访问慢 O(n)。val变量真的不可变吗?val引用不可变,但指向的对象内容可修改(若对象可变)。
equals、hashCode、toString、componentN、copy。不生成 get/set(Kotlin 属性自带)。
val name: String? = null,调用 name.length会怎样?如何安全获取长度?name?.length或 name?.length ?: 0。
.let{}写法。
lateinit:可变属性,延迟赋值,适用于 DI 或非空变量晚些初始化(如 @Inject lateinit var)。by lazy:只读属性,首次访问时初始化,适用于一次性昂贵计算。launch:返回 Job,不携带结果,用于执行无需返回值的任务。async:返回 Deferred,可通过 await获取结果,用于并发计算。bindService到 onServiceConnected的系统流程知识(第6题)。final/finally/finalize基础缺失(第15-16题)。
AIDL 部分可以拿到及格偏上,但 Java/Kotlin 基础薄弱会影响整体评分。
建议针对短板刷题 + 读源码(ContextImpl等),一个月后可再次模拟面试。
重点补课清单: ① 第6题 bindService 系统流程 ② 第9题大Bitmap优化方案修正 ③ Java基础:final/finally/finalize、集合框架 ④ Kotlin:data class、lateinit vs lazy、协程基础。
ContextImpl.bindServiceCommon源码加深理解。