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