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