下面是筆者自己最近面試以后總結的一些面試題谒府,以后會一點一點的添加艇纺。題目有點多,送給有緣人媚污!
面試題:有沒有用過自定義View舀瓢?
答:有用過,一般指定View都需要進行這幾個步驟耗美,首先可以自定義一些自己的屬性氢伟,在res/values/attrs.xml里面定義,然后在layout中使用幽歼,在View中通過context.obtainStyledAttributes(attrs,R.styleable.自定義屬性的名字)進行獲取。
然后在測量onMeasure,一般通過他的三個模式(EXACTLY谬盐,AT_MODE,甸私,UNSPECIFIED)進行測量,調用setMeasuredDimension進行傳入設置的值飞傀。
接著如果是ViewGroupt 的話我們還需要設置下子View的位置皇型,一般是通過requestLayout去觸發(fā)onLayout的方法的诬烹。
最后在onDraw里面通過Canvas的一些方法進行繪制。
如果需要進行觸摸事件的話弃鸦,一般需要有實現(xiàn)onTouchEvent事件绞吁,注意,如果需要多點觸摸唬格,需要實現(xiàn)ACTION_POINTER_DOWN和ACTION_POINTER_UP進行處理家破。
面試題:layout_weight怎么理解?
答:layout_weight的尺寸分配一般是先滿足設置尺寸的分配然后剩下的尺寸在進行比例分配的购岗。如果一個view需要設置1:2的比例顯示汰聋,可以在LinearLayout中設置weightSum進行設置總的比例,然后在設置子View的比例喊积。
面試題:layout_gravity和gravity的區(qū)別烹困?
答:layout_gravity是根據父布局設置位置的,而gravity是根據自身內容設置位置乾吻。
面試題:你了解Handler嗎髓梅?Handler機制是什么?
答:Handler是Android官方給我們提供的一套更新UI線程的機制绎签,也是一套消息處理機制枯饿,可以通過Handler來處理消息,更新UI等辜御。
然后Handler機制大約是這樣的:首先Handler發(fā)送一個消息MessageQueue里面鸭你,然后通過Looper的loop方法進行無限循環(huán),如果產生了一個新消息擒权,那么就調用handler的handlermessage方法進行余下的操作袱巨。之所以這樣做的原因是因為避免多線程并發(fā)更新UI線程所產生的問題的,如果我們允許其他子線程都可以更新界面碳抄,那么勢必會造成界面的錯亂(因為沒有加鎖機制)愉老,如果我們加鎖,又會影響速度剖效,所以嫉入,只能在主線程即UI線程里面更新界面。
面試題:只能在UI線程里面更新界面嗎璧尸?
答:不一定咒林,之所以子線程不能更新界面,是因為Android在線程的方法里面采用checkThread進行判斷是否是主線程爷光,而這個方法是在ViewRootImpl中的垫竞,這個類是在onResume里面才生成的,因此,如果這個時候子線程在onCreate方法里面生成更新UI欢瞪,而且沒有做阻塞活烙,就是耗時多的操作,還是可以更新UI的遣鼓。
面試題:Android子線程更新UI的方式有幾種啸盏?
答:一般情況下,我們都采用Handler的方式進行更新UI骑祟,當然回懦,代碼層的實現(xiàn)有不同的方法,比如可以使用Handler的post方法進行更新UI曾我,或者用Handler的sendMessage方法進行更新UI粉怕,或者通過View的post方法進行更新,還有一個是runOnUIThread也是可以進行更新的抒巢。但這些本質上還是通過Handler進行子線程的更新贫贝。
面試題: 使用Handler的時候一般會遇到什么問題?
答:比如說子線程更新UI蛉谜,是因為觸發(fā)了checkThread方法檢查是否在主線程更新UI稚晚,還有就是子線程中沒有Looper,這個原因是因為Handler的機制引起的型诚,因為Handler發(fā)送Message的時候客燕,需要將Message放到MessageQueue里面,而這個時候如果沒有Looper的話狰贯,就無法循環(huán)輸出MessageQueue了也搓,這個時候就會報Looper為空的錯誤。
面試題:你知道HandlerThread是什么嗎涵紊?
答:HandlerThread是Android官方給我們提供好的一套子線程的Handler傍妒,也就是異步處理機制,它是為了避免線程切換導致空指針異常的錯誤摸柄。
面試題:怎么在主線程中通知子線程颤练?這樣做有什么好處?
答:可以利用HandlerThread進行生成一個子線程的Handler驱负,并且實現(xiàn)handlerMessage方法嗦玖,然后在主線程里面也生成一個Handler,然后通過調用sendMessage方法進行通知子線程跃脊。同樣宇挫,子線程里面也可以調用sendMessage方法進行通知主線程。這樣做的好處比如有些圖片的加載啊酪术,網絡的訪問啊可能會比較耗時器瘪,所以放到子線程里面做是比較合適的。
面試題:異步處理有幾種方式?
答:可以采用Handler的形式娱局,利用官方提供的HandlerThread類進行聲明一個子線程的Handler,然后在Handler里面就可以做耗時的操作了咧七,注意衰齐,需要在子線程中提前準備好Looper對象,可以使用Looper.prepare方法继阻,最后需要使用Looper.loop方法進行循環(huán)耻涛。還可以直接用AsyncTask進行操作,一般會構造函數有三個參數,一個是傳入參數,一個是進度赖草,還有一個是結果护奈,然后一般會實現(xiàn)一些方法,比如:execute用來用來執(zhí)行一個異步任務早敬,就是實現(xiàn)的AsyncTask的類調用的,還有onPreExecute,就是調用后立即執(zhí)行奏赘,doInBackground,在onPreExecute完成后立即執(zhí)行太惠,用于執(zhí)行較為費時的操作磨淌,此方法將接收輸入參數和返回計算結果。onProgressUpdate凿渊,可以直接將進度信息更新到UI界面上梁只。onPostExecute,后臺結束時候調用的方法埃脏,會返回結果搪锣。注意,不能執(zhí)行多次剂癌,不然會報錯淤翔,且必須在UI線程中調用,至于上面提到的方法都不要手動調用佩谷。doInBackground方法中不可以更新UI旁壮。
(因為Android3.0以后必須要求網絡訪問在子線程中,不然會拋NetworkOnMainThreadException異常谐檀,嘗試ANR現(xiàn)象(5秒不響應現(xiàn)象))
面試題:Android中有幾種布局抡谐?
答:Android中一般有五種布局,首先比較常用的兩種布局是LinearLayout和RelativeLayout桐猬,就是線性布局和相對布局麦撵,線性布局的話一般是指定方向,然后從左往右或者從上往下排列的,相對布局的話是依賴與父控件或者其他View進行確定位置的免胃。然后還有FrameLayout音五,TableLayout和AbsoluteLayout,其中FrameLayout就是一層一層的疊加的羔沙,TableLayout有點類似與HTML的表格躺涝,然后AbsoluteLayout的話是通過坐標確定位置的,因為Android屏幕多種多樣扼雏,所以一般都不推薦用絕對布局坚嗜。
面試題:說下Activity的生命周期。
答:Activity的生命周期是這樣的诗充,首先當用戶啟動一個Activity的時候苍蔬,就會調用onCreate的方法,這個時候一般把要初始化的東西都放到這里蝴蜓,接著就會調用onStart方法碟绑,這個時候如果需要監(jiān)聽UI的變化或者數據的變化,一般可以放到這里励翼,然后執(zhí)行onResume方法蜈敢,這個時候界面就已經顯示好了。然后如果這個時候按了home鍵的話汽抚,就會調用onPause方法抓狭,接著是執(zhí)行onStop方法,這個時候可以取消或停止剛才監(jiān)聽的UI或數據變化的監(jiān)聽器造烁,接著如果這個時候你返回到剛才的Activity的話否过,可能產生兩種情況,一種就是因為系統(tǒng)回收了你的Activity惭蟋,這個時候就重新執(zhí)行onCreate onStart onResume苗桂,如果系統(tǒng)沒有回收你的Activity的話,就執(zhí)行onRestart onResume方法告组,如果這個時候又不想回去煤伟,剛好內存不夠了,就會執(zhí)行onDestory方法進行銷毀木缝。
面試題:Activity的啟動模式有幾種便锨?
答:有四種啟動模式,首先默認的啟動模式是standard,就是沒創(chuàng)建一個Activity就會將其壓入任務棧棧頂我碟,不管是否存在放案,一種是singleTop,就是如果任務棧棧頂剛好是要顯示的Activity,它就不會創(chuàng)建一個新的Activity矫俺,如果不是吱殉,就會重新創(chuàng)建一個新的Activity掸冤,一種是singleTask,如果Activiy 已經存在友雳,不管是棧頂還是棧中稿湿,它就會把要創(chuàng)建的Activiy移到棧頂。一種是singleInstance,就是如果應用1創(chuàng)建了Activity押赊,這個時候應用2也想調用該Activity缎罢,這個時候就不需要重新調用了。
面試題:Android中的四大組件是什么考杉?
答:Android中的四大組件分別是,Activity舰始,就是我們看到的界面顯示崇棠,Service,就是服務丸卷,一般是沒有界面的枕稀,如果按照運行地點分的話,可以分為本地服務和遠程服務谜嫉,也就是說它的啟動是否跟啟動他的進程有關系萎坷。ContentProvide,就是內容提供者沐兰,主要用來對外共享數據的哆档。還有一個就是BroadcastReceiver,就是廣播接收者住闯,是一個全局的監(jiān)聽器瓜浸,一般用來傳遞接受消息的。
面試題:Activity的緩存方法是怎么樣的比原?
答:可以在onSaveInstanceState中將要保存的數據保存起來插佛,可以通過Bundle進行臨時保存,然后在onCreate中的Bundle中取出來進行恢復量窘,這樣就可以避免Activity被銷毀的時候數據的清空雇寇。因為onSaveInstanceState在Activity銷毀之前必然會調用,所以可以在這里做緩存操作蚌铜。記住锨侯,這個是系統(tǒng)未經你同意的時候就銷毀的時候才會的。
面試題:Fragment的生命周期是怎么樣的厘线,跟Activity有什么關系识腿?
答:Fragment是Activity的一個組件片段,也就是說他的生命周期是依賴于Activity的造壮,但是它比Activity多了幾個生命步驟渡讼,首先onAttach當fragment加入Activity的時候調用骂束,然后是onCreate進行啟動Activity,接著是onCreateView進行繪制View成箫,一般的View就是這里繪制的展箱,然后是onActivityCreated,接著跟Activity的生命周期差不多蹬昌,調用onStart和onResume,然后是onPause,onStop,如果這個時候需要回收Fragment的時候混驰,就會調用,接著是onDestoryView銷毀布局皂贩,然后是onDestory和onDetach完成栖榨。
面試題:為什么在Service中創(chuàng)建子線程而不是Activity中?
答:因為假如在Activity中創(chuàng)建子線程的話明刷,當Activity銷毀的時候婴栽,這個時候重新再調用該Activity就會重新走新的生命周期,這個時候就無法再重新獲取到剛才的子線程辈末,而且如果在一個Activity中創(chuàng)建子線程愚争,另一個Activity也無法操作該子線程,但是Service就不一樣挤聘,所有的Activity都可以和Service關聯(lián)轰枝,即使是Activity被銷毀了,只要再重新建立聯(lián)系就好了组去,所以鞍陨,一般后臺任務都是通過Service去控制的。
面試題:Intent可以傳遞哪些數據从隆?怎么傳遞湾戳?
答:Intent可以傳遞String類型的,基本類型广料,還有對象砾脑,如果是基本類型,可以通過Intent的方法直接傳遞就好了艾杏,如果是對象的話韧衣,一般可以通過Bundle進行傳遞,有些對象需要進行序列化和包裹化购桑。
面試題:怎么啟動Service畅铭?
答:有兩種啟動方式,一種是通過startService進行啟動勃蜘,這個時候Service跟啟動的Activity沒有關聯(lián)硕噩,只有當調用stopService的時候才會結束Service,他的生命周期是:onCreate->onStartCommand->Service Run ->stopService->onDestory();如果是通過bindService啟動的缭贡,那么這個Service就跟啟動他的進程有關了炉擅,這個時候如果啟動他的進程銷毀了辉懒,那么這個Service也緊跟著銷毀了或者直接調用unBindService,生命周期是:onCreate->onBindService->Service Run->unBindService->onDestory.
面試題:廣播的動態(tài)注冊和靜態(tài)注冊有什么區(qū)別谍失?
答:靜態(tài)注冊:在AndroidManifest.xml文件中進行注冊眶俩,當App退出后,Receiver仍然可以接收到廣播并且進行相應的處理
動態(tài)注冊:在代碼中動態(tài)注冊快鱼,當App退出后颠印,也就沒辦法再接受廣播了。
面試題:ContentProvide的使用方法抹竹?
答:首先我們應該為數據創(chuàng)建一個類线罕,集成ContentProvide,然后在配置文件里面配置這個ContentProvide,接著需要準備好數據庫操作類和數據庫訪問類窃判,初始化URI闻坚,URI的形式為:content://包名,然后便是在數據庫操作類中實現(xiàn)操作方法,這個時候就可以提供數據共享服務了兢孝。
面試題:URI的格式和意義。
答:URI叫做統(tǒng)一資源標識符仅偎,主要分四部分跨蟹,第一部分是協(xié)議名稱,可以是官方的橘沥,也可以自定義窗轩,第二部分是是URI的授權部分,是唯一標識符座咆,用來定位ContentProvider痢艺。格式一般是自定義ContentProvider類的完全限定名稱,注冊時需要用到介陶,如:com.alexzhou.provider.NoteProvider第三部分部分和第四部分部分:是每個ContentProvider內部的路徑部分堤舒,C和D部分稱為路徑片段,C部分指向一個對象集合哺呜,一般用表的名字舌缤,如:/notes表示一個筆記集合;D部分指向特定的記錄某残,如:/notes/1表示id為1的筆記国撵,如果沒有指定D部分,則返回全部記錄玻墅。
面試題:動畫有哪兩類介牙?各有什么特點?
答:tween補間動畫澳厢,通過指定View的初末狀態(tài)和變化時間环础、方式囚似,對View的內容完成一系列的圖形變換來實現(xiàn)動畫效果。 Alpha Scale Translate Rotate喳整。
frame幀動畫谆构,AnimationDrawable 控制 animation-list xml布局。
PropertyAnimation 屬性動畫框都。
面試題:Android存儲形式有幾種搬素?
答:1.SQLite方式,SQLite是一個輕量級的數據庫魏保, 支持基礎的SQL語法熬尺,官方提供了一個SQLiteDatabase的類,并提供一些api谓罗。
2.SharedPreference:存儲簡單的參數信息粱哼,本質上是xml.
3.File:文件存儲,常用來存儲大數據量的數據檩咱,但是更新麻煩揭措。
4.ContentProvide,一般情況下數據在各個應用中是私密的刻蚯,但是因為它也是可以用來存儲分享數據绊含。
5.網絡存儲,將數據放到網絡云里面炊汹,然后通過網絡進行訪問躬充。
面試題:SQLite的基礎操作。
答:首先需要創(chuàng)建庫和表讨便,并且需要繼承SQLiteOpenHelper類充甚,然后在這個表里面實現(xiàn)增刪改查的方法,可以用Android官方封裝好的方法進行霸褒,也可以調用SQL語句進行操作伴找。調用SQLiteDatabase中的execSQL方法操作SQL語句。
面試題:如何判斷應用被強制殺死废菱?
答:可以在Application中定義一個static常量疆瑰,賦值為-1,然后在歡迎頁面修改值為0昙啄,如果被強殺穆役,Application被重新初始化,這個時候如果父Activity判斷該常量是多少梳凛。
面試題:如何解決應用被強制殺死耿币?
答:如果在每一個Activity的onCreate里判斷是否被強殺,冗余了韧拒,封裝到Activity的父類中淹接,如果被強殺十性,跳轉回主界面,如果沒有被強殺塑悼,執(zhí)行Activity的初始化操作劲适,給主界面?zhèn)鬟fintent參數,主界面會調用onNewIntent方法厢蒜,在onNewIntent跳轉到歡迎頁面霞势,重新來一遍流程。
面試題:Json有什么優(yōu)勢斑鸦?
答:JSON格式簡單愕贡,兼容性高,易于讀寫巷屿,并且傳輸的帶寬小固以,方便解析,并且服務端容易生成嘱巾。
面試題:動畫有哪些類型憨琳,動畫的區(qū)別?
答: 在Android3.0以前旬昭,動畫有兩種類型篙螟,一種是補間動畫,即tween,他指的是通過自身的變形達到的效果稳懒,比如說透明度的變化,放大縮小等慢味,還有一種是幀動畫场梆,即Frame,是通過一針一針的對圖片進行連貫起來播放的纯路,Android3.0的時候定義了一個屬性動畫或油,即PropertyAnimation,指的是控件的真實移動,就是不斷的改變某些屬性的值進行的驰唬。具體可以通過實現(xiàn)ValueAnimator等類進行實現(xiàn)顶岸。
面試題:Asset和res目錄的區(qū)別?
答:Asset不會在R文件里面生成一個ID叫编,所以它不能直接用R文件來調用辖佣,這就說明要讀取Asset目錄下的文件需要指定文件的目錄,可以通過AssetManager類來訪問搓逾。res會自動在R文件里面生成id卷谈,直接可以用R.的方式進行訪問資源。
面試題:Android怎么優(yōu)化啟動速度霞篡?
答:因為Android啟動應用程序一般分為兩種世蔗,一種是冷啟動端逼,就是要啟動的應用程序沒有后臺進程的啟動,這個時候需要重新分配一個進程給他污淋,所以這個時候會先初始化Application類顶滩,再創(chuàng)建和初始化MainAcitvity 類,最后顯示到界面上寸爆,還有一種是熱啟動礁鲁,就是后臺還有該應用的進程,比如說按下的home鍵或者返回鍵而昨,雖然表面上退出了救氯,但是在任務棧里面仍然還存在的,這個時候就不需要再初始化Application類了歌憨,只要重新初始化MainActivity了着憨。因為大多數應用的啟動都是冷啟動(用戶習慣將應用程序在任務棧中刪除),所以這個時候可以采取這幾個步驟务嫡,比如盡量不在Application的構造器甲抖,attachBaseContext方法和onCreaete方法中做過多的耗時操作,將一些數據預取放在異步線程中心铃,可以采Callback的方式准谚。優(yōu)化MainActivity,盡量不要在MainActivity的onCreate去扣,onStart和onResume等方法里面做過多的耗時操作柱衔。
面試題:Android怎么加快Activity的顯示速度?
答:首先因為Activiy的顯示是在這幾個生命周期之間的愉棱,onCreate唆铐,onStart,和onResume,這個時候我們需要將我們需要初始化的數據分類奔滑,比如說我們將一些只需要初始化的一次的數據放到onCreate中艾岂,盡量不要在onCreate中做耗時的操作,然后將需要加載比較長時間的數據放到onResume中朋其,可以利用handler的機制進行更新UI王浴,或者放到AsyncTask逐個顯示,然后可以設置一些動畫進行顯示梅猿,如果這個時候有許多數據都是一次顯示的氓辣, 那么可以在onCreate里面進行標記,并且在onResume里面判斷是否需要初始化袱蚓,初始化完成以后就立刻false掉筛婉,這樣就可以避免多次初始化了,也可以提升Activity的顯示速度。
面試題: Android內存泄漏可以引發(fā)什么問題爽撒?
答:可能使程序造成卡頓的現(xiàn)象入蛆,或者莫名的消失,因為內存過大硕勿,系統(tǒng)就更可能的回收這一塊的內存哨毁,或者直接崩潰。
面試題:產生Android內存泄漏的原因有什么源武?
答:handler等生命周期較長的匿名內部類扼褪,因為這些匿名內部類可能會持有外部的引用,從而導致短期內就算Activity退出而一些資源沒有被回收粱栖,數據結構未優(yōu)化话浇,圖片沒有優(yōu)化,沒有注意到對象的生命周期闹究,造成許多對象沒有被回收幔崖,過多的使用Service,單例的過多使用渣淤,無效的資源等等赏寇。
面試題:怎么處理Android內存泄漏?
答:可以使用更加輕量的數據結構价认,比如ArrayMap而不是HashMap嗅定,避免在Android里面使用enum,減小Bitmap對象的內存占用,可以采用縮放比例用踩,或者使用緩存縮略圖的方式渠退。
作者:
鏈接:https://www.imooc.com/article/11965
來源:慕課網