Android工程師面試准備知識點
聽+7哥說,把下面的全弄懂,面試必過,所以我就試著去把所有題目補充了一下,各位能耐的網友們,如果有吐槽或者補充的盡管給我留言,在這裡謝過大家了。
1. android的多線程如何通信
答:Android提供了Handler和Looper來滿足線程間的通信。
Handler是消息的處理者,可以發布或者處理或者操作一個Runnable, handler接受消息後調用handleMessage進行處理。
Looper是Handler與消息隊列之間通訊橋梁,程序組件通過Handler把消息傳遞給Looper,Looper把消息放入隊列。
2. android的多進程通信原理
答:Android實現跨進程通信的方式是采用的是AIDL方式
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 //標准較重要顯示優先級,對於輸入事件同樣適用。