android面試精彩題目總結(jié)
Android(['ændrɔid])是一個(gè)以Linux為基礎(chǔ)的半開源操作系統(tǒng),主要用于移動(dòng)設(shè)備,由Google和開放手持設(shè)備聯(lián)盟開發(fā)與領(lǐng)導(dǎo)。下面就由學(xué)習(xí)啦小編為大家介紹一下android面試精彩題目總結(jié)的文章,歡迎閱讀。
android面試精彩題目總結(jié)篇1
1、請(qǐng)解釋下在單線程模型中Message,Handler,Message Queue,Looper之間的關(guān)系。
拿主線程來說,主線程啟動(dòng)時(shí)會(huì)調(diào)用Looper.prepare()方法,會(huì)初始化一個(gè)Looper,放入Threadlocal中,接著調(diào)用Looper.loop()不斷遍歷Message Queue,
Handler的創(chuàng)建依賴與當(dāng)前線程中的Looper,如果當(dāng)前線程沒有Looper則必須調(diào)用Looper.prepare()。Handler , sendMessage到MessageQueue,Looper不斷
從MessageQueue中取出消息,回調(diào)handleMessage方法。
2、如果有個(gè)100M大的文件,需要上傳至服務(wù)器中,而服務(wù)器form表單最大只能上傳2M,可以用什么方法。
這個(gè)問題不是很明確我覺得,首先來說使用http協(xié)議上傳數(shù)據(jù),特別在android下,跟form沒什么關(guān)系。傳統(tǒng)的在web中,在form中寫文件上傳,其實(shí)瀏覽器所做
的就是將我們的數(shù)據(jù)進(jìn)行解析組拼成字符串,以流的方式發(fā)送到服務(wù)器,且上傳文件用的都是POST方式,POST方式對(duì)大小沒什么限制。
回到題目,可以說假設(shè)每次真的只能上傳2M,那么可能我們只能把文件截?cái)?,然后分別上傳了。
3、內(nèi)存溢出和內(nèi)存泄漏有什么區(qū)別?何時(shí)會(huì)產(chǎn)生內(nèi)存泄漏?內(nèi)存優(yōu)化有哪些方法?
內(nèi)存溢出通俗理解就是軟件(應(yīng)用)運(yùn)行需要的內(nèi)存,超出了它可用的最大內(nèi)存。
內(nèi)存泄漏就是我們對(duì)某一內(nèi)存空間的使用,使用完成后沒有釋放。
內(nèi)存優(yōu)化:Android中容易內(nèi)存溢出的部分,就是圖片的加載,我們可以使用圖片的壓縮加上使用LruCache緩存的目的來控制圖片所能夠使用的內(nèi)存。
還有對(duì)于比較耗資源的對(duì)象及時(shí)的關(guān)閉,例如Database Conn , 各種傳感器 , Service 等等。
4、AsyncTask使用在哪些場(chǎng)景?它的缺陷是什么?如何解決?
AsyncTask 運(yùn)用的場(chǎng)景就是我們需要進(jìn)行一些耗時(shí)的操作,耗時(shí)操作完成后更新主線程,或者在操作過程中對(duì)主線程的UI進(jìn)行更新。
缺陷:AsyncTask中維護(hù)著一個(gè)長(zhǎng)度為128的線程池,同時(shí)可以執(zhí)行5個(gè)工作線程,還有一個(gè)緩沖隊(duì)列,當(dāng)線程池中已有128個(gè)線程,緩沖隊(duì)列已滿時(shí),如果
此時(shí)向線程提交任務(wù),將會(huì)拋出RejectedExecutionException。
解決:由一個(gè)控制線程來處理AsyncTask的調(diào)用判斷線程池是否滿了,如果滿了則線程睡眠否則請(qǐng)求AsyncTask繼續(xù)處理。
android面試精彩題目總結(jié)篇2
1、assest文件夾里放文件,對(duì)于文件的大小有沒有限制?22
assets目錄更像一個(gè)附錄類型的目錄,Android不會(huì)為這個(gè)目錄中的文件生成ID并保存在R類當(dāng)中,因此它與Android中的一些類和方法兼容度更低。
同時(shí),由于你需要一個(gè)字符串路徑來獲取這個(gè)目錄下的文件描述符,訪問的速度會(huì)更慢。但是把一些文件放在這個(gè)目錄下會(huì)使一些操作更加方便,
比方說拷貝一個(gè)數(shù)據(jù)庫(kù)文件到系統(tǒng)內(nèi)存中。要注意的是,你無(wú)法在Android XML文件中引用到assets目錄下的文件,只能通過AssetManager來訪問
這些文件。數(shù)據(jù)庫(kù)文件和游戲數(shù)據(jù)等放在這個(gè)目錄下是比較合適的。另外,網(wǎng)上關(guān)于assets和raw的資料都千篇一律了,因此關(guān)于這兩者中單個(gè)文件
大小不能超過1M的**錯(cuò)誤**描述也在傳播,即如果讀取超過1M的文件會(huì)報(bào)"Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)"的
IOException,還引申出種種解決方案。個(gè)人認(rèn)為不應(yīng)該有這樣的限制,為了驗(yàn)證這個(gè)說法寫了個(gè)Demo,發(fā)現(xiàn)將近5M的壓縮包在assets和raw中
都能正常訪問,因此在這里糾正一下,理論上只要打包不超過Android APK 50M大小的限制都是沒有問題的。當(dāng)然了,不排除是Android很早期的
時(shí)候因?yàn)樵O(shè)備硬件原因aapt在編譯的時(shí)候?qū)@兩個(gè)文件夾大小做出了限制,如果是這樣,較新版的ADT應(yīng)該不會(huì)出現(xiàn)這種情況。
2、 啟動(dòng)一個(gè)程序,可以主界面點(diǎn)擊圖標(biāo)進(jìn)入,也可以從一個(gè)程序中跳轉(zhuǎn)過去,二者有什么區(qū)別?
是因?yàn)閱?dòng)程序(主界面也是一個(gè)app),發(fā)現(xiàn)了在這個(gè)程序中存在一個(gè)設(shè)置為的activity,
所以這個(gè)launcher會(huì)把icon提出來,放在主界面上。當(dāng)用戶點(diǎn)擊icon的時(shí)候,發(fā)出一個(gè)Intent:
Intent intent = mActivity.getPackageManager().getLaunchIntentForPackage(packageName);
mActivity.startActivity(intent);
跳過去可以跳到任意允許的頁(yè)面,如一個(gè)程序可以下載,那么真正下載的頁(yè)面可能不是首頁(yè)(也有可能是首頁(yè)),這時(shí)還是構(gòu)造一個(gè)Intent,startActivity.
這個(gè)intent中的action可能有多種view,download都有可能。系統(tǒng)會(huì)根據(jù)第三方程序向系統(tǒng)注冊(cè)的功能,為你的Intent選擇可以打開的程序或者頁(yè)面。所以唯一的一點(diǎn)
不同的是從icon的點(diǎn)擊啟動(dòng)的intent的action是相對(duì)單一的,從程序中跳轉(zhuǎn)或者啟動(dòng)可能樣式更多一些。本質(zhì)是相同的。
android面試精彩題目總結(jié)篇3
1、程序之間的親和性的理解。
1、默認(rèn)情況下一個(gè)應(yīng)用的所有Activity都是具有相同的affinity,都是從application中繼承,application的affinity默認(rèn)就是manifest的包名。
2、affinity對(duì)Activity來說,就像是身份證一樣,可以告訴所在的Task,自己屬于其中的一員。
3、應(yīng)用場(chǎng)合:
a:根據(jù)affinity重新為Activity選擇合適的宿主Task;
b:與allowTaskReparenting屬性配合;
c:啟動(dòng)Activity使用Intent設(shè)置了FLAG_ACTIVITY_NEW_TASK標(biāo)記。
2、同一個(gè)程序,但不同的Activity是否可以放在不同的Task任務(wù)棧中?
可以放在不同的Task中。需要為不同的activity設(shè)置不同的affinity屬性,啟動(dòng)activity的Intent需要包含F(xiàn)LAG_ACTIVITY_NEW_TASK標(biāo)記。
3、橫豎屏切換時(shí)候Activity的生命周期。
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
4、AIDL的全稱是什么?如何工作?
全稱是:Android Interface Define Language
在Android中, 每個(gè)應(yīng)用程序都可以有自己的進(jìn)程. 在寫UI應(yīng)用的時(shí)候, 經(jīng)常要用到Service. 在不同的進(jìn)程中, 怎樣傳遞對(duì)象呢? 顯然, Java中不允許跨進(jìn)程內(nèi)存共享.
因此傳遞對(duì)象, 只能把對(duì)象拆分成操作系統(tǒng)能理解的簡(jiǎn)單形式, 以達(dá)到跨界對(duì)象訪問的目的. 在J2EE中,采用RMI的方式, 可以通過序列化傳遞對(duì)象. 在Android中, 則
采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實(shí)際上做起來卻比較麻煩。
AIDL(AndRoid接口描述語(yǔ)言)是一種借口描述語(yǔ)言; 編譯器可以通過aidl文件生成一段代碼,通過預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程的目的. 如果需要
在一個(gè)Activity中, 訪問另一個(gè)Service中的某個(gè)對(duì)象, 需要先將對(duì)象轉(zhuǎn)化成AIDL可識(shí)別的參數(shù)(可能是多個(gè)參數(shù)), 然后使用AIDL來傳遞這些參數(shù), 在消息的接收端, 使用
這些參數(shù)組裝成自己需要的對(duì)象.AIDL的IPC的機(jī)制和COM或CORBA類似, 是基于接口的,但它是輕量級(jí)的。它使用代理類在客戶端和實(shí)現(xiàn)層間傳遞值. 如果要使用AIDL,
需要完成2件事情: 1. 引入AIDL的相關(guān)類.; 2. 調(diào)用aidl產(chǎn)生的class.
AIDL的創(chuàng)建方法:
AIDL語(yǔ)法很簡(jiǎn)單,可以用來聲明一個(gè)帶一個(gè)或多個(gè)方法的接口,也可以傳遞參數(shù)和返回值。 由于遠(yuǎn)程調(diào)用的需要, 這些參數(shù)和返回值并不是任何類型.
下面是些AIDL支持的數(shù)據(jù)類型:
1. 不需要import聲明的簡(jiǎn)單Java編程語(yǔ)言類型(int,boolean等)
2. String, CharSequence不需要特殊聲明
3. List, Map和Parcelables類型, 這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡(jiǎn)單數(shù)據(jù)類型, String等其他比支持的類型.
(另外: 我沒嘗試Parcelables, 在Eclipse+ADT下編譯不過, 或許以后會(huì)有所支持
5、dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念
Dvm的進(jìn)程是dalivk虛擬機(jī)進(jìn)程,每個(gè)android程序都運(yùn)行在自己的進(jìn)程里面,每個(gè)android程序系統(tǒng)都會(huì)給他分配一個(gè)單獨(dú)的liunx uid(user id),
每個(gè)dvm都是linux里面的一個(gè)進(jìn)程.所以說這兩個(gè)進(jìn)程是一個(gè)進(jìn)程.