
核心28題1.Activity 生命周期 配置變更:切后臺再回來走哪些回調?旋轉屏幕 ViewModel 為什么不丟數據?切到后天應用生命周期onPause()-onStop()若被系統回收還會onSaveInstanceState()回到應用則會從onRestart()-onStart()-onResume()如果內存不足被殺死恢復時onCreate(savedInstanceState)會帶回Bundle因為viewModel存“與界面強相關但跨配置變更要保留的業務數據”比如緩存中已加載的界面商品數據stateFlow狀態ViewModel存在ViewModelStoreactivity的onRetainNonConfigurationInstance機制配置變更不銷毀所以旋轉屏幕后實例保留2.Activity 啟動模式:singleTop/singleTask怎么用?啟動方式顯示Intent同APP中跳轉比如從登錄界面跳轉到購物界面、隱式Intent跨APP比如打開系統相機、PendingIntent通知/Widget點擊singleTop棧頂復用適合搜索頁面連續搜不同詞避免疊一堆相同ActivitysingleTask棧內單例清除上面Activity適合購物車/首頁3.ViewModel 與 StateFlow:怎么把商品信息庫存收藏聚合成一個 UI State 給 Compose?UIState用data class ProductUiStare(val info: AsyncProduct, val stock: Int, val fav: Boolean)ViewModel內多個stateflow經combine組合成一個uiState: StateFlowProductUiStateCompose collectAsStateWithLifecycle()訂閱單一信源避免狀態不一致4.協程掛起本質:suspend是什么?Dispatchers.IO/Main分別干嘛?suspend是一個標記告訴 Kotlin 編譯器這個函數可能會暫停執行但不會阻塞線程。Dispatchers.Main:Android 主線程UI 線程Dispatchers.IO:共享的 IO 線程池Dispatchers.Default:CPU 密集型線程池5.協程作用域取消:viewModelScope/lifecycleScope為什么不會泄漏?viewModelScope/lifecycleScope綁定生命周期ViewModel clear / Lifecycle destroy 時自動 cancel 所有子協程杜絕泄漏——這是協程比Thread/AsyncTask安全的關鍵。6.Room 基本用法:Entity/Dao/Database怎么寫?為什么用 Room 不用裸 SQLite?7.Retrofit 協程:怎么定義接口?suspend怎么配合?GET(logistics/{no})Path(no)、Query(page)、Body order: OrderReq、POST。協程interface Api { GET suspend fun track(Path(no) no: String): TrackResp }Retrofit 原生支持suspend內部切到 OkHttp 異步并在協程恢復ViewModel 直接api.track(no)在viewModelScope調異常用try/catch或Result包裝。8.OkHttp 攔截器:有哪兩類?你用來干嘛?Application InterceptoraddInterceptor只走一次、不關心重定向/重試適合統一加 Header注入 SupabaseAuthorization: Bearer JWT/ anon key、打日志、改請求。Network InterceptoraddNetworkInterceptor每次真實網絡請求都走含重定向適合觀察真實流量、緩存控制。我們用HttpLoggingInterceptor僅 debug 自定義AuthInterceptor注入 TokenToken 失效經401攔截觸發刷新后重試原請求。9.內存泄漏:常見場景 怎么定位場景static持 Activity、單例持 View、Handler/Thread匿名內部類隱式持外部類、RxJava/Flow未取消、Context被長生命周期對象持有。排查LeakCanary 抓引用鏈、Profiler 抓 heap dump 用 MAT 看Retained Size大對象、對比兩次 dump 找只增不減的實例。10.集合選型:ArrayListvsLinkedList、HashMapvs ConcurrentHashMap底層結構 讀改寫復雜度 并發場景選 ConcurrentHashMap11.線程/鎖:synchronizedvsReentrantLockvs CAS;協程里用什么三者區別;協程內用Mutex.withLock(掛起非阻塞)12.JVM GC 基礎:可達性分析、年輕代/老年代、GC 為什么會卡從 GC Roots 不可達即死;分代回收;大對象頻繁創建觸發 GC 抖動掉幀----------------------以上是必會的下面是80%會的--------------------13.Repository 模式:為什么要有這一層?本地 Room 云端 Supabase 怎么聚合講清屏蔽數據源差異、單一可信源;getCartFlow先 emit 本地再合并遠端14.MVVM vs MVP:區別?為什么選 MVVMMVPPresenter 解耦但接口爆炸、雙向持有易泄漏。MVVMVM 暴露可觀察數據View 被動渲染DataBinding/Compose 天然契合。從 MVP 遷 MVVMMVI把散落的多個LiveData字段收斂為單一不可變UiState所有用戶操作發Intent如LoadProduct(skuId)、ToggleFavVM 歸約出新 StateCompose 純函數渲染杜絕多個字段各自更新導致的中間不一致。15.DataStore vs SharedPreferencesSP同步 API、主線程讀易 ANR、跨進程不可靠、無類型安全。DataStorePreferences/Proto基于協程Flow、異步、事務、類型安全、無 ANR。「鮮購優選」登錄 Token、是否首次引導 →DataStore(Preferences)Token 實際敏感值走EncryptedSharedPreferences主題/語言設置 →DataStore購物車/瀏覽歷史 → Room用戶隱私配置開關→EncryptedSharedPreferences。16.Compose 重組性能:上千商品卡片怎么不卡LazyColumn 惰性;remember/key/derivedStateOf縮小重組范圍;穩定類型17.事件分發三方法:dispatchTouchEvent/onInterceptTouchEvent/onTouchEvent返回值含義三個方法各自返回 true 的意義;能說一個滑動沖突處理思路(外部攔截法)18.WorkManager 場景:離線加購、網絡恢復自動同步怎么做Constraints(CONNECTED) enqueueUniqueWork 退避重試;知道它保證可靠后臺任務19.圖片 OOM 防護:列表大量圖怎么不爆內存Coil/Glide 按尺寸解碼、BitmapPool復用、RGB_565;配合LazyColumn回收 CDN 縮略圖20.導航 Navigation Compose:頁面跳轉/傳參/返回棧navController.navigate(detail/$id)、參數回傳用savedStateHandle、popUpTo清棧21.設計模式-單例:object單例的坑別持 Activity Context(用 Application);DCL 需 volatile;項目里SupabaseClient單例22.設計模式-觀察者/適配器/工廠:在哪體現Flow 訂閱觀察者;RetrofitConverter適配器;OkHttpBuilder建造者23.Kotlin 擴展/密封類:怎么用價格格式化/脫敏擴展;sealed建模 MVI 的 Intent/State,when窮舉防漏24.Hilt / 依賴注入:為什么用 DI 不用 newDI 本質是控制反轉IoC對象不自己new依賴而是由外部容器注入解耦、可測試、單一實例。用 Hilt 而非new① 自動管理作用域Singleton/ViewModelScoped復用實例② 構造變化時只改Inject一處 ③ 測試可TestInstallIn替換 Fake Repository如測試用內存 FakeSupabase④ 避免滿屏object/全局單例難測。25.廣播 vs 進程內事件:訂單推送為什么不用全局廣播傾向SharedFlow/StateFlow(類型安全、無序列化開銷、易追蹤),LocalBroadcastManager已廢棄---------------加分項目---------------26.性能優化工具鏈**:啟動/卡頓怎么量化27.安全基礎**:混淆不能混淆什么、證書鎖定28MVI 單向數據流:和 MVVM 區別