緣起
有不少Android 開發人員準備面試,殊不知道如何準備?因而紛紛上網發帖求助。css
甚至不少人網上隨便找找面試題什麼的,其結果就是[字節慘掛在三面],揮淚整理麪筋。等諸多文章火了,究其緣由就是這些文章戳中了大部分面試者的痛點,面試被刷了。html
想到還有不少android程序員沒有找到Android面試大綱。不知道如何準備Android面試。java
因而,我就想幹脆我本身作這個事吧,就算沒人看,也當我本身的年終總結了。linux
純技術方面的準備,若是是的話,我就提供一些拙見,大部分算是一些開發知識死角或者tips吧,權當拋磚引玉了:)
今天就總結下2020年蒐集整理的面試題,難度不大,大佬能夠直接路過,固然發發善心點個贊也是能夠的❤️。android
一、Activity是什麼git
Activity是四大組件之一,它提供一個界面讓用戶點擊和各類滑動操做,這就是Activity程序員
二、Activity四種狀態web
三、Activity生命週期面試
四、Activity切換橫屏時生命週期shell
五、進程的優先級
oom_adj
是linux內核分配給每一個系統進程的一個值,表明進程的優先級,進程回收機制就是根據這個優先級來決定是否進行回收。進程的oom_adj
越大,表示此進程優先級越低,越容易被殺回收;越小,表示進程優先級越高,越不容易被殺回收。普通app進程的oom_adj
>=0,系統進程的oom_adj
纔可能小於0。進程優先級從小到大以下
六、Activity任務棧
七、Activity啓動模式
八、scheme跳轉協議
android中的scheme是一種頁面內跳轉協議,經過定義本身的scheme協議,能夠跳轉到app中的各個頁面
九、Context、Activity、Application之間有什麼區別
Activity和Application都是Context的子類。Context從字面上理解就是上下文的意思,在實際應用中它也確實是起到了管理上下文環境中各個參數和變量的總用,方便咱們能夠簡單的訪問到各類資源。雖然Activity和Application都是Context的子類,可是他們維護的生命週期不同。前者維護一個Acitivity的生命週期,因此其對應的Context也只能訪問該activity內的各類資源。後者則是維護一個Application的生命週期
十、Activity啓動過程
startActivitySately()
,而這個方法內部則是調用startActivty()
,startActivity()
最終仍是會調用startActivityForResult()
。因爲startActivityForResult()
是有返回結果的,系統直接返回-1,表示不須要返回結果startActivityForResult()
經過Instrumentation類中的execStartActivity()
來啓動activity,Instrumentation這個類主要做用是監控程序和系統之間的交互。在這個execStartActivity()
中會獲取ActivityManagerService的代理對象,經過這個代理對象進行啓動activityApplicationThread.scheduleLaunchActivity()
進行啓動activity,在這個方法中建立一個ActivityClientRecord對象,用來記錄啓動Activity組件的信息,而後經過handler將ActivityClientRecord發送出去ActivityThread.handleLaunchActivity()
啓動Activity十一、簡述Activity,View,Window三者關係
一、Fragment爲何被稱爲第五大組件
Fragment比Activity更節省內存,其切換模式也更加溫馨,使用頻率不低於四大組件,且有本身的生命週期,並且必須依附於Activity
二、Activity建立Fragment的方式
三、FragmentPageAdapter和FragmentPageStateAdapter的區別
四、Fragment生命週期
五、Fragment的通訊
六、Fragment的replace、add、remove方法
一、Service是什麼
Service是四大組件之一,它能夠在後臺執行長時間運行操做而沒有用戶界面的應用組件
二、Service和Thread的區別
三、Service啓動方式
四、Service生命週期
一、Broadcast Receiver是什麼
Broadcast是四大組件之一,是一種普遍運用在應用程序之間傳輸信息的機制,經過發送Intent來傳送咱們的數據
二、Broadcast Receiver的使用場景
三、Broadcast Receiver的種類
四、Broadcast Receiver的實現
五、Broadcast Receiver實現機制
六、LocalBroadcastManager特色
一、WebView安全漏洞
二、WebView銷燬步驟
三、WebView的jsbridge
四、WebViewClient的onPageFinished
五、WebView後臺耗電
六、WebView硬件加速
Android3.0引入硬件加速,默認會開啓,WebView在硬件加速的狀況下滑動更加平滑,性能更加好,可是會出現白塊或者頁面閃爍的反作用,建議WebView暫時關閉硬件加速
七、WebView內存泄漏
因爲WebView是依附於Activity的,Activity的生命週期和WebView啓動的線程的生命週期是不一致的,這會致使WebView一直持有對這個Activity的引用而沒法釋放,解決方案以下
一、Linux內核的基本知識
二、爲何使用Binder
三、Binder通訊原理
四、AIDL
五、BpBinder和BBinder
BpBinder(客戶端)對象和BBinder(服務端)對象,它們都從IBinder類中派生而來,BpBinder(客戶端)對象是BBinder(服務端)對象的代理對象,關係圖以下
一、Handler是什麼
Handler經過發送和處理Message和Runnable對象來關聯相對應線程的MessageQueue
二、Handler使用方法
三、Handler工做原理
四、Handler引發的內存泄漏
解決:
一、AsyncTask是什麼
它本質上就是一個封裝了線程池和Handler的異步框架
二、AsyncTask使用方法
三個參數
五個方法
三、AsyncTask工做原理
四、AsyncTask引發的內存泄漏
解決:
五、AsyncTask生命週期
在Activity銷燬以前,取消AsyncTask的運行,以此來保證程序的穩定
六、AsyncTask結果丟失
因爲屏幕旋轉、Activity在內存緊張時被回收等狀況下,Activity會被從新建立,此時,舊的AsyncTask持有舊的Activity引用,這個時候會致使AsyncTask的onPostExecute()對UI更新無效
七、AsyncTask並行or串行
一、HandlerThread產生背景
當系統有多個耗時任務須要執行時,每一個任務都會開啓一個新線程去執行耗時任務,這樣會致使系統屢次建立和銷燬線程,從而影響性能。爲了解決這一問題,Google提供了HandlerThread,HandlerThread是在線程中建立一個Looper循環器,讓Looper輪詢消息隊列,當有耗時任務進入隊列時,則不須要開啓新線程,在原有的線程中執行耗時任務便可,不然線程阻塞
二、HanlderThread的特色、
一、IntentService是什麼
IntentService是繼承自Service並處理異步請求的一個類,其內部採用HandlerThread和Handler實現的,在IntentService內有一個工做線程來處理耗時操做,其優先級比普通Service高。當任務完成後,IntentService會自動中止,而不須要手動調用stopSelf()。另外,能夠屢次啓動IntentService,每一個耗時操做都會以工做隊列的方式在IntentService中onHandlerIntent()回調方法中執行,而且每次只會執行一個工做線程
二、IntentService使用方法
一、Android構建流程
[圖片上傳失敗…(image-ccd96b-1606878198554)]
二、jenkins持續集成構建
三、git經常使用命令
四、git工做流
fork/clone(主流)
五、proguard是什麼
ProGuard工具是用於壓縮、優化和混淆咱們的代碼,其主做用是移除或混淆代碼中無用類、字段、方法和屬性
六、proguard技術功能
七、proguard工做原理
將無用的字段或方法存入到EntryPoint中,將非EntryPoint的字段和方法進行替換
八、爲何要混淆
因爲Java是一門跨平臺的解釋性語言,其源代碼被編譯成class字節碼來適應其餘平臺,而class文件包含了Java源代碼信息,很容易被反編譯
九、annotationProcessor與compileOnly的區別
annotationProcessor與compileOnly都是隻編譯並不打入apk中
一、什麼是ANR
Application Not Responding,頁面無響應的對話框
二、發生ANR的條件
應用程序的響應性是由ActivityManager和WindowManager系統服務監視的,當ANR發生條件知足時,就會彈出ANR的對話框
三、形成ANR的主要緣由
主線程被IO操做阻塞
四、如何解決ANR
一、什麼是OOM
OOM指Out of memory(內存溢出),當前佔用內存加上咱們申請的內存資源超過了Dalvik虛擬機的最大內存限制就會拋出Out of memory異常
二、OOM相關概念
三、解決OOM
Bitmap相關
其餘相關
一、recycle
二、LruCache原理
LruCache是個泛型類,內部採用LinkedHashMap來實現緩存機制,它提供get方法和put方法來獲取緩存和添加緩存,其最重要的方法trimToSize是用來移除最少使用的緩存和使用最久的緩存,並添加最新的緩存到隊列中
三、計算採樣率
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { if (width > height) { inSampleSize = Math.round((float)height / (float)reqHeight); } else { inSampleSize = Math.round((float)width / (float)reqWidth); } } return inSampleSize; }
四、採樣率壓縮(縮略圖)
public static Bitmap thumbnail(String path,int maxWidth, int maxHeight) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeFile(path, options); options.inJustDecodeBounds = false; int sampleSize = calculateInSampleSize(options, maxWidth, maxHeight); options.inSampleSize = sampleSize; options.inPreferredConfig = Bitmap.Config.RGB_565; options.inPurgeable = true; options.inInputShareable = true; if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); } bitmap = BitmapFactory.decodeFile(path, options); return bitmap; }
五、質量壓縮
public static String save(Bitmap bitmap,Bitmap.CompressFormat format, int quality, File destFile) { try { FileOutputStream out = new FileOutputStream(destFile); if (bitmap.compress(format, quality, out)) { out.flush(); out.close(); } if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); } return destFile.getAbsolutePath(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
六、尺寸壓縮
public static void reSize(Bitmap bmp,File file,int ratio){ Bitmap result = Bitmap.createBitmap(bmp.getWidth()/ratio, bmp.getHeight()/ratio,Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); RectF rect = new RectF(0, 0, bmp.getWidth()/ratio, bmp.getHeight()/ratio); canvas.drawBitmap(bmp, null, rect , null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); result.compress(Bitmap.CompressFormat.JPEG, 100, baos); try { FileOutputStream fos = new FileOutputStream(file); fos.write(baos.toByteArray()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
七、保存到SD卡
public static String save(Bitmap bitmap,Bitmap.CompressFormat format, int quality, Context context) { if (!Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED)) { return null; } File dir = new File(Environment.getExternalStorageDirectory() + "/" + context.getPackageName() + "/save/"); if (!dir.exists()) { dir.mkdirs(); } File destFile = new File(dir, UUID.randomUUID().toString()); return save(bitmap, format, quality, destFile); }
八、三級緩存
九、NDK壓縮
Android進階——圖片優化之質量壓縮、尺寸壓縮、採樣率壓縮、LibJpeg壓縮
十、webp壓縮
Android Webp 徹底解析 快來縮小apk的大小吧-鴻洋的博客
一、UI卡頓原理
View的繪製幀數保持60fps是最佳,這要求每幀的繪製時間不超過16ms(1000/60),若是安卓不能在16ms內完成界面的渲染,那麼就會出現卡頓現象
二、UI卡頓的緣由分析
三、UI卡頓的優化
佈局優化
ListView優化
背景和圖片優化
避免ANR
一、Java內存泄漏引發的主要緣由
長生命週期的對象持有短生命週期對象的引用就極可能發生內存泄漏
二、Java內存分配策略
三、Android解決內存泄漏的例子
一、Android內存管理機制
二、內存管理機制的特色
三、內存優化方法
一、什麼是冷啓動和熱啓動
二、冷啓動和熱啓動的區別
三、冷啓動時間的計算
這個時間值從應用啓動(建立進程)開始計算,到完成視圖的第一次繪製爲止
四、冷啓動流程
總結:點擊App->IPC->Process.start->ActivityThread->Application生命週期->Activity生命週期->ViewRootImpl測量佈局繪製顯示在界面上
五、冷啓動優化
六、adb命令獲取啓動時間
adb shell am start -W packagename/MainActivity
一、Android不用靜態變量存儲數據
二、SharePreference安全問題
三、內存對象序列化
四、避免在UI線程中作繁重的操做
一、插件化解決的問題
二、類加載器(Java中字節碼添加到虛擬機中)
一、熱更新主要流程
二、熱更新主流框架
三、熱更新的原理
一、進程的優先級
二、Android進程回收策略
三、Android保活方案
一、什麼是Android Lint
Android Lint是一個靜態代碼分析工具,它可以對你的Android項目中潛在的Bug、可優化的代碼、安全性、性能、可用性、可訪問性、國際化等進行檢查
二、Lint工做流程
[圖片上傳失敗…(image-d5f5ab-1606878198551)]
三、配置Lint
一、什麼是Kotlin
二、Kotlin環境搭建
一、Dalvik與JIT
Dalvik是Android虛擬機,JIT則是Dalvik採用的技術策略
在編譯打包APK文件時,會通過如下流程Java->Class->Dalvik字節碼(dex)->每次執行代碼都要編譯成機器碼->交給底層處理
,這樣處理起來效率低下,經過引入JIT(即時編譯技術),當App運行時,每當遇到一個新類,JIT編譯器就會對這個類進行即時編譯,通過編譯後的代碼,會被優化成至關精簡的原生型指令碼,這樣在下次執行到相同邏輯的時候,速度就會更快。但因爲每次啓動App都須要即時編譯,致使運行時耗電量大
二、ART與AOT
ART是Android虛擬機,AOT則是ART採用的技術策略
在ART環境中,應用在第一次安裝的時候,字節碼就會預先編譯成機器碼,使其成爲真正的本地應用,這一技術稱爲AOT。以後打開App的時候,不須要額外的翻譯工做,直接使用本地機器碼運行,所以運行速度提升。但因爲會預先編譯,安裝時間不免會延長,並且會消耗更多的存儲空間,但消耗掉空間的增幅一般不會超過應用代碼包大小的20%
三、發展史
四、JVM與Dalvik不一樣
五、Dalvik與ART不一樣
一、什麼是Annotation
Java提供的一種元程序中的元素關聯任何信息和任何元數據(metadata)的途徑和方法
二、什麼是metadata
三、註解分類
系統內置標準註解
元註解
@Target
@Retention
生命週期
四、註解聲明
註解支持填寫數組,同時支持多種範圍
@Target({ElementType.TYPE,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModuleWrapper {}
五、Android Support Annotation
六、註解的用途
1)過程分析:主要分爲三步
DNS解析
。用戶輸入url後,須要經過DNS解析找到域名對應的ip地址,有了ip地址才能找到服務器端。首先會查找瀏覽器緩存,是否有對應的dns記錄。再繼續按照操做系統緩存—路由緩存—isp的dns服務器—根服務器的順序進行DNS解析,直到找到對應的ip地址。客戶端(瀏覽器)和服務器交互
。瀏覽器根據解析到的ip地址和端口號發起HTTP請求,請求到達傳輸層,這裏也就是TCP層,開始三次握手創建鏈接。服務器收到請求後,發送相應報文給客戶端(瀏覽器),客戶端收到相應報文並進行解析,獲得html頁面數據,包括html,js,css等。客戶端(瀏覽器)解析html數據
,構建DOM樹,再構造呈現樹(render樹),最終繪製到瀏覽器頁面上。2)其中涉及到TCP/IP協議簇,包括DNS,TCP,IP,HTTP協議等等。
TCP/IP通常指的是TCP/IP協議簇,主要包括了多個不一樣網絡間實現信息傳輸涉及到的各類協議
主要包括如下幾層:
應用層
:主要提供數據和服務。好比HTTP,FTP,DNS等傳輸層
:負責數據的組裝,分塊。好比TCP,UDP等網絡層
:負責告訴通訊的目的地,好比IP等數據鏈路層
:負責鏈接網絡的硬件部分,好比以太網,WIFI等客戶端簡稱A,服務器端簡稱B
1)TCP創建鏈接須要三次握手
syn
包,A進入SYN_SENT
狀態)syn
包,須要確認syn
包,而且本身也發送一個syn
包,即發送了syn+ack
包,B進入SYN_RECV
狀態)syn+ack
包,向服務器發送確認包ack
,AB進入established
狀態)開始鏈接。2)TCP斷開鏈接須要四次揮手
fin
,進入FIN_WAIT_1
狀態)CLOSE_WAIT
狀態)LAST_ACK
狀態)close
d狀態)3)爲何揮手多一次
其實正常的斷開和鏈接都是須要四次
:
可是鏈接中,第二步和第三步是能夠合併
的,由於鏈接以前A和B是無聯繫的,因此沒有其餘狀況須要處理。而斷開的話,由於以前兩端是正常鏈接狀態,因此第二步的時候不能保證B以前的消息已經發送完畢,因此不能立刻告訴A要斷開的消息。這就是鏈接爲何能夠少一步的緣由。
4)爲何鏈接須要三次,而不是兩次。
正常來講,我給你發消息,你告訴我能收到,不就表明咱們以前通訊是正常的嗎?
TCP是雙向通訊協議
,若是兩次握手,不能保證B發給A的消息正確到達。TCP 協議爲了實現可靠傳輸, 通訊雙方須要判斷本身已經發送的數據包是否都被接收方收到, 若是沒收到, 就須要重發。
TCP是怎麼保證可靠傳輸的?
序列號和確認號
。好比鏈接的一方發送一段80byte數據,會帶上一個序列號,好比101。接收方收到數據,回覆確認號181(180+1),這樣下一次發送消息就會從181開始發送了。因此握手過程當中,好比A發送syn信號給B,初始序列號爲120,那麼B收到消息,回覆ack
消息,序列號爲120+1。同時B發送syn
信號給A,初始序列號爲256,若是收不到A的回覆消息,就會重發,不然丟失這個序列號,就沒法正常完成後面的通訊了。
這就是三次握手的緣由。
TCP
提供的是面向鏈接,可靠的字節流服務。即客戶和服務器交換數據前,必須如今雙方之間創建一個TCP鏈接(三次握手),以後才能傳輸數據。而且提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端。
UDP
是一個簡單的面向數據報的運輸層協議。它不提供可靠性,只是把應用程序傳給IP層的數據報發送出去,可是不能保證它們能到達目的地。因爲UDP
在傳輸數據報前不用再客戶和服務器之間創建一個鏈接,且沒有超時重發等機制,因此傳輸速度很快。
因此總結下來就是:
能夠看到TCP
適用於穩定的應用場景,他會保證數據的正確性和順序,因此通常的瀏覽網頁,接口訪問都使用的是TCP
傳輸,因此纔會有三次握手
保證鏈接的穩定性。
而UDP是一種結構簡單的協議,不會考慮丟包啊,創建鏈接等。優勢在於數據傳輸很快,因此適用於直播,遊戲等場景。
常見的有四種:
GET
獲取資源,沒有body,冪等性POST
增長或者修改資源,有bodyPUT
修改資源,有body,冪等性DELETE
刪除資源,冪等性1)請求報文:
//請求行(包括method、path、HTTP版本) GET /s HTTP/1.1 //Headers Host: www.baidu.com Content-Type: text/plain //Body 搜索****
2)響應報文
//狀態行 (包括HTTP版本、狀態碼,狀態信息) HTTP/1.1 200 OK //Headers Content-Type: application/json; charset=utf-8 //Body [{"info":"xixi"}]
3)經常使用狀態碼
主要分爲五種類型:
1開頭
, 表明臨時性消息,好比100(繼續發送)2開頭
, 表明請求成功,好比200(OK)3開頭
, 表明重定向,好比304(內容無改變)4開頭
, 表明客戶端的一些錯誤,好比403(禁止訪問)5開頭
, 表明服務器的一些錯誤,好比500文檔領取方式:點贊+關注,而後私信關鍵詞 【1】便可得到免費領取方式!