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