第一次視頻面試(歷時2小時)
- 簡短的自我介紹(涉及畢業院校,工作年限);
- 前幾家公司簡單的介紹下做過哪方面的項目;
- 你擅長的部分(架構,UI等等你肯定有一個擅長的吧?);
- 音視頻原理、編解碼
- 着重介紹一個項目你負責的部分以及架構
- mvp
- activity生命週期,區別
- onCreate:創建
- onStart:開啓
- onResume:展現
- onPause:暫停
- onStop:停止
- onDestory:銷燬
- activity4種啓動類型
- SingleInstance:單獨任務棧,該activity單獨佔用一個任務棧,相當於默認配置了一個單獨的TaskAffinity屬性
- SingleTask:站內複用,啓動時,如果當前任務棧中已經包含此activity,就清除該activity上面的activity,讓此activity處於棧頂,因此聲明週期不會走onCreate、onStart和onResume,但是會走onNewIntent,通過intent區分是不同的啓動;常用的場景是,從應用的主界面,跳轉到二級界面,再跳轉到三級界面,最後從界面條到主界面後,此時我們希望在按返回鍵就是退出界面而不是又回到二級界面,此時可以用站內複用
- SingleTop:獨佔頂端,啓動時,如果當前的activity已經在任務棧頂端,就不會重新創建,直接使用最頂端的activity,因此不會走聲明週期onCteate、onStart和onResume,但是會走onNewIntent,通過intent區分是不同的啓動;常用的場景是,一個應用可以通過多個方式啓動界面activity,如果當前已經在棧頂,在啓動的話就不會新建一個了。
- Standard:標準模式,每次啓動都會新建一個新的activity
- 另:啓動模式配置方法:
- 可以在manifest中設置launchMode
- 可以在代碼中通過intent.setFlag進行設置
- 啓動模式作用:
- 爲了避免每次啓動都新建activity,用完後銷燬,所以設計了activity的聲明週期和任務棧,當activity被創建和啓動後,都被放入了任務佔中,app啓動時系統會默認分配一個任務棧存放啓動的根activity
- 同一個任務棧,只要activity不是出於棧頂,其生命週期出於onPause狀態
- 任務棧的id是Integer類型的,自增的
- 新創建的activity會壓如棧頂,按back鍵會將棧頂的activity彈出,下面的activity會展現,回顧A->B->A跳轉聲明週期
- 如果想將不同的activity放入不同的任務棧管理,在manifest中對應的activity配置taskAffinity屬性,相同屬性的activity處於同一任務棧
- 場景應用:O公司遊戲空間應用需求開發時遇到問題:1.啓動遊戲空間主界面,再進入其二級界面,再按home鍵回到桌面,2.長按圖標進入應用詳情界面,在詳情界面有遊戲空間另一個入口,從此處進入遊戲空間主界面,3.此時按返回鍵,預期是返回應用詳情界面,實際是出現二級界面。原因是遊戲空間主界面是standard類型,第一次啓動,主界面壓入棧頂,進入二級界面,二級界面壓入棧頂;從應用詳情界面再次啓動時,又新增一個主界面到遊戲空間默認任務棧,所以此時從上到下下棧內情況是,主界面,二級界面,主界面。所以按返回鍵是進入二級界面而不是拉起應用詳情界面的任務棧。解決方案:將主界面設置爲SingleTask即可。
- service生命週期以及兩種不同啓動方式,對於生命週期的回調情況
- startService方式啓動,onCreate -> onStartCommand ,調用stop方式結束服務時,onDestory;重複多次startService時,onCreate不會每次都被調用,但每次都會走onStartCommand
- bindService方式啓動,onCreate -> onBind,調用unBindService結束綁定服務時,onUnbind -> onDestory;多次調用bingService時,onCreate和onBind不會被多次調用,服務的創建和綁定只會執行一次
- 另:IntentService,service是運行在主線程中的,當我們要使用服務進行耗時操作時,需要自己啓動服務並新建子線程做耗時操作,運行完成後還需要自己調用stopservice來結束服務,耗時操作什麼時候結束?什麼時候結束服務都比較麻煩;而谷歌提供的IntentService完美的解決了這個問題,和普通服務一樣啓動一個intentservice,在intentservice中重寫onHandleIntent方法,該方法是運行在子線程中的,可以進行耗時操作,運行完了之後會自動結束服務,無需主動調用stopservice
- 廣播有哪幾種,廣播的原理
- 普通廣播 :通過sendBroadcast(intent)來發送一個廣播,廣播可以在manifest中靜態註冊,也可以在代碼中動態註冊,靜態廣播始終慢於動態廣播
- 有序廣播:發送的廣播是有順序的,通過sendOrderBroadcast發送有序廣播,接收者priority值大的先接收,priority相同時,動態註冊的先接收;有序廣播可以被攔截,被修改
- 系統廣播:息屏廣播,網絡變化,電量變化等都會有系統廣播
- 應用內廣播:註冊廣播時,設置屬性exported爲false時,發送時設置權限並通過intent.setPackage設置包名可以實現應用內或者給制定應用發廣播;或者通過LocalBroadcastMannager發送應用內廣播,更加高效和安全
- 粘性廣播(廢棄)
- 項目中遇到的難點(不一定要多麼難,面試官着重看你的研究領域以及解決問題的能力)
- 引入到音視頻編解碼專業領域
- 在技術方面還有哪些興趣?最近在看哪些技術方面的書
- 你提升自己一般從什麼途徑
- 寫博客,自建github項目更新並維護
- 找出數組中數量超過一半元素算法複雜度越低越好(這個挺簡單、可以用map統計,可以排序然後取中間元素,我說的摩爾投票方法,這個是最優的O(1)複雜度)
- 字符串匹配,類似*?這種的正則符號的匹配算法
和一面同一天視頻2面(歷時2小時)
- 簡短的自我介紹
- 前幾家公司簡單的介紹下做過哪方面的項目,着重介紹一個項目架構
- git操作怎麼樣,上家公司有codereview嗎
- kotlin幾個操作符,let、run、apply、also的區別,內聯函數,擴展方法原理
- Glide緩存機制,okhttp源碼,Rxjava設計,Retrofit設計
- 圖片處理、大圖片加載有什麼技巧(縮放、壓縮、RegionDecoder局部加載)
- HashMap原理
- binder,aidl,跨進程通信方式,線程間通信方式,binder權鑑,ContentProvider用法
- 從點擊啓動圖標開始App的啓動過程
- 事件分發機制
- 自定義view流程
- Android消息機制,Looper,MessageQueue
- view繪製流程viewrootImpl那些,屏幕刷新機制(vsync,異步消息那些)、深點可以說下Surfaceflinger那些
- ThreadLocal
- Recyclerview 優化、item複用原理,和ListView區別
- Android開機涉及的過程
- 多線程實現方式,樂觀鎖、CAS、悲觀鎖,volatile
- AOP是什麼,在Android之中有哪些應用
- 死鎖以及產生的原因,HashMap多線程操作下爲什麼會死鎖
- 生產者消費者模型寫代碼(可以實現個消息隊列進行解耦)
4月上旬視頻3面 (歷時2小時)
- 前幾家公司簡單的介紹下做過哪方面的項目,着重介紹一個項目架構
- 項目中遇到的難點
- 挑簡歷裏的問了,帶入了我擅長的領域、圖像處理算法、四叉樹搜索區域,sobel、邊緣提取、低多邊形,字符畫生成算法
- 你擅長Android哪方面
- EventBus原理
- mvp,mvvm,組件化通信、插件化原理、多渠道打包、熱更新
- 類加載機制(雙親委派等等)
- 談談你知道的設計模式
- JVM的內存模型
- JVM垃圾回收機制以及算法
- Thread的幾種狀態
- 3個線程依次切換打印數字從1到100
- 複雜度去除單詞中多餘的空格順便奇數位單詞首字母大寫
4月上旬視頻4面:(歷時半小時)
1、簡短的自我介紹
2. 你是怎麼開始接觸Android的,學校裏做過哪些項目
3. 你在項目中遇到哪些難點 (又是這個問題- -,大廠聽說都愛問這個問題,這個老鐵們就八仙過海吧 - -)
4. 你認爲Android的未來發展 (千萬不要讓面試官認爲你是個左右搖擺的人)
5. 你在項目開發進行中中是出於主動還是被動,這個問題不明所以
6. 你UI界面優化的技巧
7. 你做項目時有什麼心得
8. 數據庫、操作系統(本人非科班,操作系統老老實實說不甚瞭解)
4月中旬Hr面 (電話幾分鐘)
- 薪資意向
- 目前其他offer有無
- 是否還會面其他公司
- 多長時間內會到崗
- 是否已經到北京14天(疫情非常時期,你懂得)