主頁 > 移動端開發 > 2021新型面試題-血虐面試官斬獲位元組跳動Offer!Android 精選版面試題級答案(Android+Java+演算法+性能優化+四大組件...)

2021新型面試題-血虐面試官斬獲位元組跳動Offer!Android 精選版面試題級答案(Android+Java+演算法+性能優化+四大組件...)

2021-04-02 09:00:42 移動端開發

前言

雙非本科,自認為技術水平不差,8月從美圖實習離職回學校,各種倒霉的事不斷,到現在11月,為了找個好的環境復習,9月又在學校附近租了房,基本是沒有面試通知就學不進去,前面由于過于自信,也沒拿個保底的offer,也只去湖大跑過一次58到家的宣講會,各種面試基本二面掛,最慘的一次的就是美團電話一面后,面試官要我去北京現場面(后來才知道原來美團在長沙和武漢都是有面試點的),還一毛錢沒給報銷,當時**怕不去就沒面試機會了,

9.20那天一個人從長沙跑到北京去面試美團,

20號晚上到了北京,差點露宿街頭,各種賓館酒店滿人,電話打不通, 凌晨3點鐘還在外面找地方住,最后打了個滴滴,司機帶著我滿城找地方住,最后找到了個破賓館的三人間(跟廁所一樣臭),然后第2天沒吃飯就去面試了,面了一輪就被打發回去了,然后當天晚上回武漢已是凌晨2點,

倒霉的又遇到黑車司機(一個穿黑衣的死胖子),50公里多的路居然要收我400多,去北京一趟來回各種花費估計3000左右,這學期學費還沒交,基本上秋招花的錢就是用的這期學費,自己都沒舍得買點啥,吃點啥,各種武漢長沙來回跑,也跑過廣州,真心累,好在最后拿到了位元組跳動Offer, 就此做個總結,希望能給學弟學妹們起到一點幫助,
在這里插入圖片描述

JAVA 相關

1.靜態內部類、內部類、匿名內部類,為什么內部類會持有外部類的參考?持有的參考是this?還是其它?
  • 靜態內部類:使用static修飾的內部類
  • 內部類:就是在某個類的內部又定義了一個類,內部類所嵌入的類稱為外部類
  • 匿名內部類:使用new生成的內部類
  • 因為內部類的產生依賴于外部類,持有的參考是類名.this
2.Java中try catch finally的執行順序

先執行try中代碼,如果發生例外執行catch中代碼,最后一定會執行finally中代碼

3.equals與==的區別:

==是判斷兩個變數或實體是不是指向同一個記憶體空間 equals是判斷兩個變數或實體所指向的記憶體空間的值是不是相

4.Object有哪些公用方法?
  • 方法equals測驗的是兩個物件是否相等
  • 方法clone進行物件拷貝
  • 方法getClass回傳和當前物件相關的Class物件
  • 方法notify,notifyall,wait都是用來對給定物件進行執行緒同步的
5.String、StringBuffer與StringBuilder的區別
  • String 型別和 StringBuffer 型別的主要性能區別其實在于 String 是不可變的物件
  • StringBuffer和StringBuilder底層是 char[]陣列實作的
  • StringBuffer是執行緒安全的,而StringBuilder是執行緒不安全的
6.Java的四種參考的區別
  • **強參考:**如果一個物件具有強參考,它就不會被垃圾回收器回收,即使當前記憶體空間不足,JVM 也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程式例外終止,如果想中斷強參考和某個物件之間的關聯,可以顯式地將參考賦值為null,這樣一來的話,JVM在合適的時間就會回收該物件

  • **軟參考:**在使用軟參考時,如果記憶體的空間足夠,軟參考就能繼續被使用,而不會被垃圾回收器回收,只有在記憶體不足時,軟參考才會被垃圾回收器回收,

  • **弱參考:**具有弱參考的物件擁有的生命周期更短暫,因為當 JVM 進行垃圾回收,一旦發現弱參考物件,無論當前記憶體空間是否充足,都會將弱參考回收,不過由于垃圾回收器是一個優先級較低的執行緒,所以并不一定能迅速發現弱參考物件

  • **虛參考:**顧名思義,就是形同虛設,如果一個物件僅持有虛參考,那么它相當于沒有參考,在任何時候都可能被垃圾回收器回收,

7.介紹垃圾回識訓制
  • 標記回收法: 遍歷物件圖并且記錄可到達的物件,以便洗掉不可到達的物件,一般使用單執行緒作業并且可能產生記憶體碎片

  • 標記-壓碩訓收法: 前期與第一種方法相同,只是多了一步,將所有的存活物件壓縮到記憶體的一端,這樣記憶體碎片就可以合成一大塊可再利用的記憶體區域,提高了記憶體利用率

  • 復制回收法: 把現有記憶體空間分成兩部分,gc運行時,它把可到達物件復制到另一半空間,再清空正在使用的空間的全部物件,這種方法適用于短生存期的物件,持續復制長生存期的物件則導致效率降低,

  • 分代回收發: 把記憶體空間分為兩個或者多個域,如年輕代和老年代,年輕代的特點是物件會很快被回收,因此在年輕代使用效率比較高的演算法,當一個物件經過幾次回收后依然存活,物件就會被放入稱為老年的記憶體空間,老年代則采取標記-壓縮演算法

集合、資料結構相關

1.你用過哪些集合類

資料結構中用于存盤資料的有哪些

  • 陣列

陣列存盤區間是連續的,占用記憶體嚴重,故空間復雜的很大,但陣列的二分查找時間復雜度小,為O(1);陣列的特點是:尋址容易,插入和洗掉困難;

  • 鏈表

鏈表存盤區間離散,占用記憶體比較寬松,故空間復雜度很小,但時間復雜度很大,達O(N),鏈表的特點是:尋址困難,插入和洗掉容易,

2.說說hashMap是怎樣實作的

哈希表:由陣列+鏈表組成的

當我們往HashMap中put元素的時候,先根據key的hashCode重新計算hash值,根據hash值得到這個元素在陣列中的位置(即下標)

如果陣列該位置上已經存放有其他元素了,那么在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾,

如果陣列該位置上沒有元素,就直接將該元素放到此陣列中的該位置上,

3.ArrayList,LinkedList的區別
  • ArrayList是實作了基于動態陣列的資料結構,LinkedList基于鏈表的資料結構,

  • 對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指標,

  • 對于新增和洗掉操作add和remove,LinedList比較占優勢,因為ArrayList要移動資料,

4.ArrayList和Vector的主要區別是什么?

ArrayList 和Vector底層是采用陣列方式存盤資料

  • Vector:

    • 執行緒同步

    • 當Vector中的元素超過它的初始大小時,Vector會將它的容量翻倍,

  • ArrayList:

    • 執行緒不同步,但性能很好

    • 當ArrayList中的元素超過它的初始大小時,ArrayList只增加50%的大小

5.HashMap和 HashTable 的區別:
  • HashTable比較老,是基于Dictionary 類實作的,HashTable 則是基于 Map介面實作的

  • HashTable 是執行緒安全的, HashMap 則是執行緒不安全的

  • HashMap可以讓你將空值作為一個表的條目的key或value

演算法相關

1.排序演算法和穩定性,快排什么時候情況最壞?
2.給最外層的rootview,把這個根視圖下的全部button背景設定成紅色,手寫代碼,不許用遞回

演算法原理:

  • Android的view視圖是按樹形結構分布,所以按樹形結構遍歷

  • 回圈判斷每一層的ViewGroup元素,將其入堆疊;否則判斷當前view是否是Button類實體,是則改寫背景色

  • 當前ViewGroup檢查childView完成后,判斷堆疊是否非空,取出堆疊頂元素ViewGroup重復步驟2直至堆疊為空,

Thread、AsynTask相關

1.wait()和sleep()的區別
  • sleep來自Thread類,和wait來自Object類

  • 呼叫sleep()方法的程序中,執行緒不會釋放物件鎖,而 呼叫 wait 方法執行緒會釋放物件鎖

  • sleep睡眠后不出讓系統資源,wait讓出系統資源其他執行緒可以占用CPU

  • sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒

2.若Activity已經銷毀,此時AsynTask執行完并且回傳結果,會報例外嗎?
  • 當一個App旋轉時,整個Activity會被銷毀和重建,當Activity重啟時,AsyncTask中對該Activity的參考是無效的,因此onPostExecute()就不會起作用,若AsynTask正在執行,折會報 view not attached to window manager 例外

  • 同樣也是生命周期的問題,在 Activity 的onDestory()方法中呼叫Asyntask.cancal方法,讓二者的生命周期同步

3.Activity銷毀但Task如果沒有銷毀掉,當Activity重啟時這個AsyncTask該如何解決?

還是螢屏旋轉這個例子,在重建Activity的時候,會回掉Activity.onRetainNonConfigurationInstance()重新傳遞一個新的物件給AsyncTask,完成參考的更新

4.Android 執行緒間通信有哪幾種方式(重要)
  • 共享記憶體(變數);
  • 檔案,資料庫;
  • Handler;
  • Java 里的 wait(),notify(),notifyAll()
5.請介紹下 AsyncTask的內部實作,適用的場景是
  • AsyncTask 內部也是 Handler 機制來完成的,只不過 Android 提供了執行框架來提供執行緒池來

  • 執行相應地任務,因為執行緒池的大小問題,所以 AsyncTask 只應該用來執行耗時時間較短的任務,

  • 比如 HTTP 請求,大規模的下載和資料庫的更改不適用于 AsyncTask,因為會導致執行緒池堵塞,沒有

  • 執行緒來執行其他的任務,導致的情形是會發生 AsyncTask 根本執行不了的問題,

網路相關

1.TCP三次握手
2.為什么TCP是可靠的,UDP早不可靠的?為什么UDP比TCP快?
  • TCP/IP協議高,因為其擁有三次握手雙向機制,這一機制保證校驗了資料,保證了他的可靠性,

  • UDP就沒有了,udp資訊發出后,不驗證是否到達對方,所以不可靠,

  • 但是就速度來說,還是UDP協議更高,畢竟其無需重復回傳驗證,只是一次性的

3.http協議了解多少,說說里面的協議頭部有哪些欄位?
  • http(超文本傳輸協議)是一個基于請求與回應模式的、無狀態的、應用層的協議;http請求由三部分組成,分別是:請求行、訊息報頭、請求正文,

  • HTTP訊息報頭包括普通報頭、請求報頭、回應報頭、物體報頭

4.https了解多少

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL,

5.談談 HTTP 中Get 和 Post 方法的區別
  • GET - 從指定的服務器中獲取資料,明文發送內容
  • POST - 提交資料給指定的服務器處理
  • POST請求不能被快取下來
  • POST請求不會保存在瀏覽器瀏覽記錄中
  • 以POST請求的URL無法保存為瀏覽器書簽
  • POST請求沒有長度限制
6.推送心跳包是TCP包還是UDP包或者HTTP包

心跳包的實作是呼叫了socket.sendUrgentData(0xFF)這句代碼實作的,所以,當然是TCP包,

7.如何實作檔案斷點上傳

在 Android 中上傳檔案可以采用 HTTP 方式,也可以采用 Socket 方式,但是 HTTP 方式不能上傳

大檔案,這里介紹一種通過 Socket 方式來進行斷點續傳的方式,服務端會記錄下檔案的上傳進度,

當某一次上傳程序意外終止后,下一次可以繼續上傳,這里用到的其實還是 J2SE 里的知識,

這個上傳程式的原理是:客戶端第一次上傳時向服務端發送

“Content-Length=35;filename=WinRAR_3.90_SC.exe;sourceid=“這種格式的字串,服務端 收到后會查找該檔案是否有上傳記錄,如果有就回傳已經上傳的位置,否則回傳新生成的 sourceid 以及 position 為 0,類似 sourceid=2324838389;position=0“這樣的字串,客戶端收到回傳后 的字串后再從指定的位置開始上傳檔案,

Fragment相關

1.Fragment 如何實作類似 Activity 堆疊的壓堆疊和出堆疊效果的?

Fragment 的事物管理器內部維持了一個雙向鏈表結構,該結構可以記錄我們每次 add 的

Fragment 和 replace 的 Fragment,然后當我們點擊 back 按鈕的時候會自動幫我們實作退堆疊操作,

2.Fragment 在你們專案中的使用
  • Fragment 是 android3.0 以后引入的的概念,做區域內容更新更方便,原來為了到達這一點要

  • 把多個布局放到一個 activity 里面,現在可以用多 Fragment 來代替,只有在需要的時候才加載

  • Fragment,提高性能,

Fragment 的好處:
  • Fragment 可以使你能夠將 activity 分離成多個可重用的組件,每個都有它自己的生命周期和UI,

  • Fragment 可以輕松得創建動態靈活的 UI 設計,可以適應于不同的螢屏尺寸,從手機到平板電腦,

  • Fragment 是一個獨立的模塊,緊緊地與 activity 系結在一起,可以運行中動態地移除、加入、交換等,

  • Fragment 提供一個新的方式讓你在不同的安卓設備上統一你的 UI,

  • Fragment 解決 Activity 間的切換不流暢,輕量切換,

  • Fragment 替代 TabActivity 做導航,性能更好,

  • Fragment 在 4.2.版本中新增嵌套 fragment 使用方法,能夠生成更好的界面效果

3.如何切換 fragement,不重新實體化

正確的切換方式是 add(),切換時 hide(),add()另一個 Fragment;再次切換時,只需 hide()當前, show()另一個

四大組件相關

1.Activity和Fragment生命周期有哪些?

Activity——onCreate->onStart->onResume->onPause->onStop->onDestroy

Fragment——onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach

2.廣播的兩種注冊方式及有什么區別
3.記憶體不足時,怎么保持Activity的一些狀態,在哪個方法里面做具體操作?

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它們不同于 onCreate()、onPause()等生命周期方法,它們并不一定會被觸發,當應用遇到意外情況(如:記憶體不足、用戶直接按Home鍵)由系統銷毀一個Activity,onSaveInstanceState() 會被呼叫,但是當用戶主動去銷毀一個Activity時,例如在應用中按回傳鍵,onSaveInstanceState()就不會被呼叫,除非該activity是被用戶主動銷毀的,通常onSaveInstanceState()只適合用于保存一些臨時性的狀態,而onPause()適合用于資料的持久化保存,

4.啟動service的兩種方法?有什么區別?

一種是startService(),另一種是bindService(),這兩者的區別是第一種方式呼叫者開啟了服務,即會與服務失去聯系,兩者沒有關聯,即使訪問者退出了,服務仍在運行,如需解除服務必須顯式的呼叫stopService方法,主要用于呼叫者與服務沒有互動的情況下,也就是呼叫者不需要獲取服務里的業務方法,比如電話錄音,而后者呼叫者與服務系結在一起的,當呼叫者退出的時候,服務也隨之退出,用于需要與服務互動,

5.Android中的Context, Activity,Appliction有什么區別?

相同:Activity和Application都是Context的子類,

Context從字面上理解就是背景關系的意思,在實際應用中它也確實是起到了管理背景關系環境中各個引數和變數的總用,方便我們可以簡單的訪問到各種資源,

不同:維護的生命周期不同, Context維護的是當前的Activity的生命周期,Application維護的是整個專案的生命周期,

使用context的時候,小心記憶體泄露,防止記憶體泄露,注意一下幾個方面:

不要讓生命周期長的物件參考activity context,即保證參考activity的物件要與activity本身生命周期是一樣的,

對于生命周期長的物件,可以使用application,context,

避免非靜態的內部類,盡量使用靜態類,避免生命周期問題,注意內部類對外部物件參考導致的生命周期變化,

6.Context是什么?

它描述的是一個應用程式環境的資訊,即背景關系,

該類是一個抽象(abstract class)類,Android提供了該抽象類的具體實作類(ContextIml),

通過它我們可以獲取應用程式的資源和類,也包括一些應用級別操作,例如:啟動一個Activity,發送廣播,接受Intent,資訊,等,

7.Service 是否在 main thread 中執行, service 里面是否能執行耗時的操作?

默認情況,如果沒有顯示的指 servic 所運行的行程, Service 和 activity 是運行在當前 app 所在進

程的 main thread(UI 主執行緒)里面,

service 里面不能執行耗時的操作(網路請求,拷貝資料庫,大檔案 )

特殊情況 ,可以在清單檔案配置 service 執行所在的行程 ,讓 service 在另外的行程中執行 ? 1 2 3 4 5

8.Activity 怎么和 Service 系結,怎么在 Activity 中啟動自己對應的Service?

Activity 通過 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 進行系結,當系結成功的時候 Service 會將代理物件通過回呼的形式傳給 conn,這樣我們就拿到了Service 提供的服務代理物件,

在 Activity 中可以通過 startService 和 bindService 方法啟動 Service,一般情況下如果想獲取Service 的服務物件那么肯定需要通過 bindService()方法,比如音樂播放器,第三方支付等,如果僅僅只是為了開啟一個后臺任務那么可以使用 startService()方法,

9.說說 Activity、Intent、Service 是什么關系

他們都是 Android 開發中使用頻率最高的類,其中 Activity 和 Service 都是 Android 四大組件之一,他倆都是 Context 類的子類 ContextWrapper 的子類,因此他倆可以算是兄弟關系吧,不過兄弟倆各有各自的本領,Activity 負責用戶界面的顯示和互動,Service 負責后臺任務的處理,Activity和 Service 之間可以通過 Intent 傳遞資料,因此可以把 Intent 看作是通信使者,

10.請描述一下 BroadcastReceiver

BroadCastReceiver 是 Android 四大組件之一,主要用于接收系統或者 app 發送的廣播事件,

廣播分兩種:有序廣播和無序廣播,

內部通信實作機制:通過 Android 系統的 Binder 機制實作通信,

無序廣播:完全異步,邏輯上可以被任何廣播接收者接收到,優點是效率較高,缺點是一個接收者不

能將處理結果傳遞給下一個接收者,并無法終止廣播 intent 的傳播,

11.為什么要用 ContentProvider?它和 sql 的實作上有什么差別?

ContentProvider 屏蔽了資料存盤的細節,內部實作對用戶完全透明,用戶只需要關心操作資料的uri 就可以了,ContentProvider 可以實作不同 app 之間共享,

Sql 也有增刪改查的方法,但是 sql 只能查詢本應用下的資料庫,而 ContentProvider 還可以去增刪改查本地檔案. xml 檔案的讀取等,

12.說說 ContentProvider、ContentResolver、ContentObserver 之間的關系

a. ContentProvider 內容提供者,用于對外提供資料

b. ContentResolver.notifyChange(uri)發出訊息

c. ContentResolver 內容決議者,用于獲取內容提供者提供的資料

d. ContentObserver 內容監聽器,可以監聽資料的改變狀態

e. ContentResolver.registerContentObserver()監聽訊息,

View 相關

1.onInterceptTouchEvent()和onTouchEvent()的區別

onInterceptTouchEvent()用于攔截觸摸事件

onTouchEvent()用于處理觸摸事件

2.RemoteView在哪些功能中使用

APPwidget和Notification中SurfaceView和View的區別是什么?

SurfaceView中采用了雙快取技術,在單獨的執行緒中更新界面View在UI執行緒中更新界面

4.View的繪制程序

一個View要顯示在界面上,需要經歷一個View樹的遍歷程序,這個程序又可以分為三個程序,也就是自定義View中的三要素:大小,位置,畫什么,即onMesure(),onLayout(),onDraw(),

1.onMesure()確定一個View的大小;

2.onLayout()確定View在父節點上的位置;

3.onDraw()繪制View 的內容;

5.如何自定義ViewGroup

1.指定的LayoutParams

2.onMeasure中計算所有childView的寬和高,然后根據childView的寬和高,計算自己的寬和高,(當然,如果不是wrap_content,直接使用父ViewGroup傳入的計算值即可)

3.onLayout中對所有的childView進行布局,

6.View中onTouch,onTouchEvent,onClick的執行順序

dispatchTouchEvent—->onTouch—->onTouchEvent—–>onClick,在所有ACTION_UP事件之后才觸發onClick點擊事件,

性能優化相關

1.ListView卡頓的原因與性能優化,越多越好

重用converView: 通過復用converview來減少不必要的view的創建,另外Infalte操作會把xml檔案實體化成相應的View實體,屬于IO操作,是耗時操作,

減少findViewById()操作: 將xml檔案中的元素封裝成viewholder靜態類,通過converview的setTag和getTag方法將view與相應的holder物件系結在一起,避免不必要的findviewbyid操作

使用 RecycleView 代替listview: 每個item內容的變動,listview都需要去呼叫notifyDataSetChanged來更新全部的item,太浪費性能了,RecycleView可以實作當個item的區域重繪,并且引入了增加和洗掉的動態效果,在性能上和定制上都有很大的改善

ListView 中元素避免半透明: 半透明繪制需要大量乘法計算,在滑動時不停重繪會造成大量的計算,在比較差的機子上會比較卡, 在設計上能不半透明就不不半透明,實在要弄就把在滑動的時候把半透明設定成不透明,滑動完再重新設定成半透明,

盡量開啟硬體加速: 硬體加速提升巨大,避免使用一些不支持的函式導致含淚關閉某個地方的硬體加速,當然這一條不只是對 ListView,

2.如何避免 OOM 問題的出現

使用更加輕量的資料結構 例如,我們可以考慮使用ArrayMap/SparseArray而不是HashMap等傳統資料結構,通常的HashMap的實作方式更加消耗記憶體,因為它需要一個額外的實體物件來記錄Mapping操作,另外,SparseArray更加高效,在于他們避免了對key與value的自動裝箱(autoboxing),并且避免了裝箱后的解箱,

避免在Android里面使用Enum Android官方培訓課程提到過“Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.”,具體原理請參考《Android性能優化典范(三)》,所以請避免在Android里面使用到列舉,

減小Bitmap物件的記憶體占用 Bitmap是一個極容易消耗記憶體的大胖子,減小創建出來的Bitmap的記憶體占用可謂是重中之重,,通常來說有以下2個措施: inSampleSize:縮放比例,在把圖片載入記憶體之前,我們需要先計算出一個合適的縮放比例,避免不必要的大圖載入, decode format:解碼格式,選擇ARGB_6666/RBG_545/ARGB_4444/ALPHA_6,存在很大差異

Bitmap物件的復用 縮小Bitmap的同時,也需要提高BitMap物件的復用率,避免頻繁創建BitMap物件,復用的方法有以下2個措施 LRUCache : “最近最少使用演算法”在Android中有極其普遍的應用,ListView與GridView等顯示大量圖片的控制元件里,就是使用LRU的機制來快取處理好的Bitmap,把近期最少使用的資料從快取中移除,保留使用最頻繁的資料, inBitMap高級特性:利用inBitmap的高級特性提高Android系統在Bitmap分配與釋放執行效率,使用inBitmap屬性可以告知Bitmap解碼器去嘗試使用已經存在的記憶體區域,新解碼的Bitmap會嘗試去使用之前那張Bitmap在Heap中所占據的pixel data記憶體區域,而不是去問記憶體重新申請一塊區域來存放Bitmap,利用這種特性,即使是上千張的圖片,也只會僅僅只需要占用螢屏所能夠顯示的圖片數量的記憶體大小

使用更小的圖片 在涉及給到資源圖片時,我們需要特別留意這張圖片是否存在可以壓縮的空間,是否可以使用更小的圖片,盡量使用更小的圖片不僅可以減少記憶體的使用,還能避免出現大量的InflationException,假設有一張很大的圖片被XML檔案直接參考,很有可能在初始化視圖時會因為記憶體不足而發生InflationException,這個問題的根本原因其實是發生了OOM,

StringBuilder 在有些時候,代碼中會需要使用到大量的字串拼接的操作,這種時候有必要考慮使用StringBuilder來替代頻繁的“+”,

避免在onDraw方法里面執行物件的創建 類似onDraw等頻繁呼叫的方法,一定需要注意避免在這里做創建物件的操作,因為他會迅速增加記憶體的使用,而且很容易引起頻繁的gc,甚至是記憶體抖動,

避免物件的記憶體泄露

3.三級快取的原理

從快取中加載,

從本地檔案中加載(資料庫,SD)

從網路加載,

a.加載 bitmap 的時候無需考慮 bitmap 加載程序中出現的 oom(記憶體溢位)和 android 容器快速

滑動的時候出現的圖片錯位等現象,(16M)

b. 支持加載網路圖片和本地圖片,

c. 記憶體管理使用的 lru 演算法(移除里面是有頻率最少的物件),更好的管理 bitmap 的記憶體

Android其他

1.講一下android中行程的優先級?

  • 前臺行程
  • 可見行程
  • 服務行程
  • 后臺行程
  • 空行程
2.介紹Handle的機制

Handler通過呼叫sendmessage方法把訊息放在訊息佇列MessageQueue中,Looper負責把訊息從訊息佇列中取出來,重新再交給Handler進行處理,三者形成一個回圈

通過構建一個訊息佇列,把所有的Message進行統一的管理,當Message不用了,并不作為垃圾回收,而是放入訊息佇列中,供下次handler創建訊息時候使用,提高了訊息物件的復用,減少系統垃圾回收的次數

每一個執行緒,都會單獨對應的一個looper,這個looper通過ThreadLocal來創建,保證每個執行緒只創建一個looper,looper初始化后就會呼叫looper.loop創建一個MessageQueue,這個方法在UI執行緒初始化的時候就會完成,我們不需要手動創建

3.Dalvik虛擬機與JVM有什么區別

Dalvik 基于暫存器,而 JVM 基于堆疊,基于暫存器的虛擬機對于更大的程式來說,在它們編譯的時候,花費的時間更短,

Dalvik執行.dex格式的位元組碼,而JVM執行.class格式的位元組碼,

4.每個應用程式對應多少個Dalvik虛擬機

每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實體,其代碼在虛擬機的解釋下得以執行 ,而所有的Android應用的執行緒都對應一個Linux執行緒

5.應用常駐后臺,避免被第三方殺掉的方法

Service設定成START_STICKY kill 后會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣

通過 startForeground將行程設定為前臺行程, 做前臺服務,優先級和前臺應用一個級別,除非在系統記憶體非常缺,否則此行程不會被 kill

雙行程Service: 讓2個行程互相保護對方,其中一個Service被清理后,另外沒被清理的行程可以立即重啟行程

用C撰寫守護行程(即子行程) : Android系統中當前行程(Process)fork出來的子行程,被系統認為是兩個不同的行程,當父行程被殺死的時候,子行程仍然可以存活,并不受影響(Android5.0以上的版本不可行

聯系廠商,加入白名單

6.根據自己的理解描述下Android數字簽名,

所有的應用程式都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程式

Android程式包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證

如果要正式發布一個Android程式,必須使用一個合適的私鑰生成的數字證書來給程式簽名,而不能使用adt插件或者ant工具生成的除錯證書來發布,

數字證書都是有有效期的,Android只是在應用程式安裝的時候才會檢查證書的有效期,如果程式已經安裝在系統中,即使證書過期也不會影響程式的正常功能,

7.Dalvik基于JVM的改進

幾個class變為一個dex,constant pool,省記憶體

Zygote,copy-on-write shared,省記憶體,省cpu,省電

基于暫存器的bytecode,省指令,省cpu,省電

Trace-based JIT,省cpu,省電,省記憶體

8.ARGB_8888占用記憶體大小

本題的答案,是4byte,即ARGB各占用8個位元來描述,

9.apk安裝卸載的原理

安裝程序:復制apk安裝包到data/app目錄下,解壓并掃描安裝包,把dex檔案(dalvik位元組碼)保存到dalvik-cache目錄,并data/data目錄下創建對應的應用資料目錄,

卸載程序:洗掉安裝程序中在上述三個目錄下創建的檔案及目錄,

10.通過Intent傳遞一些二進制資料的方法有哪些?

使用Serializable介面實作序列化,這是Java常用的方法,

實作Parcelable介面,這里Android的部分類比如Bitmap類就已經實作了,同時Parcelable在Android AIDL中交換資料也很常見的,

11.橫豎屏切換時Activity的生命周期

此時的生命周期跟清單檔案里的配置有關系,

不設定Activity的android:configChanges時,切屏會重新呼叫各個生命周期默認首先銷毀當前activity,然后重新加載,

設定Activity android:configChanges=”orientation|keyboardHidden|screenSize”時,切屏不會重新呼叫各個生命周期,只會執行onConfigurationChanged方法

12.Serializable 和 Parcelable 的區別

在使用記憶體的時候,Parcelable 類比 Serializable 性能高,所以推薦使用 Parcelable 類,

Serializable 在序列化的時候會產生大量的臨時變數,從而引起頻繁的 GC,

Parcelable 不能使用在要將資料存盤在磁盤上的情況,盡管 Serializable 效率低點,但在這

種情況下,還是建議你用 Serializable ,

13.Android 中如何捕獲未捕獲的例外

自 定 義 一 個 Application , 比 如 叫 MyApplication 繼 承 Application 實 現

UncaughtExceptionHandler,

覆寫 UncaughtExceptionHandler 的 onCreate 和 uncaughtException 方法,

14.Android 的權限規則

Android 中的 apk 必須簽名

基于 UserID 的行程級別的安全機制

默認 apk 生成的資料對外是不可見的

AndroidManifest.xml 中的顯式權限宣告

15.多執行緒間通信和多行程之間通信有什么不同,分別怎么實作?

一、行程間的通信方式

管道( pipe ): 管道是一種半雙工的通信方式,資料只能單向流動,而且只能在具有親緣關系的行程間使用,行程的親緣關系通常是指父子行程關系,

有名管道 (namedpipe): 有名管道也是半雙工的通信方式,但是它允許無親緣關系行程間的通信,

信號量(semophore ): 信號量是一個計數器,可以用來控制多個行程對共享資源的訪問,它常作為一種鎖機制,防止某行程正在訪問共享資源時,其他行程也訪問該資源,因此,主要作為行程間以及同一行程內不同執行緒之間的同步手段,

訊息佇列( messagequeue ): 訊息佇列是由訊息的鏈表,存放在內核中并由訊息佇列識別符號標識,訊息佇列克服了信號傳遞資訊少、管道只能承載無格式位元組流以及緩沖區大小受限等缺點,

信號 (sinal ): 信號是一種比較復雜的通信方式,用于通知接收行程某個事件已經發生,

共享記憶體(shared memory ) :共享記憶體就是映射一段能被其他行程所訪問的記憶體,這段共享記憶體由一個行程創建,但多個行程都可以訪問,共享記憶體是最快的 IPC 方式,它是針對其他行程間通信方式運行效率低而專門設計的,它往往與其他通信機制,如信號兩,配合使用,來實作行程間的同步和通信,

套接字(socket ) : 套解口也是一種行程間通信機制,與其他通信機制不同的是,它可用于不同及其間的行程通信,

二、執行緒間的通信方式

1. 鎖機制:包括互斥鎖、條件變數、讀寫鎖

互斥鎖提供了以排他方式防止資料結構被并發修改的方法,

讀寫鎖允許多個執行緒同時讀共享資料,而對寫操作是互斥的,

條件變數可以以原子的方式阻塞行程,直到某個特定條件為真為止,對條件的測驗是在互斥鎖

的保護下進行的,條件變數始終與互斥鎖一起使用,

2. 信號量機制(Semaphore):包括無名執行緒信號量和命名執行緒信號量

3. 信號機制(Signal):類似行程間的信號處理

執行緒間的通信目的主要是用于執行緒同步,所以執行緒沒有像行程通信中的用于資料交換的通信機制,

16.說說 LruCache 底層原理

LruCache 使用一個 LinkedHashMap 簡單的實作記憶體的快取,沒有軟參考,都是強參考,如果添加的資料大于設定的最大值,就洗掉最先快取的資料來調整記憶體,

maxSize 是通過構造方法初始化的值,他表示這個快取能快取的最大值是多少,

size 在添加和移除快取都被更新值,他通過 safeSizeOf 這個方法更新值,safeSizeOf 默認回傳 1,但一般我們會根據 maxSize 重寫這個方法,比如認為 maxSize 代表是 KB 的話,那么就以 KB 為單位回傳該項所占的記憶體大小,

除例外外首先會判斷 size 是否超過 maxSize,如果超過了就取出最先插入的快取,如果不為空就 刪掉,并把 size 減去該項所占的大小,這個操作將一直回圈下去,直到 size 比 maxSize 小或者快取 空,

文末:

最后我想說:有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的理解,例如Handler機制,這個是面試必問之題,有些晦澀的點,或許它只活在面試當中,實際作業當中你壓根不會用到它,但是你要知道它是什么東西,

馬上就要到金三銀四得面試旺季,大家都希望趁著這個機會找到一個心儀的作業,但是不管怎么樣,不論是什么樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的準備,當然除了這個還需要在平時把自己的基礎打扎實,這樣不論面試官怎么樣一個知識點里往死里鑿,你也能應付如流啊~

在這里插入圖片描述

面試:如果不準備充分的面試,完全是浪費時間,更是對自己的不負責!

最后在這里小編分享一份自己收錄整理上述技術體系圖相關的幾十套騰訊、頭條、阿里、美團等公司20-21年的面試題,把技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由于篇幅有限,這里以圖片的形式給大家展示一部分,

還有 高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料 幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習,

本文在開源專案:【GitHub】中已收錄,里面包含不同方向的自學編程路線、面試題集合/面經、及系列技術文章等,資源持續更新中…

如果需要PDF版本可以在群檔案夾里,自行領取!



自行領取直達鏈接:【點擊獲取】

需要相關知識點可以查看我的【GitHub】,對于已經掌握的可以忽略以節省時間,

【Android開發核心知識點筆記】

【Android思維腦圖(技能樹)】

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2IRUO2jq-1617108943407)(//upload-images.jianshu.io/upload_images/1095900-4bc8337d3615bf27.png?imageMogr2/auto-orient/strip|imageView2/2/w/530/format/webp)]

【Android核心高級技術PDF檔案,BAT大廠面試真題決議】

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fkqdDEeZ-1617108943407)(//upload-images.jianshu.io/upload_images/1095900-1b701446c14280c5.png?imageMogr2/auto-orient/strip|imageView2/2/w/788/format/webp)]

【Android高級架構視頻學習資源】
Android檔案PDF初級到高級

Android精講視頻領取學習后更加是如虎添翼! 進軍BATJ大廠等(備戰)!現在都說互聯網寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎么可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程式員泛濫,這套教程針對Android開發工程師1-6年的人員、正處于瓶頸期,想要年后突破自己漲薪的,進階Android中高級、架構師對你更是如魚得水,趕快領取吧!

還不趕緊去復習!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/271400.html

標籤:其他

上一篇:注意!關于怎么理解 onStart可見但不可互動,程式員千萬不要小瞧了這個問題,涉及面很多!

下一篇:2021安卓小白實戰面試題總結

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more