面試過程中,你知道這些小知識,將事半功倍

在平時我們面試的過程總總會遇到一些面試官問一些平時我們不怎麼注意的問題,當問出來的時候,面試者通常都是一臉懵逼,這和我想象中的不一樣阿,怎麼不按照套路出牌,當然一些小知識更能體現出你的細心和好學,以下分析20個面試中的小知識,共勉~.·
面試過程中,你知道這些小知識,將事半功倍
整理的這份PDF有從基礎到進階。含有BATJ.字節跳動面試專題,算法專題,高端技術專題,混合開發專題,java面試專題,Android,Java小知識,到性能優化.線程.View.OpenCV.NDK等應有盡有。還有輔之相關的視頻+學習筆記

(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
可以點擊關於我聯繫我獲取完整PDF和麪試準備路線
(VX:mm14525201314)

Android 面試幫助篇

1 、要做一個儘可能流暢的 ListView ,你平時在工作中如何進行優化的?

①Item 佈局,層級越少越好,使用 hierarchyview 工具查看優化 。
②複用 convertView
③使用 ViewHolder
④item 中有圖片時,異步加載
⑤快速滑動時,不加載圖片
⑥item 中有圖片時,應對圖片進行適當壓縮
⑦實現數據的分頁加載

2 、對於 Android的安全問題

①錯誤導出組件
② 參數校驗不嚴
③WebView 引入各種安全問題,webview 中的 js 注入
④不混淆、不防二次打包
⑤明文存儲關鍵信息
⑦ 錯誤使用 HTTPS
⑧山寨加密方法
⑨濫用權限、內存泄露、使用 debug 簽名

3 、如何縮減 APK 包大小?

代碼
保持良好的編程習慣,不要重複或者不用的代碼,謹慎添加 libs,移除使用不到的 libs。

使用 proguard 混淆代碼,它會對不用的代碼做優化,並且混淆後也能夠減少安裝包的大小。

native code 的部分,大多數情況下只需要支持 armabi 與 x86 的架構即可。如果非必須,可以考慮拿掉 x86 的部分。

資源
使用 Lint 工具查找沒有使用到的資源。去除不使用的圖片,String,XML 等等。assets 目錄下的資源請確保沒有用不上的文件。

生成 APK 的時候,aapt 工具本身會對 png 做優化,但是在此之前還可以使用其他工具如 tinypng 對圖片進行進一步的壓縮預處理。

jpeg 還是 png,根據需要做選擇,在某些時候 jpeg 可以減少圖片的體積。 對於9.png 的圖片,可拉伸區域儘量切小,另外可以通過使用 9.png 拉伸達到大圖效果的時候儘量不要使用整張大圖。

策略
有選擇性的提供 hdpi,xhdpi,xxhdpi 的圖片資源。建議優先提供 xhdpi 的圖片,對於 mdpi,ldpi 與 xxxhdpi 根據需要提供有差異的部分即可。

儘可能的重用已有的圖片資源。例如對稱的圖片,只需要提供一張,另外一張圖片可以通過代碼旋轉的方式實現。

能用代碼繪製實現的功能,儘量不要使用大量的圖片。例如減少使用多張圖片組成 animate-list 的 AnimationDrawable,這種方式提供了多張圖片很佔空間。

4 、Android 與服務器交互的方式中的對稱加密和非對稱加密是什麼?

對稱加密,就是加密和解密數據都是使用同一個 key,這方面的算法有 DES。

非對稱加密,加密和解密是使用不同的 key。發送數據之前要先和服務端約定生成公鑰和私鑰,使用公鑰加密的數據可以用私鑰解密,反之。這方面的算法有RSA。ssh 和 ssl 都是典型的非對稱加密

5丶設備橫豎屏切換的時候,接下來會發生什麼?

1、不設置 Activity 的 android:configChanges 時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設置 Activity 的 android:configChanges=”orientation”時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次

3、設置 Activity 的android:configChanges=”orientation|keyboardHidden”時,切
屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法

6、Android 啓動 Service 的兩種方式是什麼?

如果後臺服務開始後基本可以獨立運行的話,可以用 startService。音樂播放器就可以這樣用。它們會一直運行直到你調用 stopSelf 或者 stopService。你可以通過發送 Intent 或者接收 Intent 來與正在運行的後臺服務通信,但大部分時間,你只是啓動服務並讓它獨立運行。如果你需要與後臺服務通過一個持續的連接來比較頻繁地通信,建議使用 bind()。比如你需要定位服務不停地把更新後的地理位置傳給 UI。Binder 比 Intent 開發起來複雜一些,但如果真的需要,你也只能使用它。

startService:生命週期與調用者不同。啓動後若調用者未調用 stopService 而直接退出,Service 仍會運行

bindService:生命週期與調用者綁定,調用者一旦退出,Service 就會調用unBind->onDestroy

7 、談談你對 Android 中 Context 的理解?

Context:包含上下文信息(外部值) 的一個參數. Android 中的 Context 分三種,Application Context ,Activity Context ,Service Context.它描述的是一個應用程序環境的信息,通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作,例如:啓動一個 Activity,發送廣播,接受 Intent 信息等

8 、Service 的 onCreate 回調在 UI 線程中嗎?

Service 生命週期的各個回調和其他的應用組件一樣,是跑在主線程中,會影響到你的 UI 操作或者阻塞主線程中的其他事情

9 、請介紹下 AsyncTask 的內部實現,適用的場景是?

AsyncTask 內部也是 Handler 機制來完成的,只不過 Android 提供了執行框架來提供線程池來執行相應地任務,因爲線程池的大小問題,所以 AsyncTask 只應該用來執行耗時時間較短的任務,比如 HTTP 請求,大規模的下載和數據庫的更改不適用於AsyncTask,因爲會導致線程池堵塞,沒有線程來執行其他的任務,導致的情形是會發生 AsyncTask 根本執行不了的問題。

10 、對 binder 機制的理解?

binder 是一種 IPC 機制,進程間通訊的一種工具.Java 層可以利用 aidl 工具來實現相應的接口.

11 、Android 中進程間通信有哪些實現方式?

Intent,Binder(AIDL),Messenger,BroadcastReceiver

12 、介紹下實現一個自定義 view 的基本流程

1、自定義 View 的屬性 編寫 attr.xml 文件
2、在 layout 佈局文件中引用,同時引用命名空間
3、在 View 的構造方法中獲得我們自定義的屬性 ,在自定義控件中進行讀取(構
造方法拿到 attr.xml 文件值)
4、重寫 onMesure
5、重寫 onDraw

13 、Android 中 touch 事件的傳遞機制是怎樣的?

1 、 Touch 事 件 傳 遞 的 相 關 API 有 dispatchTouchEventonTouchEventonInterceptTouchEvent
2、Touch 事件相關的類有 View、ViewGroup、Activity
3、Touch 事件會被封裝成 MotionEvent 對象,該對象封裝了手勢按下、移動、鬆
開等動作
4、Touch 事件通常從 Activity#dispatchTouchEvent 發出,只要沒有被消費,會一
直往下傳遞,到最底層的 View。
5、如果 Touch 事件傳遞到的每個 View 都不消費事件,那麼 Touch 事件會反向向上傳遞,最終交由 Activity#onTouchEvent 處理.
6、onInterceptTouchEvent 爲 ViewGroup 特有,可以攔截事件.
7、Down 事件到來時,如果一個 View 沒有消費該事件,那麼後續的 MOVE/UP事件都不會再給它

14 、Android 多線程的實現方式有哪些?

Thread & AsyncTask
Thread 可以與 Loop 和 Handler 共用建立消息處理隊列
AsyncTask 可以作爲線程池並行處理多任務

15 、Android 開發中何時使用多進程?使用多進程的好處是什麼?

要想知道如何使用多進程,先要知道 Android 裏的多進程概念。一般情況下,一個應用程序就是一個進程,這個進程名稱就是應用程序包名。我們知道進程是系統分配資源和調度的基本單位,所以每個進程都有自己獨立的資源和內存空間,別的進程是不能任意訪問其他進程的內存和資源的。

那如何讓自己的應用擁有多個進程?

很簡單,我們的四大組件在 AndroidManifest 文件中註冊的時候,有個屬性是android:process,

1、這裏可以指定組件的所處的進程。默認就是應用的主進程。指定爲別的進程之後,系統在啓動這個組件的時候,就先創建(如果還沒創建的話)這個進程,然後再創建該組件。你可以重載 Application 類的onCreate 方法,打印出它的進程名稱,就可以清楚的看見了。再設置 android:process 屬性時候,有個地方需要

注意: 如果是 android:process=”:deamon”,以:開頭的名字,則表示這是一個應用程序的私有進程,否則它是一個全局進程。私有進程的進程名稱是會在冒號前自動加上包名,而全局進程則不會。一般我們都是有私有進程,很少使用全局進程。他們的具體區別不知道有沒有誰能補充一下。

2、使用多進程顯而易見的好處就是分擔主進程的內存壓力。我們的應用越做越大,內存越來越多,將一些獨立的組件放到不同的進程,它就不佔用主進程的內存空間了。當然還有其他好處,有心人會發現 Android 後臺進程裏有很多應用是多個進程的,因爲它們要常駐後臺,特別是即時通訊或者社交應用,不過現在多進程已經被用爛了。典型用法是在啓動一個不可見的輕量級私有進程,在後臺收發消息,或者做一些耗時的事情,或者開機啓動這個進程,然後做監聽等。還有就是防止主進程被殺守護進程,守護進程和主進程之間相互監視,有一方被殺就重新啓動它。應該還有還有其他好處,這裏就不多說了。

3、壞處的話,多佔用了系統的空間,大家都這麼用的話系統內存很容易佔滿而導致卡頓。消耗用戶的電量。應用程序架構會變複雜,應爲要處理多進程之間的通信。這裏又是另外一個問題了。

16 、ANR 是什麼?怎樣避免和解決 ANR?

ANR:Application Not Responding,即應用無響應

ANR 一般有三種類型:
1:KeyDispatchTimeout(5 seconds) –主要類型按鍵或觸摸事件在特定時間內無響應
2:BroadcastTimeout(10 seconds)BroadcastReceiver 在特定時間內無法處理完成
3:ServiceTimeout(20 seconds) –小概率類型Service 在特定的時間內無法處理完成

超時的原因一般有兩種:
(1)當前的事件沒有機會得到處理(UI 線程正在處理前一個事件沒有及時完成或者 looper 被某種原因阻塞住)
(2)當前的事件正在處理,但沒有及時完成UI 線程儘量只做跟 UI 相關的工作,耗時的工作(數據庫操作,I/O,連接網絡或者其他可能阻礙 UI 線程的操作)放入單獨的線程處理,儘量用 Handler 來處理UI thread 和 thread 之間的交互。

UI 線程主要包括如下:
Activity: onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()
AsyncTask:onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()
Mainthread handler: handleMessage(), post(runnable r)other

17 、Android 下解決滑動衝突的常見思路是什麼?

相關的滑動組件 重寫 onInterceptTouchEvent,然後判斷根據 xy 值,來決定是否要攔截當前操作

18 、如何把一個應用設置爲系統應用?

成爲系統應用,首先要在 對應設備的 Android 源碼 SDK 下編譯,編譯好之後:

此 Android 設備是 Debug 版本,並且已經 root,直接將此 apk 用 adb 工具push 到 system/app 或 system/priv-app 下即可。如果非 root 設備,需要編譯後重新燒寫設備鏡像即可。有些權限(如WRITE_SECURE_SETTINGS ),是不開放給第三方應用的,只能在對應設備源碼中編譯然後作爲系統 app 使用。

19 、Android 內存泄露研究

Android 內存泄漏指的是進程中某些對象(垃圾對象)已經沒有使用價值了,但是它們卻可以直接或間接地引用到 gc roots 導致無法被 GC 回收。無用的對象佔據着內存空間,使得實際可使用內存變小,形象地說法就是內存泄漏了。

場景
類的靜態變量持有大數據對象

靜態變量長期維持到大數據對象的引用,阻止垃圾回收。

非靜態內部類的靜態實例

非靜態內部類會維持一個到外部類實例的引用,如果非靜態內部類的實例是靜態的,就會間接長期維持着外部類的引用,阻止被回收掉。

資源對象未關閉
資源性對象如 Cursor、File、Socket,應該在使用後及時關閉。未在 finally 中關閉,會導致異常情況下資源對象未被釋放的隱患。

註冊對象未反註冊
未反註冊會導致觀察者列表裏維持着對象的引用,阻止垃圾回收。

Handler 臨時性內存泄露
Handler 通過 發送 Message 與 主 線程 交互, Message 發出 之後 是存儲 在MessageQueue 中的,有些 Message 也不是馬上就被處理的。在 Message 中存在一個 target,是 Handler 的一個引用,如果Message 在 Queue 中存在的時間越長,就會導致 Handler 無法被回收。如果 Handler 是非靜態的,則會導致 Activity 或者Service 不會被回收。

由於 AsyncTask 內部也是 Handler 機制,同樣存在內存泄漏的風險。此種內存泄露,一般是臨時性的。

20 、內存泄露檢測有什麼好方法?
檢測:

1、DDMS Heap 發現內存泄露
dataObject totalSize 的大小,是否穩定在一個範圍內,如果操作程序,不斷增加,說明內存泄露
2、使用 Heap Tool 進行內存快照前後對比BlankActivity 手動觸發 GC 進行前後對比,對象是否被及時回收

定位:

1、MAT 插件打開.hprof 具體定位內存泄露:
查看 histogram 項,選中某一個對象,查看它的 GC 引用鏈,因爲存在 GC 引用鏈的,說明無法回收
2、AndroidStudio 的 Allocation Tracker:
觀測到期間的內存分配,哪些對象被創建,什麼時候創建,從而準確定位

請查看完整的PDF版
(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
可以點擊關於我聯繫我獲取完整PDF
(VX:mm14525201314)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章