據說,把下面的全弄懂,面試必過,因此試着去把全部題目補充了一下,各位能耐的網友們,若是有吐槽或者補充的儘管留言,在這裏謝過你們了。java
1. android的多線程如何通訊android
答:Android提供了Handler和Looper來知足線程間的通訊。web
Handler是消息的處理者,能夠發佈或者處理或者操做一個Runnable, handler接受消息後調用handleMessage進行處理。面試
Looper是Handler與消息隊列之間通信橋樑,程序組件經過Handler把消息傳遞給Looper,Looper把消息放入隊列。sql
2. android的多進程通訊原理數據庫
答:Android實現跨進程通訊的方式是採用的是AIDL方式apache
AIDL(Android 接口描述語言)是一種接口口描述語言; 編譯器能夠經過aidl 文件生成一段代碼,經過預先定義的接口達到兩個進程內部通訊進程的目的. 若是須要在一個Activity 中, 訪問另外一個Service 中的某個對象, 須要先將對象轉化成AIDL 可識別的參數(多是多個參數), 而後使用AIDL 來傳遞這些參 數, 在消息的接收端, 使用這些參數組裝成本身須要的對象.設計模式
原理:進程之間的通訊信息,首先會被轉換成AIDL協議消息,而後發送給對方,對方收到AIDL協議消息後再轉換成相應的對象。因爲進程之間的通訊信息須要雙向轉換,因此android採用代理類在背後實現了信息的雙向轉換,代理類由android編譯器生成,對開發人員來講是透明的。數組
3. Android五大組件 怎麼使用瀏覽器
答:Activity、Intent、Service、Content Provider,Broadcast Receiver
Activity:字面意思爲「活動」,簡單來講就是一個屏幕,經過調用setContentView()來設置要顯示的界面。
Intent:表示「意圖」,能夠實現Activity與Activity之間的交互,傳遞數據。
Service:表示服務,與Activity同樣默認運行於主線程,可是它沒有可視化界面,是運行在後臺。經過調用startService或bindService方法來啓動來啓動服務。
Content Provider:爲解決應用程序間數據通訊、共享的問題而引入的。
Broadcast Receiver: 廣播接收器,Android的廣播要麼來自系統,要麼來自普通程序。
能夠在AndroidMenifest.xml註冊廣播接收器或在代碼中註冊。
4. service啓動默認是什麼線程
答:默認啓動的是主線程
5. 使用過哪些設計模式進行開發
答:單例模式、工廠模式、觀察者模式
6. 線程池有什麼優勢缺點
答:優勢就是減小建立線程的消耗,每次建立線程都從線程池中拿。
缺點是一直佔用內存。
7. 多種佈局方式的特色,怎麼使用
答:
線性佈局-LinearLayout
orientation-容器內元素的排列方式。
vertical:子元素們垂直排列
horizontal:子元素水平排列
這是用得最多的一種佈局,經過設置orientation來決定子元素是按照什麼方式排列。
絕對佈局-AboluteLayout
layout_x:x座標。以左上角爲頂點。
layout_y:y座標。以作上角爲頂點。
這個佈局被摒棄了,不夠靈活
相對佈局-RelativeLayout
layout_centerInParent – 將當前元素放置到其容器內的水平方向和垂直方向的中央位置(相似的屬性有:layout_centerHorizontal,layout_alignParentLeft等)
layout_marginLeft – 設置當前元素相對於其容器的左側邊緣的距離
layout_below – 放置當前元素到指定的元素的下面
layout_alignRight – 當前元素與指定的元素右對齊
這個佈局也是常常用的,通常想要複雜的佈局,它少不了,由於它能夠很好的定位。
表格佈局-TableLayout
表格佈局主要以行列的方式來管理子控件,其中每一行即一個TableRow對象,每一個TableRow對象能夠添加子控件,而且每假如一個控件即至關於添加了一列。
幀佈局-FrameLayout
也叫層疊佈局。以左上角爲起點,將FrameLayout內的元素一層覆蓋一層地顯示,在幀佈局中,先添加的圖片被後添加的圖片覆蓋。
8.android的數據庫使用是否熟悉
答:SQLite是Android內嵌的一個輕量級數據庫,說實在我用得並很少,不太熟悉。
9.android的xml解析有哪些 有什麼區別
答:在Android平臺上可使用SAX(Simple API for XML)、Document Object Model(DOM)和Android附帶的Pull解析器解析XML文件。
DOM解析:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問
解析過程:
1. 獲取factory
DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();
2. 獲取builder
builder =builderFactory.newDocumentBuilder();
3. 解析爲Document對象
Document document = builder.parse(xmlFile);
4. 獲取根元素
Element root = document.getDocumentElement();
5. 獲取根元素下的子節點
NodeList childNodes =root.getChildNodes();
SAX解析:不像DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問。
1. 獲取factory
SAXParserFactory factory =SAXParserFactory.newInstance();
2. 獲取Parser
SAXParser parser =factory.newSAXParser();
3. 開始解析
parser.parser(xmlFile, newMySAXListener());
PULL解析: 除了可使用 SAX和DOM解析XML文件,你們也可使用Android內置的Pull解析器解析XML文件。 Pull解析器的運行方式與 SAX 解析器類似。它提供了相似的事件,如:開始元素和結束元素事件,使用parser.next()能夠進入下一個元素並觸發相應事件。事件將做爲數值代碼被髮送,所以可使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法能夠獲取下一個Text類型元素的值。
1. 獲取parser
XmlPullParserparser = Xml.newPullParser();
2. 設置輸入
parser.setInput(instream, 「UTF-8」);
3. 獲取事件類型
int eventType = parser.getEventType();
4. 開始解析
10.android的基礎類庫有哪些 例如 List 、Set、 HashSet有什麼區別,如何排除重複的數據
答:
android.app :提供高層的程序模型、提供基本的運行環境
android.content :包含各類的對設備上的數據進行訪問和發佈的類
android.database :經過內容提供者瀏覽和操做數據庫
android.graphics :底層的圖形庫,包含畫布,顏色過濾,點,矩形,能夠將他們直接繪製到屏幕上.
android.location :定位和相關服務的類
android.media :提供一些類管理多種音頻、視頻的媒體接口
android.net :提供幫助網絡訪問的類,超過一般的 java.net.* 接口
android.os :提供了系統服務、消息傳輸、 IPC 機制
android.opengl :提供 OpenGL 的工具
android.provider :提供類訪問 Android 的內容提供者
android.telephony :提供與撥打電話相關的 API 交互
android.view :提供基礎的用戶界面接口框架
android.util :涉及工具性的方法,例如時間日期的操做
android.webkit :默認瀏覽器操做接口
android.widget :包含各類 UI 元素(大部分是可見的)在應用程序的屏幕中使用
List按對象進入的順序保存對象,不作排序或編輯操做。Set對每一個對象只接受一次,並使用本身內部的排序方法(一般,你只關心某個元素是否屬於Set,而不關心它的順序--不然應該使用List)。
具體查看http://blog.csdn.net/wwj_748/article/details/7883988
11.作過什麼東西,介紹一下。
答:我作過一個新聞客戶端,還有一個音樂播放器,實習正在作的是一個語音郵箱客戶端,正在開發當中的一個新浪微博客戶端。
1. 新聞客戶端是我在大學參加軟件開發大賽的一個做品,它是一款手機應用,用來顯示新聞信息,可供用戶查看和評論新聞。
2. 簡、美音樂播放器是我自主研發的一個音樂播放器,本着想作一款簡單、漂亮的音樂播放器給本身用。
3. 語言郵箱是我本身在實習公司參與開發的一款產品,是咱們公司的一款產品。
4. 新浪微博客戶端是個人一個進階項目,想熟悉新浪微博開發平臺API的使用,爲本身開發其餘開放平臺作一個鋪墊,如今還在開發當中。
12.觸屏處理流程
答:事件傳遞順序爲ViewGroup::onInterceptTouchEvent()–>ViewGroup或View的onTouchEvent() –> Activity::onTouchEvent()
1. 當ViewGroup::onInterceptTouchEvent()返回值爲false,事件(按下、移動、擡起等)都傳遞給目標View。若是在ViewGroup觸發,就調用ViewGroup::OnTouchEvent(),若是在View觸發,則調用View::OnTouchEvent();
2. 當ViewGroup::onInterceptTouchEvent()返回值爲true,事件會直接傳遞到ViewGroup::onTouchEvent()處理。也就是說,事件後面的移動、擡起動做不會通過onInterceptTouchEvent(),而是直接傳到onTouchEvent()。
3. 當ViewGroup::OnTouchEvent()/View::OnTouchEvent()返回值爲true,表示按下動做事件被處理,意味着事件的移動、擡起等後續動做將會傳到此方法。若是是View處理的話,則ViewGroup::OnTouchEvent()將不會得到該事件; 若是是ViewGroup處理,則Activity::OnTouchEvent()將不會活動該事件。
4. 當ViewGroup::OnTouchEvent()/View::OnTouchEvent返回值爲false,表示不處理事件,系統將把事件傳遞給其父級處理。
5. Activity::OnTouchEvent()這個是最後被處理的地方,若是不處理,系統將拋棄這個事件。
小結:onInterceptTouchEvent()是用來分發事件,OnTouchEvent()是用來處理事件的,誰不處理就交給上一級處理,層層傳遞。
13.activity流程
答:建立onCreate- 啓動onStart – 開始onResume – 暫停 onPause – 結束onStop – 銷燬onDestroy
在一個Activity正常啓動的過程當中,他們被調用的順序是 onCreate ->onStart -> onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期
詳細介紹一下這幾個方法中系統在作什麼以及咱們應該作什麼:
onCreate: 在這裏建立界面 ,作一些數據 的初始化工做
onStart: 到這一步變成用戶可見不可交互 的
onResume: 變成和用戶可交互 的,(在activity 棧系統經過棧的方式管理這些個
Activity的最上面,運行完彈出棧,則回到上一個Activity)
onPause: 到這一步是可見但不可交互 的,系統會中止動畫 等消耗CPU 的事情
從上文的描述已經知道,應該在這裏保存你的一些數據,由於這個時候
你的程序的優先級下降,有可能被系統收回。在這裏保存的數據,應該在
onResume裏讀出來,注意:這個方法裏作的事情時間要短,由於下一
個activity不會等到這個方法完成才啓動
onstop: 變得不可見 ,被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被調用方法了,多是外面類調用finish方
法或者是系統爲了節省空間將它暫時性的幹掉,能夠用isFinishing()來判
斷它,若是你有一個ProgressDialog在線程中轉動,請在onDestroy裏
把他cancel掉,否則等線程結束的時候,調用Dialog的cancel方法會拋
異常的。
onPause,onStop, onDestroy,三種狀態 下 activity都有可能被系統幹掉
爲了保證程序的正確性,你要在onPause()裏寫上持久層操做的代碼,將用戶編輯的內容都保存到存儲介質上(通常都是數據庫 )。實際工做中由於生命週期的變化而帶來的問題也不少,好比你的應用程序起了新的線程在跑,這時候中斷了,你還要去維護那個線程,是暫停仍是殺掉仍是數據回滾,是吧?由於Activity可能被殺掉,因此線程中使用的變量和一些界面元素就千萬要注意了,通常都是採用Android的消息機制 [Handler ,Message]來處理多線程和界面交互的問題。
14.如何提升程序的優先級,避免系統內存不足的時候被殺掉
答:爲了提升咱們的Activity中的線程的線程優先級(Thread-Priority),咱們能夠在AndroidManifest.xml使用uses-permission標籤。能夠這麼作:
<uses-permissionid="android.permission.RAISED_THREAD_PRIORITY"/>
而後在Activity代碼中設置線程優先級
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);//設置線程優先爲後臺,這樣當多個線程併發後不少可有可無的線程分配的CPU時間將會減小,有利於主線程的處理,相關的Thread優先級定義羅列有如下幾種:
int THREAD_PRIORITY_AUDIO //標準音樂播放使用的線程優先級
int THREAD_PRIORITY_BACKGROUND //標準後臺程序
int THREAD_PRIORITY_DEFAULT // 默認應用的優先級
int THREAD_PRIORITY_DISPLAY //標準顯示系統優先級,主要是改善UI的刷新
int THREAD_PRIORITY_FOREGROUND //標準前臺線程優先級
int THREAD_PRIORITY_LESS_FAVORABLE //低於favorable
int THREAD_PRIORITY_LOWEST //有效的線程最低的優先級
int THREAD_PRIORITY_MORE_FAVORABLE //高於favorable
int THREAD_PRIORITY_URGENT_AUDIO //標準較重要音頻播放優先級
int THREAD_PRIORITY_URGENT_DISPLAY //標準較重要顯示優先級,對於輸入事件一樣適用。