现在做Android开发有前途吗?附面试题答案
開頭
籠統(tǒng)來(lái)說(shuō),中年程序員容易被淘汰的原因其實(shí)不外乎三點(diǎn)。
1、輸出能力已到頂點(diǎn)。這個(gè)人奮斗十來(lái)年了,依舊碌碌無(wú)為,很明顯這人的天花板就這樣了,說(shuō)白了,天賦就這樣。
2、適應(yīng)能力越來(lái)越差。年紀(jì)大,有家庭,老油條,學(xué)習(xí)能力下降,磨洋工等等。
3、性價(jià)比逐漸降低。到了35歲的年薪基本都不會(huì)低的,然而輸出能力到天花板了,隨著年紀(jì)的逐漸增大,性價(jià)比會(huì)越來(lái)越低。說(shuō)來(lái)說(shuō)去就那經(jīng)典的一句話:可替代性太高。25歲的年輕人便宜且前途可期,35歲已兌現(xiàn)天賦價(jià)格還高,這兩選誰(shuí)都差不多的時(shí)候,你說(shuō)企業(yè)會(huì)怎么選……任何一個(gè)當(dāng)了老板的人都會(huì)選前者。而如何增加自己的不可替代性?
正文如下
- Activity面試題
- Fragment面試題
- Service面試題
- Broadcast Receiver面試題
- WebView面試題
- Binder面試題
- Handler面試題
- AsyncTask面試題
- HandlerThread面試題
- IntentService面試題
- 視圖工作機(jī)制面試題
- 事件分發(fā)機(jī)制面試題
- ListView面試題
- Android項(xiàng)目構(gòu)建面試題(由于篇幅太長(zhǎng),今天就先分享到這里)
- ANR面試題
- OOM面試題
- Bitmap面試題
- UI卡頓面試題
- 內(nèi)存泄漏面試題
- 內(nèi)存管理面試題
- 冷啟動(dòng)和熱啟動(dòng)面試題
- 其他優(yōu)化面試題
- 架構(gòu)模式面試題
- 插件化面試題
- 熱更新面試題
- 進(jìn)程保活面試題
- Lint面試題
- Kotlin面試題
Activity面試題
1、Activity是什么
Activity是四大組件之一,它提供一個(gè)界面讓用戶點(diǎn)擊和各種滑動(dòng)操作,這就是Activity
2、Activity四種狀態(tài)
- runing
- paused
- stopped
- killed
3、Activity生命周期
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onRestart()
4、進(jìn)程的優(yōu)先級(jí)
- 空進(jìn)程
- 后臺(tái)進(jìn)程
- 服務(wù)進(jìn)程
- 可見進(jìn)程
- 前臺(tái)進(jìn)程
5、Activity任務(wù)棧
- 先進(jìn)后出
6、Activity啟動(dòng)模式
- standard
- singletop
- singletask
- singleinstance
7、scheme跳轉(zhuǎn)協(xié)議
Android中的scheme是一種頁(yè)面內(nèi)跳轉(zhuǎn)協(xié)議,通過(guò)定義自己的scheme協(xié)議,可以跳轉(zhuǎn)到app中的各個(gè)頁(yè)面
- 服務(wù)器可以定制化告訴app跳轉(zhuǎn)哪個(gè)頁(yè)面
- App可以通過(guò)跳轉(zhuǎn)到另一個(gè)App頁(yè)面
- 可以通過(guò)H5頁(yè)面跳轉(zhuǎn)頁(yè)面
Fragment面試題
1、Fragment為什么被稱為第五大組件
Fragment比Activity更節(jié)省內(nèi)存,其切換模式也更加舒適,使用頻率不低于四大組件,且有自己的生命周期,而且必須依附于Activity
2、Activity創(chuàng)建Fragment的方式
- 靜態(tài)創(chuàng)建
- 動(dòng)態(tài)創(chuàng)建
3、FragmentPageAdapter和FragmentPageStateAdapter的區(qū)別
-
FragmentPageAdapter在每次切換頁(yè)面的的時(shí)候,是將Fragment進(jìn)行分離,適合頁(yè)面較少的Fragment使用以保存一些內(nèi)存,對(duì)系統(tǒng)內(nèi)存不會(huì)多大影響
-
FragmentPageStateAdapter在每次切換頁(yè)面的時(shí)候,是將Fragment進(jìn)行回收,適合頁(yè)面較多的Fragment使用,這樣就不會(huì)消耗更多的內(nèi)存
4、Fragment生命周期
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()
5、Fragment的通信
- Fragment調(diào)用Activity中的方法:getActivity
- Activity調(diào)用Fragment中的方法:接口回調(diào)
- Fragment調(diào)用Fragment中的方法:FragmentManager.findFragmentById
6、Fragment的replace、add、remove方法
- replace:替代Fragment的棧頂頁(yè)面
- add:添加Fragment到棧頂頁(yè)面
- remove:移除Fragment棧頂頁(yè)面
Service面試題
1、Service是什么
Service是四大組件之一,它可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而沒有用戶界面的應(yīng)用組件
2、Service和Thread的區(qū)別
-
Service是安卓中系統(tǒng)的組件,它運(yùn)行在獨(dú)立進(jìn)程的主線程中,不可以執(zhí)行耗時(shí)操作。Thread是程序執(zhí)行的最小單元,分配CPU的基本單位,可以開啟子線程執(zhí)行耗時(shí)操作
-
Service在不同Activity中可以獲取自身實(shí)例,可以方便的對(duì)Service進(jìn)行操作。Thread在不同的Activity中難以獲取自身實(shí)例,如果Activity被銷毀,Thread實(shí)例就很難再獲取得到
3、Service啟動(dòng)方式
- startService
- bindService
4、Service生命周期
- startService
- onCreate()
- onStartCommand()
- onDestroy()
- bindService
- onCreate()
- onBind()
- onUnbind()
- onDestroy()
Broadcast Receiver面試題
1、Broadcast Receiver是什么
Broadcast是四大組件之一,是一種廣泛運(yùn)用在應(yīng)用程序之間傳輸信息的機(jī)制,通過(guò)發(fā)送Intent來(lái)傳送我們的數(shù)據(jù)
2、Broadcast Receiver的使用場(chǎng)景
- 同一App具有多個(gè)進(jìn)程的不同組件之間的消息通信
- 不同App之間的組件之間的消息通信
3、Broadcast Receiver的種類
- 普通廣播
- 有序廣播
- 本地廣播
- Sticky廣播
4、Broadcast Receiver的實(shí)現(xiàn)
-
靜態(tài)注冊(cè):注冊(cè)后一直運(yùn)行,盡管Activity、進(jìn)程、App被殺死還是可以接收到廣播
-
動(dòng)態(tài)注冊(cè):跟隨Activity的生命周期
5、Broadcast Receiver實(shí)現(xiàn)機(jī)制
- 自定義廣播類繼承BroadcastReceiver,復(fù)寫onReceiver()
- 通過(guò)Binder機(jī)制向AMS進(jìn)行注冊(cè)廣播
- 廣播發(fā)送者通過(guò)Binder機(jī)制向AMS發(fā)送廣播
- AMS查找符合相應(yīng)條件的廣播發(fā)送到BroadcastReceiver相應(yīng)的循環(huán)隊(duì)列中
- 消息隊(duì)列執(zhí)行拿到廣播,回調(diào)BroadcastReceiver的onReceiver()
6、LocalBroadcastManager特點(diǎn)
- 本地廣播只能在自身App內(nèi)傳播,不必?fù)?dān)心泄漏隱私數(shù)據(jù)
- 本地廣播不允許其他App對(duì)你的App發(fā)送該廣播,不必?fù)?dān)心安全漏洞被利用
- 本地廣播比全局廣播更高效
- 以上三點(diǎn)都是源于其內(nèi)部是用Handler實(shí)現(xiàn)的
WebView面試題
1、WebView安全漏洞
API16之前存在遠(yuǎn)程代碼執(zhí)行安全漏洞,該漏洞源于程序沒有正確限制使用WebView.addJavascriptInterface方法,遠(yuǎn)程攻擊者可通過(guò)使用Java反射機(jī)制利用該漏洞執(zhí)行任意Java對(duì)象的方法
2、WebView銷毀步驟
WebView在其他容器上時(shí)(如:LinearLayout),當(dāng)銷毀Activity時(shí),需要在onDestroy()中先移除容器上的WebView,然后再將WebView.destroy(),這樣就不會(huì)導(dǎo)致內(nèi)存泄漏
3、WebView的jsbridge
客戶端和服務(wù)端之間可以通過(guò)Javascript來(lái)互相調(diào)用各自的方法
4、WebViewClient的onPageFinished
WebViewClient的onPageFinished在每次完成頁(yè)面的時(shí)候調(diào)用,但是遇到未加載完成的頁(yè)面跳轉(zhuǎn)其他頁(yè)面時(shí),就會(huì)一直調(diào)用,使用WebChromeClient.onProgressChanged可以替代
5、WebView后臺(tái)耗電
在WebView加載頁(yè)面的時(shí)候,會(huì)自動(dòng)開啟線程去加載,如果不很好的關(guān)閉這些線程,就會(huì)導(dǎo)致電量消耗加大,可以采用暴力的方法,直接在onDestroy方法中System.exit(0)結(jié)束當(dāng)前正在運(yùn)行中的java虛擬機(jī)
6、WebView硬件加速
Android3.0引入硬件加速,默認(rèn)會(huì)開啟,WebView在硬件加速的情況下滑動(dòng)更加平滑,性能更加好,但是會(huì)出現(xiàn)白塊或者頁(yè)面閃爍的副作用,建議WebView暫時(shí)關(guān)閉硬件加速
7、WebView內(nèi)存泄漏
由于WebView是依附于Activity的,Activity的生命周期和WebView啟動(dòng)的線程的生命周期是不一致的,這會(huì)導(dǎo)致WebView一直持有對(duì)這個(gè)Activity的引用而無(wú)法釋放,解決方案如下
-
獨(dú)立進(jìn)程,簡(jiǎn)單暴力,不過(guò)可能涉及到進(jìn)程間通信(推薦)
-
動(dòng)態(tài)添加WebView,對(duì)傳入WebView中使用的Context使用弱引用
Binder面試題
1、Linux內(nèi)核的基本知識(shí)
-
進(jìn)程隔離/虛擬地址空間:進(jìn)程間是不可以共享數(shù)據(jù)的,相當(dāng)于被隔離,每個(gè)進(jìn)程被分配到不同的虛擬地址中
-
系統(tǒng)調(diào)用:Linux內(nèi)核對(duì)應(yīng)用有訪問權(quán)限,用戶只能在應(yīng)用層通過(guò)系統(tǒng)調(diào)用,調(diào)用內(nèi)核的某些程序
-
binder驅(qū)動(dòng):它負(fù)責(zé)各個(gè)用戶的進(jìn)程,通過(guò)binder通信內(nèi)核來(lái)進(jìn)行交互的模塊
2、為什么使用Binder
- 性能上,相比傳統(tǒng)的Socket更加高效
- 安全性高,支持協(xié)議雙方互相校驗(yàn)
3、Binder通信模型
-
Service服務(wù)端通過(guò)Binder驅(qū)動(dòng)在ServiceManager的查找表中注冊(cè)O(shè)bject對(duì)象的add方法
-
Client客戶端通過(guò)Binder驅(qū)動(dòng)在ServiceManager的查找表中找到Object對(duì)象的add方法,并返回proxy的add方法,add方法是個(gè)空實(shí)現(xiàn),proxy也不是真正的Object對(duì)象,是通過(guò)Binder驅(qū)動(dòng)封裝好的代理類的add方法
-
當(dāng)Client客戶端調(diào)用add方法時(shí),Client客戶端通過(guò)Binder驅(qū)動(dòng)將proxy的add方法,請(qǐng)求ServiceManager來(lái)找到Service服務(wù)端真正對(duì)象的add方法,進(jìn)行調(diào)用
4、AIDL
-
客戶端通過(guò)aidl文件的Stub.asInterface()方法,拿到Proxy代理類
-
通過(guò)調(diào)用Proxy代理類的方法,將參數(shù)進(jìn)行封包后,調(diào)用底層的transact()方法
-
transact()方法會(huì)回調(diào)onTransact()方法,進(jìn)行參數(shù)的解封
-
在onTransact()方法中調(diào)用服務(wù)端對(duì)應(yīng)的方法,并將結(jié)果返回
Handler面試題
1、Handler是什么
Handler通過(guò)發(fā)送和處理Message和Runnable對(duì)象來(lái)關(guān)聯(lián)相對(duì)應(yīng)線程的MessageQueue
2、Handler使用方法
- post(runnable)
- sendMessage(message)
3、Handler工作原理
4、Handler引起的內(nèi)存泄漏
原因:非靜態(tài)內(nèi)部類持有外部類的匿名引用,導(dǎo)致Activity無(wú)法釋放
解決:
- Handler內(nèi)部持有外部Activity的弱引用
- Handler改為靜態(tài)內(nèi)部類
- Handler.removeCallback()
AsyncTask面試題
1、AsyncTask是什么
它本質(zhì)上就是一個(gè)封裝了線程池和Handler的異步框架
2、AsyncTask使用方法
三個(gè)參數(shù)
-
Params:表示后臺(tái)任務(wù)執(zhí)行時(shí)的參數(shù)類型,該參數(shù)會(huì)傳給AysncTask的doInBackground()方法
-
Progress:表示后臺(tái)任務(wù)的執(zhí)行進(jìn)度的參數(shù)類型,該參數(shù)會(huì)作為onProgressUpdate()方法的參數(shù)
-
Result:表示后臺(tái)任務(wù)的返回結(jié)果的參數(shù)類型,該參數(shù)會(huì)作為onPostExecute()方法的參數(shù)
五個(gè)方法
-
onPreExecute():異步任務(wù)開啟之前回調(diào),在主線程中執(zhí)行
-
doInBackground():執(zhí)行異步任務(wù),在線程池中執(zhí)行
-
onProgressUpdate():當(dāng)doInBackground中調(diào)用publishProgress時(shí)回調(diào),在主線程中執(zhí)行
-
onPostExecute():在異步任務(wù)執(zhí)行之后回調(diào),在主線程中執(zhí)行
-
onCancelled():在異步任務(wù)被取消時(shí)回調(diào)
3、AsyncTask工作原理
4、AsyncTask引起的內(nèi)存泄漏
原因:非靜態(tài)內(nèi)部類持有外部類的匿名引用,導(dǎo)致Activity無(wú)法釋放
解決:
- AsyncTask內(nèi)部持有外部Activity的弱引用
- AsyncTask改為靜態(tài)內(nèi)部類
- AsyncTask.cancel()
5、AsyncTask生命周期
在Activity銷毀之前,取消AsyncTask的運(yùn)行,以此來(lái)保證程序的穩(wěn)定
6、AsyncTask結(jié)果丟失
由于屏幕旋轉(zhuǎn)、Activity在內(nèi)存緊張時(shí)被回收等情況下,Activity會(huì)被重新創(chuàng)建,此時(shí),舊的AsyncTask持有舊的Activity引用,這個(gè)時(shí)候會(huì)導(dǎo)致AsyncTask的onPostExecute()對(duì)UI更新無(wú)效
7、AsyncTask并行or串行
-
AsyncTask在Android 2.3之前默認(rèn)采用并行執(zhí)行任務(wù),AsyncTask在Android 2.3之后默認(rèn)采用串行執(zhí)行任務(wù)
-
如果需要在Android 2.3之后采用并行執(zhí)行任務(wù),可以調(diào)用AsyncTask的executeOnExecutor()
HandlerThread面試題
1、HandlerThread產(chǎn)生背景
當(dāng)系統(tǒng)有多個(gè)耗時(shí)任務(wù)需要執(zhí)行時(shí),每個(gè)任務(wù)都會(huì)開啟一個(gè)新線程去執(zhí)行耗時(shí)任務(wù),這樣會(huì)導(dǎo)致系統(tǒng)多次創(chuàng)建和銷毀線程,從而影響性能。為了解決這一問題,Google提供了HandlerThread,HandlerThread是在線程中創(chuàng)建一個(gè)Looper循環(huán)器,讓Looper輪詢消息隊(duì)列,當(dāng)有耗時(shí)任務(wù)進(jìn)入隊(duì)列時(shí),則不需要開啟新線程,在原有的線程中執(zhí)行耗時(shí)任務(wù)即可,否則線程阻塞
2、HanlderThread的特點(diǎn)、
- HandlerThread本質(zhì)上是一個(gè)線程,繼承自Thread
- HandlerThread有自己的Looper對(duì)象,可以進(jìn)行Looper循環(huán),可以創(chuàng)建Handler
- HandlerThread可以在Handler的handlerMessage中執(zhí)行異步方法
- HandlerThread優(yōu)點(diǎn)是異步不會(huì)堵塞,減少對(duì)性能的消耗
- HandlerThread缺點(diǎn)是不能同時(shí)繼續(xù)進(jìn)行多任務(wù)處理,需要等待進(jìn)行處理,處理效率較低
- HandlerThread與線程池不同,HandlerThread是一個(gè)串行隊(duì)列,背后只有一個(gè)線程。
IntentService面試題
1、IntentService是什么
IntentService是繼承自Service并處理異步請(qǐng)求的一個(gè)類,其內(nèi)部采用HandlerThread和Handler實(shí)現(xiàn)的,在IntentService內(nèi)有一個(gè)工作線程來(lái)處理耗時(shí)操作,其優(yōu)先級(jí)比普通Service高。當(dāng)任務(wù)完成后,IntentService會(huì)自動(dòng)停止,而不需要手動(dòng)調(diào)用stopSelf()。另外,可以多次啟動(dòng)IntentService,每個(gè)耗時(shí)操作都會(huì)以工作隊(duì)列的方式在IntentService中onHandlerIntent()回調(diào)方法中執(zhí)行,并且每次只會(huì)執(zhí)行一個(gè)工作線程
2、IntentService使用方法
- 創(chuàng)建Service繼承自IntentService
- 覆寫構(gòu)造方法和onHandlerIntent()方法
- 在onHandlerIntent()中執(zhí)行耗時(shí)操作
題外話
不管怎么樣,不論是什么樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的準(zhǔn)備,當(dāng)然除了這個(gè)還需要在平時(shí)把自己的基礎(chǔ)打扎實(shí),這樣不論面試官怎么樣一個(gè)知識(shí)點(diǎn)里往死里鑿,你也能應(yīng)付如流啊~
這里我為大家準(zhǔn)備了一些我工作以來(lái)以及參與過(guò)的大大小小的面試收集總結(jié)出來(lái)的一套進(jìn)階學(xué)習(xí)的視頻及面試專題資料包,點(diǎn)擊這里免費(fèi)分享給大家,主要還是希望大家在如今大環(huán)境不好的情況下面試能夠順利一點(diǎn),希望可以幫助到大家~
最后如果馬化騰把騰訊給你一天,你會(huì)來(lái)做什么?歡迎評(píng)論區(qū)討論。
tent()中執(zhí)行耗時(shí)操作
題外話
不管怎么樣,不論是什么樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的準(zhǔn)備,當(dāng)然除了這個(gè)還需要在平時(shí)把自己的基礎(chǔ)打扎實(shí),這樣不論面試官怎么樣一個(gè)知識(shí)點(diǎn)里往死里鑿,你也能應(yīng)付如流啊~
這里我為大家準(zhǔn)備了一些我工作以來(lái)以及參與過(guò)的大大小小的面試收集總結(jié)出來(lái)的一套進(jìn)階學(xué)習(xí)的視頻及面試專題資料包,點(diǎn)擊這里免費(fèi)分享給大家,主要還是希望大家在如今大環(huán)境不好的情況下面試能夠順利一點(diǎn),希望可以幫助到大家~
[外鏈圖片轉(zhuǎn)存中…(img-bKz1jA5d-1621870995950)]
最后如果馬化騰把騰訊給你一天,你會(huì)來(lái)做什么?歡迎評(píng)論區(qū)討論。
總結(jié)
以上是生活随笔為你收集整理的现在做Android开发有前途吗?附面试题答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做输卵管检查很痛苦吗
- 下一篇: 目前最全的《Android面试题及解析》