編輯:關於Android編程
Android中最常問到的面試題
小武:
方法重載與覆蓋的區別?( Overload與Override的區別)答:方法的重載屬於編譯時多態,方法名相同參數列表不同,返回值必須相同或都沒有返回值類型。方法的覆蓋屬於運行時多態,子類覆蓋父類的方法,子類指向父類引用,在調用方法的時候用父類的引用調用。
String和StringBuffer的區別答:STRING的長度是不可變的,STRINGBUFFER的長度是可變的。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法。
字符串“abcde”通過寫一個函數不讓調用第三方的字符串,實現一個字符串倒序,比如字符串“abcde” 變成“edcba”答:String src = "ABCDEF ";
String dst = new StringBuffer(src).reverse().toString();
注:String常用方法:http://blog.csdn.net/lishiyuzuji/article/details/8135554
抽象類與接口的區別(abstract與interface的區別)答:abstract可以修飾抽象方法,而一個類只要有一個抽象方法,就必須用abstract定義該類,即抽象類。
用interface修飾的類,裡面的方法都是抽象方法,因此在定義接口的時候,可以直接不加那些修飾,系統會默認的添上去。接口裡面的字段都是公有常量,即public static final修飾的字段。
集合的實現類與區別?答:Collection接口,集合結構總的父接口,有兩個子接口list和set
List接口 元素有序可重復.
實現類有:ArrayList數組實現輕量級,運行快,線程不安全。JDK1.2查詢快
Vector數組實現重量級,運行慢,線程安全。JDK1.0
LinkedList鏈表實現 常用堆棧與隊列的實現 增刪操作快
Set接口 元素無序不可重復
實現類有:HashSet,底層用hashCode()算法實現,保證元素的無序唯一,自定義對象存進HashSet為了保證元素內容不重復需要覆蓋hashCode()與equals()方法。
SortedSet(不重要)元素有序(Unicode升序)唯一
TreeSet要求元素有序,自定義的對象需要實現Comparable接口的compareTo(object o)方法
Map(接口):與Collection接口無關,有一個子接口SortedMap特點:元素是key-value, key
唯一,無序; value可重復
實現類: HashMap輕量級 線程不安全的,允許key或value為null JDK1.2
HashTable重量級 線程安全的 不允許key或value為null JDK1.0
Properties是HashTable的子類,主鍵和值都是字符串
SortedMap:(不重要)
特點: key唯一,有序(Unicode升序)
實現類:TreeMap
線程有幾種狀態,分別是哪些?(調用run()和調用start()的區別)答:1)、新建狀態(New):新創建了一個線程對象。
2)、就緒狀態(Runnable):線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於可運行線程池中,變得可運行,等待獲取CPU的使用權。
3)、運行狀態(Running):就緒狀態的線程獲取了CPU執行run()方法,。
4)、阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:
(一)、等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。
(二)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。
(三)、其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
5)、死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。
當調用start方法的時候,該線程就進入就緒狀態。等待CPU進行調度執行,此時還沒有真正執行線程。
當調用run方法的時候,是已經被CPU進行調度,執行線程的主要任務。
線程的實現方式答:線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口
sleep()與wait()的區別答:1.這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object
類。
2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可
以使用同步控制塊或者方法。sleep不出讓系統資源;wait是進入線程等待池
等待,出讓系統資源,其他線程可以占用CPU。一般wait不會加時間限制,
因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用
notify/notifyAll喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系
統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到
只能調用interrupt()強行打斷。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而
sleep可以在任何地方使用
4. Sleep需要捕獲異常,而wait不需要
Final、finally、finanlize()的區別答:final?用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不
可繼承。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
android系統架構?答:1)應用程序層java語言 應用程序開發
應用程序框架層java語言OS定制framework層開發系統運行庫層C C++實現so庫Linux內核層Activity生命周期?保存activity的一些信息在哪個生命周期方法中?答:共有七個周期函數:
void onCreate(Bundle savedInstanceState)第一次創建時調用
void onStart()被用戶可見時調用
void onRestart()當Activity處於stop狀態又被重新啟動時調用
void onResume()當獲得焦點即可與用戶交互時調用
void onPause()當失去焦點時調用
void onStop()當不可見時調用
void onDestroy()當銷毀時調用
Android的四大組件是什麼?它們的作用是什麼?答:Android有四大組件:Activity、Service、Broadcast Receiver、Content Provider。
Activity :應用程序中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應。Activity之間通過Intent進行通信。
Service 服務:一個Service 是一段長生命周期的,沒有用戶界面的程序,可以用來開發如監控類程序。
BroadcastReceive廣播接收器:你的應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice 來響應它們收到的信息。
Content Provider內容提供者 :主要用於多個應用間數據共享。這些數據可以存儲在文件系統中或SQLite數據庫。
Android中的五種存儲方式及其應用場景答:1)SharedPreferences
存儲路徑:(data/data/packagename/shares_prefs), 輕量級存儲,以鍵值對的形式存儲在xml中,一般用來保存應用中的設置屬性
2)文件存儲 SD卡存儲多媒體文件, 文件緩存
3) Sqlite數據庫 存儲路徑:(data/data/packagename/databases), 一種嵌入式數據庫,支持sql語言,存儲大量結構性數據
4)ContentProvider 進程(應用程序)間數據共享,數據源可以是sqlite,也可以是xml,相關類: ContentResolver(內容解析器), ContentObserver(數據 觀察者)
5) 網絡存儲 天氣數據的xml,json格式等等,通過HttpUrlConnection,HttpClient,或者SOAP協議獲取數據
什麼是ANR如何避免它?(Android線程間的通信方式?)
答:ANR:Application Not Responding(應用程序無響應).當出現下列情況時,Android就會顯示ANR對話框了:對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒意向接受器(intentReceiver)超過10秒鐘仍未執行完畢Android應用程序完全運行在一個獨立的線程中(例如main)。這就意味著,任何在主線程中運行的,需要消耗大量時間的操作都會引發ANR。
解決方案有兩種:
1.AsyncTask異步任務中,doInBackground()和onPostExecute(Result)兩個方法非常重要
doInBackground() 這個方法運行在後台線程中,主要負責執行那些很耗時的操作,如移動護理系統中的網絡連接、解析XML等操作。該方法必須重載。
onPostExecute(Result) 這個方法也運行於UI線程,在doInBackground(Params…)方法執行後調用,該方法用於處理後台任務執行後返回的結果。
2. 子thread + handler
Handler的運行機制(運行原理)(Handler,Looper,MessageQueue,Message之間的關系)
一個Handler允許你發送和處理Message和Runable對象,每個線程都有自己的Looper,每個Looper中封裝著MessageQueue。Looper負責不斷的從自己的消息隊列裡取出隊頭的任務或消息執行。每個handler也和線程關聯,Handler負責把Message和Runable對象傳遞給MessageQueue(用到post,sendMessage等方法),而且在這些對象離開MessageQueue時,Handler負責執行他們(用到handleMessage方法)。
其中Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域。
自定義組件的實現思路
答: Android自定義組件有三種實現思路:
1)繼承某個現有組件,在其基礎上添加額外功能,如繼承Gallery實現CoverFlow效果
2) 復合型組件定義:繼承某個Layout,實現復合組件自定義,如TextView和EditText組合實現登錄注冊組件
3)繼承View,實現onDraw()方法,實現自己繪制組件,如翻頁效果組件
Activity四種啟動模式
在AndroidManifest.xml清單文件中的標簽中通過android:launchMode設置Activity啟動模式
standard 默認值, 表示在startActivity時即創建其實例
singleTop 首先檢查棧頂是否有該Activity實例,有責返回,無責創建其實例
singleTask 檢查整個堆棧有無該Activity實例,有責返回,無責創建其實例
singleInstance 單實例模式, 一個Activity實例獨享一個任務堆棧, 並且只能有一個堆棧中有該Activity的實例
Android中asset文件夾和raw文件夾區別?答:res/raw和assets的相同點:
兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。
res/raw和assets的不同點:
1)res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即 R.raw.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
2)res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾
3)讀取文件資源舉例:
讀取res/raw下的文件資源,通過以下方式獲取輸入流來進行寫操作
InputStream is = getResources().openRawResource(R.raw.filename);
讀取assets下的文件資源,通過以下方式獲取輸入流來進行寫操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");
Android程序入口如何判斷?action節點中的android.intent.action.MAIN表明它所在的Activity是整個應用程序的入口點
1.什麼是WebView?
WebView是一個使用WebKit引擎的浏覽器組件,用來加載網頁。
2. WebView中加載網頁的兩種方式?
loadUrl(url)通過url地址加載互聯網或本地網頁
如:loadUrl("http://www.baidu.com");
loadUrl("file:///android_asset/html/index.html");
loadData(data,type,encoding)直接加載網頁內容,容易亂碼,一般用loadDataWithBaseURL代替
3. WebView的三個輔助類是什麼?
WebSettings、WebViewClient、WebChromeClient
4. WebSettings的作用是什麼?
設置WebView的一些屬性、狀態等,例如允許使用javascript,允許使用緩存,允許使用內置的縮放組件
setJavaScriptEnabled(true);設置支持js
5. WebViewClient的作用是什麼?
主要幫助WebView處理各種通知、請求事件(例如,點擊鏈接時候如何顯示界面,頁面開始加載,加載完畢之後有何動作等)
shouldOverrideUrlLoading() onPageStarted() onPageFinished()
6. WebChromeClient的作用是什麼?
輔助WebView處理Javascript的對話框、網站圖標、網站Title、加載進度等
核心方法有onJsAlert() onJsConfirm() onJsPrompt() onProgressChanged() onReceivedIcon()
onReceivedTitle()
7. WebViewClient中shouldOverrideUrlLoading方法作用
shouldOverrideUrlLoading方法控制超連接是否在當前WebView中打開。
8. android中如何調用js中的方法?
loadUrl("javascript:test()");
9.頁面js中調用android客戶端的方法實現步驟?
1,添加javascript支持(webSettings.setJavaScriptEnabled(true);)
2,暴露一個java對象給js,使得js可以直接調用該實例中的公有方法,
(webview.addJavascriptInterface(object,"name");)
3,加載頁面(webview.loadUrl(url);}
4,頁面可以通過別名使用(window.name.方法名)
11. TCP與UDP的區別。
TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務,傳輸數據前經過“三次握手”建立連接,保證數據傳輸的可靠性,但效率比較低。一般用於對於數據傳輸安全性較高的場合。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議,面向無連接。UDP不提供可靠性,數據傳輸可能發生錯序,丟包,但效率較高。一般用於對於實時性要求較高的場合。
GPS定位與網絡定位有何區別?
GPS定位需設置權限android.permission.ACCESS_LOCATION_FINE
網絡定位需設置權限android.permission.ACCESS_LOCATION_COARSE
即GPS定位比網絡定位在精確度方面更精准,但在速度方面稍差一些,而且GPS定位適合在室外環境下使用,網絡定位在室內,室外都可以。
解釋一下正向地理編碼和反向地理編碼(地址解析和逆地址解析)
正向地理編碼是指將通過地址檢索地理坐標點,即經緯度
反向地理編碼是指通過坐標點檢索詳細地址
轉帖請注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),請尊重他人的
在實現ListView單選時,我們可以在Adapter中自己創建一個selectPosition參數,這樣是能實現需求。但加入要是再加一個多選接著又在Adapter中創建
簡介本篇是接上一篇seekbar的自定義view進階版。本自定義view主要功能:可自定義起始時間以及最大時間,設置總格數,每格均分時間差。 可自定義界面顏色字體大小,文
1.FrameLayout 幀布局,效果為多個圖層依次疊加,比如說畫一幅畫,在FrameLayout中先添加背景imageView,再添加其他的事物imageView即可
1.TextView Textview在之前的學習中用到過好多