Android面試題推薦
1、trycatchfinely。沒有異常finally走不走。在return之前還是之後;
該題目考察的是try…catch…finally異常捕捉知識。
答:finally塊的語句在try或catch中的return語句執行之後返回之前執行且finally里的修改語句可能影響也可能不影響try或catch中 return已經確定的返回值,若走的try中的return,並且賦值是傳值形式就不會影響結果,傳址就會影響。若走到catch異常中,且catch無return,則使用finally中的return。若finally里也有return語句則覆蓋try或catch中的return語句直接返回。
(1)、
上面的例子可以看出,finally是在return語義返回之前執行,如果finally中有return,則會覆蓋try或catch中的return語句直接返回。
2、== eques 的區別,他們比較什麼?
答:從定義上來看==是運算符,equals是Object類提供的方法。二者區別:
==是判斷兩個變數或實例是不是指向同一個內存空間 ,equals是判斷兩個變數或實例所指向的內存空間的值是不是相同
==是指對內存地址進行比較,equals()是對字元串的內容進行比較
==指引用是否相同 ,equals()指的是值是否相同
通過String來做測試:
使用int做測試:
3、AAR是什麼?
答:JAR 文件格式以流行的 ZIP 文件格式為基礎。與 ZIP 文件不同的是,JAR 文件不僅用於壓縮和發布,而且還用於部署和封裝庫、組件和插件程序,並可被像編譯器和 JVM 這樣的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用來指示工具如何處理特定的 JAR。JAR(Java Archive,Java 歸檔文件)是與平台無關的文件格式,它允許將許多文件組合成一個壓縮文件。
使用:*.jar文件拷貝到libs目錄,eclipse直接導入即可
AAR(Android Archive)包是一個Android庫項目的二進位歸檔文件。.aar文件中包含所有資源,class以及res資源文件。 使用:.aar文件使用有兩種方式,一種是使用在線的(網上的),一種是添加本地的.aar文件。網路載入,只要你知道*.aar文件在maven中的路徑即可。
如果你只是一個簡單的類庫那麼使用生成的.jar文件即可;如果你的是一個UI庫,包含一些自己寫的控制項布局文件以及字體等資源文件那麼就只能使用.aar文件。
4、mulitdex是什麼?
答:早期的Dex文件保存所有classes的方法個數的範圍在0~65535之間,所以當項目非常大的時候,就會出現這個問題。所以Android為了解決這個問題提出了mulitdex方案,思路就是:1.先把你的app 的class 拆分成主次兩個dex。2.你的程序運行起來後,自己把第二個dex給load進來。看就這麼簡單!而且這就是個動態載入模塊的框架! 然而總悟君早已看穿Dalvik VM 這種動態載入dex 的能力歸根結底還是因為java 的classloader類載入機制。
使用:在build文件中設置multiDexEnabled true。
5、Android的分包?
答:Android中的分包是為了解決65535問題。可以通過在Module中導入:
自定義MyApplication繼承自MultiDexApplication,然後再清單文件中使用MyApplication就可以了
如果你的MyApplication繼承與別的Application了,你也可以直接重寫一個方法
6、Android的65535 64k
答:如果App引用的庫太多,方法數超過65536後無法編譯。這是因為單個dex裡面不能有超過65536個方法。為什麼有最大的限制呢,因為Android會把每一個類的方法id檢索起來,存在一個鏈表結構裡面。但是這個鏈表的長度是用一個short類型來保存的,short佔兩個位元組(保存-2的15次方到2的15次方-1,即-32768~32767),最大保存的數量就是65536。新版本的Android系統中修復了這個問題,但是我們仍然需要對低版本的Android系統做兼容.
7、Android多進程怎麼實現
答:通過在Mainifest文件中配置android:process=":name"屬性來進行設置多進程。在android中,跨進程通信常用AIDL方式進行實現,aidl是 Android Interface definition language的縮寫。
當我們定義一個AIDL文件時,系統會自動生成一個Binder的子類Stub根,用於我們創建自己的Binder。
8、AppCompat包是用來幹嘛用的
答:AppCompat:為API 7及以上的設備提供了一個一致的Action Bar。 在版本21的修訂中,它承擔了新的職責:帶來了material color palette、控制項著色、Toolbar支持,還有更多支持所有API 7+的設備。單從ActionBarActivity名字上看是體現不出它全部功能的。
9、drawable文件夾和mipmap文件夾的區別
答:mipmap僅僅用於應用啟動圖標,可以根據不同解析度進行優化。其他的圖標資源,還是要放到drawable文件夾中。
10、java問了StringBuidler和StringBuffer的區別
答:StringBuilder和StringBuffer都可用於字元串的連接構建,二者使用的都是建造者模式來實現。從線程安全性角度來看StringBuilder是線程非安全的,StringBuffer是線程安全的,並且是通過synchronized關鍵字實現。現在的jdk中推薦使用StringBuidler。
11、get post的異同
答:我們知道在網路中,網路的請求是分層的,從上層的應用層、表示層、會話層、傳輸層、網路層、數據鏈路層、物理層。
應用層當用戶使用瀏覽器來打開網頁時,需要利用DNS提供的域名解析服務,來獲取網址對應的IP地址,然後再通過另外一個協議HTTP來下載頁面內容。在這個過程中出現的兩個協議(DNS和HTTP)都是工作在應用層上的協議。中常見的協議:
FTP:文件傳輸協議,用來在客戶機和FTP伺服器之間傳輸文件。
DHCP:動態主機配置協議,DHCP伺服器為客戶機動態分配IP地址。
POP3:郵件接收協議,用於從POP3伺服器接收郵件。
SMTP:郵件發送協議,用戶通過SMTP伺服器發送郵件。
表現層用於數據的表示,主要功能是轉換、壓縮和加密。示層的加密協議最常用的是SSL(Secure Sockets Layer)
會話層還負責管理和確定傳輸模式。計算機可以由三種模式來傳輸數據:單向(Simplex)、半雙工(Half-Duplex)、全雙工(Full-Duplex)。
傳輸層提供數據傳輸的服務。這裡的「傳輸」指的是端對端(End-to-End)或者主機對主機(Host-to-Host)的傳輸。
傳輸層上最重要的兩個協議是TCP(Transmission Control Protocol,傳輸控制協議)和UDP(User Datagram Protocol,用戶數據報協議)。TCP是面向連接的協議(Connection-Oriented),UDP是無連接的協議(Connection-Less)。
網路層關心的主要是如何把數據從一個設備發送到另一個設備。網路層需要提供三個最基本的功能:地址、路由、分段和重組。網路層上最重要的協議IP(Internet Protocol)。
網路層關心的是如何把數據從一個設備發送到另外一個設備,這另外一個設備有可能在本地網路中或者在一個很遠的網路中。數據鏈路層關心的是如何把數據發送到本地網路中去。我們平時常說的LAN(Local Area Network,區域網)技術,如乙太網(Ethernet)、令牌環網(Token Ring)、光纖分布數據介面(FDDI)和802.11(WiFi)都定義在這一層。
數據鏈路層又分為兩個子層:邏輯鏈路控制層(Logical Link Control)和介質訪問控制層(Media Access Control)。
物理層位於OSI的底層,所有其他層的數據最終都必須經由物理層才能發送出去。物理層的功能包括:
硬體規範的定義,如電纜、連接器、無線接收器等的工作方式,網卡、集線器(Hub)等網路設備也工作在物理層。
編碼和信號,物理層把計算機中的二進位0和1轉換成可以在物理介質上傳輸的信號。
在把數據轉換成信號後(如對於雙絞線電纜則是電子脈衝信號),物理層負責信號的實際發送和接收。
上面補充了網路七層協議,那麼GET和Post有什麼區別呢?首先它們都屬於應用層協議。
GET特點:
GET請求能夠被緩存
GET請求會保存在瀏覽器的瀏覽記錄中
以GET請求的URL能夠保存為瀏覽器書籤
GET請求有長度限制,一般是由於瀏覽器限制
GET請求主要用以獲取數據
POST特點:
POST請求不能被緩存下來
POST請求不會保存在瀏覽器瀏覽記錄中
以POST請求的URL無法保存為瀏覽器書籤
POST請求沒有長度限制
12、命令行如何編譯項目
答:這裡主要使用android sdk中提供的編譯工具:
aapt.exe:資源打包工具
android.jar:Android編譯工具
dx.bat :dex文件生成工具
sdklib.jar :生成apk
jarsigner:簽名工具
13、anr 全拼 anr log抓取
答:ANR的全拼是Application Not Response。一般出現ANR的原因是由於:
主線程 (「事件處理線程」 / 「UI線程」) 在5秒內沒有響應輸入事件
BroadcastReceiver 沒有在10秒內完成返回
通常ANR的日誌保存在trace.txt文件中,保存在/data/anr/目錄下。導出即可。同時,我們也可以自定義Thread.UncaughtExceptionHandler來抓取崩潰異常日誌。
14、webView js怎麼調用java, java怎麼調用js
答:Java調用js通過webview的loadUrl方法進行調用,可以載入js腳本或url地址。
js調用java。
15、逆向分析apk使用過哪些工具
答,常見的有:
apktool:
smali2java
dex2jar
jd-gui
16、activity,service Broadcast 多長時間會報anr,Android的多進程的activity堆棧。Application中的onCreate執行幾次
答:在主線程中:
Activity----->5秒
Broadcast----->10秒
Service----->20秒
多進程中,Application的onCreate方法會執行兩次,這個就是由於Android多進程android:process這個屬性中帶來的問題,Android聲明文件中的android:process屬性卻可以為任意組件包括應用指定進程,換句話說,通過在聲明文件中設置android:process屬性,我們可以讓組件(例如Activity, Service等)和應用(Application)創建並運行於我們指定的進程中。 解決的辦法就是「根據進程名單獨判斷。」
17、switch內部可否使用string做判斷條件
答:我們知道Java中支持int、byte、short。不支持long、double。但是在JDK1.5的時候支持了Enum,並在JDK1.7的時候支持了String。進行switch的實際是hash值,然後用equals進行安全檢查(因為hash值可能會發生碰撞),所以性能不如枚舉。switch支持String其實是一個語法糖,在編譯後的位元組碼文件中都會被還原成原生類型,並在相應位置插入了強制轉換代碼,底層的JVM在switch上並沒有修改。
18、四大組件XML中process加:和不加:的區別
答:android:process屬性是用於Android中的多進程設置,當android:process屬性值以」:」開頭,則代表該進程是私有的,只有該app可以使用,其他應用無法訪問;
當android:process屬性值不以」:「開頭,則代表的是全局型進程,但這種情況需要注意的是進程名必須至少包含「.」字元。
19、手寫一個get請求
答:http://www.tngou.net/api/cook/list?rows=10&page=
20、從setting中清除APP緩存數據,資料庫的數據會被刪除么,表還在不在,db文件還在不在。
答:這裡需要明確是清楚緩存數據還是清除數據,我們知道,在手機的應用管理頁面點進去可以看到一個應用的詳情,裡面提供了清除緩存和清除數據兩個選項。
清除數據主要是清除用戶配置,比如SharedPreferences、資料庫等等,這些數據都是在程序運行過程中保存的用戶配置信息,清除數據後,下次進入程序就和第一次進入程序時一樣
緩存是程序運行時的臨時存儲空間,它可以存放從網路下載的臨時圖片,從用戶的角度出發清除緩存對用戶並沒有太大的影響,但是清除緩存後用戶再次使用該APP時,由於本地緩存已經被清理,所有的數據需要重新從網路上獲取。為了在清除緩存的時候能夠正常清除與應用相關的緩存,請將緩存文件存放在getCacheDir()或者 getExternalCacheDir()路徑下。
一般我們開發中產生的數據有:
file-普通的文件存儲
database-資料庫文件(.db文件)
sharedPreference-配置數據(.xml文件)
cache-圖片緩存文件,
清除緩存不會清楚資料庫。
21、想在所有activity的onresume中列印log有幾種做法
答:可以通過在BaseActivity中列印。
22、手機的Mac地址獲取方式以及可能出現的問題
23、手寫SQL查詢語句
答:select name from student
**24、數組[1,0,3,5,6,0,4,0,9] 將所有的0 排到最後的實現方式 **
答:考察排序。
冒泡排序:大的往前跑。
選擇排序:選擇大的往前排:
插入排序:大的往前插入
25、Android的四大組件
答:Android四大組件分別是:activity、service、content provider、broadcast receiver。
26、Android的數據存儲
答:Android中的數據存儲主要有以下幾種:
使用SharedPreferences存儲數據
文件存儲數據
SQLite資料庫存儲數據
使用ContentProvider存儲數據
網路存儲數據
27、Activity的啟動模式有哪些
答:Activity的啟動模式有四種,可以通過android:launchMode或addFlags來設定。
1. standard
28、MVC設計模式
答:MVC模式(Model-View-Controller)是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。包括後面演變的MVP、MVVM。
29、Uri類
答:URI位置在java.net.URI,顯然是Java提供的一個類。而Uri位置在android.net.Uri,是由Android提供的一個類。Uri是Android開發的,擴展了JAVA中URI的一些功能來特定的適用於Android開發,所以大家在開發時,只使用Android 提供的Uri即可.
30、ListView 優化
答:ListView的工作原理如下:
ViewHolder Tag 必不可少,這個不多說!
如果自定義Item中有涉及到圖片等等的,一定要狠狠的處理圖片,圖片占的內存是ListView項中最噁心的,處理圖片的方法大致有以下幾種:
2.1:不要直接拿個路徑就去循環decodeFile();這是找死….用Option保存圖片大小、不要載入圖片到內存去;
2.2: 拿到的圖片一定要經過邊界壓縮
2.3:在ListView中取圖片時也不要直接拿個路徑去取圖片,而是以WeakReference(使用WeakReference代替強引用。比如可以使 用WeakReference
mContextRef)、SoftReference、WeakHashMap等的來存儲圖片信息,是圖片信息不是圖片哦!
2.4:在getView中做圖片轉換時,產生的中間變數一定及時釋放,用以下形式:
盡量避免在BaseAdapter中使用static 來定義全局靜態變數,我以為這個沒影響 ,這個影響很大,static是Java中的一個關鍵字,當用它來修飾成員變數時,那麼該變數就屬於該類,而不是該類的實例。所以用static修飾的變數,它的生命周期是很長的,如果用它來引用一些資源耗費過多的實例(比如Context的情況最多),這時就要盡量避免使用了..
如果為了滿足需求下必須使用Context的話:Context盡量使用Application Context,因為Application的Context的生命周期比較長,引用它不會出現內存泄露的問題
盡量避免在ListView適配器中使用線程,因為線程產生內存泄露的主要原因在於線程生命周期的不可控制
31、ViewGroup和View
答:ViewGroup繼承自View,是一種特殊的View,它可以裝其他的Views(或其他的ViewGroup)。ViewGroup是布局(layouts)和views containers的父類。它的直接子類有: FrameLayout, GridLayout, LinearLayout等等。Example: LineraLayout
View類代表的是UI components的基本的構建塊。a view 佔據屏幕的一塊方形區域,負責繪製和事件處理。View是用來創建交互性的UI組件(如:按鈕,文本框等等)的 widgets的父類。Example:Button
一個不甘平凡的碼農
※你覺得你減肥失敗最大的原因是什麼?
※春天穿什麼?拒絕千篇一律,這麼穿牛仔外套讓你與眾不同!
TAG:全球大搜羅 |