日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

腾讯面试Android必问11题,我说的,不信就来看看

發(fā)布時(shí)間:2023/12/13 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 腾讯面试Android必问11题,我说的,不信就来看看 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

眾所周知兔子啥都會(huì)那么一點(diǎn),不收藏等著干啥呢

1、是否使用過(guò)本地廣播,和全局廣播有什么差別?

引入本地廣播的機(jī)制是為了解決安全性的問(wèn)題:

  • 正在發(fā)送的廣播不會(huì)脫離應(yīng)用程序,比用擔(dān)心app的數(shù)據(jù)泄露;
  • 其他的程序無(wú)法發(fā)送到我的應(yīng)用程序內(nèi)部,不擔(dān)心安全漏洞。(比如:如何做一個(gè)殺不死的服務(wù)---監(jiān)聽(tīng)火的app 比如微信、友盟、極光的廣播,來(lái)啟動(dòng)自己。)
  • 發(fā)送本地廣播比發(fā)送全局的廣播高效。(全局廣播要維護(hù)的廣播集合表 效率更低。全局廣播,意味著可以跨進(jìn)程,就需要底層的支持。)
  • 本地廣播不能用靜態(tài)注冊(cè)。----靜態(tài)注冊(cè):可以做到程序停止后還能監(jiān)聽(tīng)。

    使用:

  • 注冊(cè)
  • LocalBroadcastManager.getInstance(this).registerReceiver(new XXXBroadCastReceiver(), new IntentFilter(action));

  • 取消注冊(cè):
  • LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver)

    ?

    2、導(dǎo)致內(nèi)存泄露的原因有哪些?

    ?

    內(nèi)存泄露的根本原因:長(zhǎng)生命周期的對(duì)象持有短生命周期的對(duì)象。短周期對(duì)象就無(wú)法及時(shí)釋放。

    靜態(tài)內(nèi)部類(lèi)非靜態(tài)內(nèi)部類(lèi)的區(qū)別(Handler?引起的內(nèi)存泄漏。)

    靜態(tài)集合類(lèi)引起內(nèi)存泄露

    單例模式引起的內(nèi)存泄漏。

    ?

    解決:Context是ApplicationContext,由于ApplicationContext的生命周期是和app一致的,不會(huì)導(dǎo)致內(nèi)存泄漏

    ?

    注冊(cè)/反注冊(cè)未成對(duì)使用引起的內(nèi)存泄漏。

    集合對(duì)象沒(méi)有及時(shí)清理引起的內(nèi)存泄漏。通常會(huì)把一些對(duì)象裝入到集合中,當(dāng)不使用的時(shí)候一定要記得及時(shí)清理集合,讓相關(guān)對(duì)象不再被引用。

    ?

    減少內(nèi)存對(duì)象的占用:

    I.ArrayMap/SparseArray代替hashmap

    II.避免在android里面使用Enum

    III.減少bitmap的內(nèi)存占用

    inSampleSize:縮放比例,在把圖片載入內(nèi)存之前,我們需要先計(jì)算出一個(gè)合適的縮放比例,避免不必要的大圖載入。

    decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異。

    ?

    IV.減少資源圖片的大小,過(guò)大的圖片可以考慮分段加載

    ?

    3、Android各個(gè)版本API的區(qū)別

    android3.0 代號(hào)Honeycomb, 引入Fragments, ActionBar,屬性動(dòng)畫(huà),硬件加速

    ?

    android4.0 代號(hào)Ice Cream,API14:截圖功能,人臉識(shí)別,虛擬按鍵,3D優(yōu)化驅(qū)動(dòng)

    ?

    android5.0 代號(hào)Lollipop API21:調(diào)整桌面圖標(biāo)及部件透明度等

    ?

    android6.0 代號(hào)M Marshmallow API23,軟件權(quán)限管理,安卓支付,指紋支持,App關(guān)聯(lián),

    ?

    android7.0 代號(hào)N Preview API24,多窗口支持(不影響Activity生命周期),增加了JIT編譯器,引入了新的應(yīng)用簽名方案APK Signature Scheme v2(縮短應(yīng)用安裝時(shí)間和更多未授權(quán)APK文件更改保護(hù)),嚴(yán)格了權(quán)限訪問(wèn)

    ?

    android8.0 代號(hào)O? API26,取消靜態(tài)廣播注冊(cè),限制后臺(tái)進(jìn)程調(diào)用手機(jī)資源,桌面圖標(biāo)自適應(yīng)

    ?

    android9.0 代號(hào)P API27,加強(qiáng)電池管理,系統(tǒng)界面添加了Home虛擬鍵,提供人工智能API,支持免打擾模式

    ?

    4ViewViewGroup事件分發(fā)

    ?

    1. Touch事件分發(fā)中只有兩個(gè)主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個(gè)相關(guān)事件。View包含dispatchTouchEvent、onTouchEvent兩個(gè)相關(guān)事件。其中ViewGroup又繼承于View。

    ?

    2.ViewGroup和View組成了一個(gè)樹(shù)狀結(jié)構(gòu),根節(jié)點(diǎn)為Activity內(nèi)部包含的一個(gè)ViwGroup。

    ?

    3.觸摸事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸摸事件中,Down和Up都只有一個(gè),Move有若干個(gè),可以為0個(gè)。

    ?

    4.當(dāng)Acitivty接收到Touch事件時(shí),將遍歷子View進(jìn)行Down事件的分發(fā)。ViewGroup的遍歷可以看成是遞歸的。分發(fā)的目的是為了找到真正要處理本次完整觸摸事件的View,這個(gè)View會(huì)在onTouchuEvent結(jié)果返回true。

    ?

    5.當(dāng)某個(gè)子View返回true時(shí),會(huì)中止Down事件的分發(fā),同時(shí)在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進(jìn)行處理。由于子View是保存在ViewGroup中的,多層ViewGroup的節(jié)點(diǎn)結(jié)構(gòu)時(shí),上級(jí)ViewGroup保存的會(huì)是真實(shí)處理事件的View所在的ViewGroup對(duì)象:如ViewGroup0-ViewGroup1-TextView的結(jié)構(gòu)中,TextView返回了true,它將被保存在ViewGroup1中,而ViewGroup1也會(huì)返回true,被保存在ViewGroup0中。當(dāng)Move和UP事件來(lái)時(shí),會(huì)先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。

    ?

    6.當(dāng)ViewGroup中所有子View都不捕獲Down事件時(shí),將觸發(fā)ViewGroup自身的onTouch事件。觸發(fā)的方式是調(diào)用super.dispatchTouchEvent函數(shù),即父類(lèi)View的dispatchTouchEvent方法。在所有子View都不處理的情況下,觸發(fā)Acitivity的onTouchEvent方法。

    ?

    7.onInterceptTouchEvent有兩個(gè)作用:1.攔截Down事件的分發(fā)。2.中止Up和Move事件向目標(biāo)View傳遞,使得目標(biāo)View所在的ViewGroup捕獲Up和Move事件。

    ?

    5、invalidate和postInvalidate的區(qū)別及使用

    View.invalidate():?層層上傳到父級(jí),直到傳遞到ViewRootImpl后觸發(fā)了scheduleTraversals(),然后整個(gè)View樹(shù)開(kāi)始重新按照View繪制流程進(jìn)行重繪任務(wù)。

    ?

    invalidate:在ui線程刷新view

    postInvalidate:在工作線程刷新view(底層還是handler)其實(shí)它的原理就是invalidate+handler

    ?

    View.postInvalidate最終會(huì)調(diào)用ViewRootImpl.dispatchInvalidateDelayed()方法

    public void dispatchInvalidateDelayed(View view, long delayMilliseconds) {Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view);mHandler.sendMessageDelayed(msg, delayMilliseconds);}

    這里的mHandler是ViewRootHandler實(shí)例,在該Handler的handleMessage方法中調(diào)用了view.invalidate()方法。

    ?

    case MSG_INVALIDATE:

    ??????????????????? ((View) msg.obj).invalidate();

    ??????????????????? break;

    6、Activity-Window-View三者的差別

    Activity:是安卓四大組件之一,負(fù)責(zé)界面展示、用戶交互與業(yè)務(wù)邏輯處理;

    Window:就是負(fù)責(zé)界面展示以及交互的職能部門(mén),就相當(dāng)于Activity的下屬,Activity的生命周期方法負(fù)責(zé)業(yè)務(wù)的處理;

    View:就是放在Window容器的元素,Window是View的載體,View是Window的具體展示。

    三者的關(guān)系:?Activity通過(guò)Window來(lái)實(shí)現(xiàn)視圖元素的展示,window可以理解為一個(gè)容器,盛放著一個(gè)個(gè)的view,用來(lái)執(zhí)行具體的展示工作。

    ?

    ?

    ?

    ?

    7、談?wù)剬?duì)Volley的理解

    8、Android 動(dòng)畫(huà)框架實(shí)現(xiàn)原理

    傳統(tǒng)的動(dòng)畫(huà)框架:View.startAnimation();

    弊端:移動(dòng)后不能點(diǎn)擊。原因?跟實(shí)現(xiàn)機(jī)制有關(guān)系。

    所有的透明度、旋轉(zhuǎn)、平移、縮放動(dòng)畫(huà),都是在view不斷刷新調(diào)用draw的情況下實(shí)現(xiàn)的。

    調(diào)用的canvas.translate(xxx),canvas.scaleX(xxx)…. Xxx:matrix像素矩陣來(lái)控制動(dòng)畫(huà)的數(shù)據(jù)。記得看源碼,結(jié)合多只縮放的demo看源碼。

    ?

    9、低版本SDK如何實(shí)現(xiàn)高版本api?

    使用@TargetApi注解·

    ?

    當(dāng)代碼中有比AndroidManifest中設(shè)置的android:minSdkVersion版本更高的方法,此時(shí)編譯器會(huì)提示警告,解決方法是在方法上加上@SuppressLint("NewApi")或者@TargetApi()。但它們僅是屏蔽了android lint錯(cuò)誤,在方法中還要判斷版本做不同的操作。

    ?

    @SuppressLint("NewApi")屏蔽一切新api中才能使用的方法報(bào)的android lint錯(cuò)誤

    ?

    @TargetApi() 只屏蔽某一新api中才能使用的方法報(bào)的android lint錯(cuò)誤,如@TargetApi(11)如果在方法中用了只有API14才開(kāi)始有的方法,還是會(huì)報(bào)錯(cuò)。

    ?

    10、描述一次網(wǎng)絡(luò)請(qǐng)求的流程

    域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請(qǐng)求 --> 服務(wù)器響應(yīng)http請(qǐng)求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請(qǐng)求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶

    11Android開(kāi)發(fā)中何時(shí)使用多進(jìn)程?使用多進(jìn)程的好處是什么?

    ?

    Android里的多進(jìn)程概念一般情況下,一個(gè)應(yīng)用程序就是一個(gè)進(jìn)程,我們知道進(jìn)程是系統(tǒng)分配資源和調(diào)度的基本單位,所以每個(gè)進(jìn)程都有自己獨(dú)立的資源和內(nèi)存空間,別的進(jìn)程不能隨便訪問(wèn)其他進(jìn)程的內(nèi)存和資源。

    如何讓自己的應(yīng)用擁有多個(gè)進(jìn)程?很簡(jiǎn)單,四大組件在AndroidManifest文件中注冊(cè)的時(shí)候,有個(gè)屬性android:process,

    1、這里可以指定組件的所處的進(jìn)程。指定為別的進(jìn)程之后,系統(tǒng)在啟動(dòng)這個(gè)組件的時(shí)候,就先創(chuàng)建這個(gè)進(jìn)程,然后再創(chuàng)建該組件。你可以重載Application類(lèi)的onCreate方法,打印進(jìn)程名稱,就可以清楚看見(jiàn)。

    2、顯而易見(jiàn)的好處就是分擔(dān)主進(jìn)程的內(nèi)存壓力。我們的應(yīng)用越做越大,內(nèi)存越來(lái)越多,將一些獨(dú)立的組件放到不同的進(jìn)程,它就不占用主進(jìn)程的內(nèi)存空間了。當(dāng)然還有其他好處,有心人會(huì)發(fā)現(xiàn)Android后臺(tái)進(jìn)程里有很多應(yīng)用是多個(gè)進(jìn)程的,因?yàn)樗鼈円qv后臺(tái),特別是即時(shí)通訊或者社交應(yīng)用,不過(guò)現(xiàn)在多進(jìn)程已經(jīng)被用爛了。典型用法是在啟動(dòng)一個(gè)不可見(jiàn)的輕量級(jí)私有進(jìn)程,在后臺(tái)收發(fā)消息,或者做一些耗時(shí)的事情,或者開(kāi)機(jī)啟動(dòng)這個(gè)進(jìn)程,然后做監(jiān)聽(tīng)等。還有就是防止主進(jìn)程被殺守護(hù)進(jìn)程,守護(hù)進(jìn)程和主進(jìn)程之間相互監(jiān)視,有一方被殺就重新啟動(dòng)它。應(yīng)該還有還有其他好處,這里就不多說(shuō)了。

    3、壞處的話,多占用了系統(tǒng)的空間,大家都這么用的話系統(tǒng)內(nèi)存很容易占滿而導(dǎo)致卡頓。消耗用戶的電量。應(yīng)用程序架構(gòu)會(huì)變復(fù)雜,應(yīng)為要處理多進(jìn)程之間的通信。這里又是另外一個(gè)問(wèn)題了。

    ?

    12、IntentService原理及作用是什么?

    原理:IntentService是繼承Service的一個(gè)抽象類(lèi),它在onCreate()方法中創(chuàng)建了一個(gè)HandlerThread,并啟動(dòng)該線程。HandlerThread是帶有自己消息隊(duì)列和Looper的線程,根據(jù)HandlerThread的looper創(chuàng)建一個(gè)Handler,這樣IntentService的ServiceHandler的handleMessage()方法就運(yùn)行在子線程中。handleMessage中調(diào)用了onHandleIntent()方法,它是一個(gè)抽象方法,繼承IntentService類(lèi)需要實(shí)現(xiàn)該方法,把耗時(shí)操作放在onHandleIntent()方法中,等耗時(shí)操作運(yùn)行完成后,會(huì)調(diào)用stopSelf()方法,服務(wù)會(huì)調(diào)用onDestory()方法消毀自己。如果onHandleIntent()中的耗時(shí)操作未運(yùn)行完前就調(diào)用了stopSelf()方法,服務(wù)調(diào)用onDestory()方法,但耗時(shí)操作會(huì)繼續(xù)運(yùn)行,直至運(yùn)行完畢。如果同時(shí)多次啟動(dòng)IntentService,任務(wù)會(huì)放在一個(gè)隊(duì)列中,onCreate()和onDestory()方法都只會(huì)運(yùn)行一次。

    ?

    ?

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的腾讯面试Android必问11题,我说的,不信就来看看的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。