最新Android面試題整理 5月

lostinai發表於2014-04-17

http://blog.csdn.net/moubenmao_jun/article/details/9750263

面試的幾個回答技巧

2013-5-9號補充:今天最新的騰訊面試題,應該說是所有面試中最難的,我個人感覺。而且是個女面試官,好嗨皮啊,哈哈。

騰訊面試題
1.int a = 1;
int result = a+++3<<2;
2.int a = 2;
int result = (a++ > 2)?(++a):(a+=3);
3.int a = 1234567;
int b = 0x06;
int result = a&b;
4.Integer a = 34556;
Integer b = 34556;
boolean result = a==b;
5.String func(string s ){
return s.length() > 0 ? func(s.subString(1))+ s.charAt(0):"";
}
String result = func("Tencent");
6.byte result = (byte) oxffeffefe;
7.int result = [(oxfe2baf&oxf)|oxff] >> 2/(4<<1);
8.判斷兩個String的交集
比如 A = "Marginle",B = Valaienie", 交集為aie,寫個演算法。
9.什麼是狀態機?專案中什麼時候用到狀態機,舉例說明。
10.寫出兩種單例模式

Android基礎
1.Activity和BroadCast Receiver的生命週期
2.寫出幾種service和Activity的互動方式
3.UI執行緒和非UI執行緒的互動方式,寫出幾種各自的耗時。
4.requestLayout, invalidate和postInvalidate的異同
5.寫出三種常用layout佈局並進行解釋
6.http怎麼加入超時和代理
7.view的繪製過程,講講draw/onDraw和drawChild這個可以口述。
8.以下是Android sdk的英文文件請細讀。
9.100盞燈,全部關閉,第一人全部開啟(亮),第二個人隔一個按開關,第三個人隔2個按開關,以此類推,第100人路過時有幾盞燈亮著?(寫出結果就行)

Java基礎
1.說出sleet,wait,notify的區別

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

百度面試題
2013-5-2號補充:
1.View和ViewGroup的關係


2.如何定位和解決Andorid的記憶體溢位問題


3.一個有N個元素的一維陣列(A[0],A[1], ..., A[n-1]),設計一個演算法求解該陣列最大子陣列。(要求時間複雜度是O(n))


4.用Java程式碼實現判斷一個字串中是否包含另一個字串,不要用jdk中String的indexOf方法。


5.用Java實現一個Singleton.


6.簡述Observer設計模式,並畫出Observer模式的典型結構類圖


7.& 和&&的區別


8.什麼是dpi,ps,sp?適配是如何做的,為什麼?


9.用最有效率的方法算出2乘以8等於幾?


10.靜態成員類、非靜態成員類有什麼區別?什麼是匿名內部類?


11.Handler機制的原理,內部是如何實現的,訊息佇列的實現機制?


12.什麼是ANR,如何定位和避免?


13.APK之間互相傳遞資料


14.簡述Android的啟動過程


15.如何載入ndk庫?如何在jni中註冊native函式,有幾種註冊方法?


16.如何收集軟體崩潰資訊?


17.簡述軟體編譯流程和釋出流程


18.是否編譯過android原始碼和linux核心原始碼


19.寫一個歸併排序陣列


20.自定義控制元件相關


21.快取實現


22.執行緒同步(生產者 消費者)


23.符號匹配(棧)


24.還問了下拉重新整理和分頁載入的實現機制


-------------------------------------------------------

盤古搜尋面試總結


演算法題
2.求一個陣列的最大連續子序列和,比如:-10,3,5,2,-3,6,7
最笨的方法就是窮舉法,用三層for迴圈


3.求一個陣列中出現次數最多且值最大的數


android的基礎題
1.service的生命週期


2.Intent用途,瞭解多少?IntentService知道麼?


3.自定義控制元件


4.xmpp協議的理解


5.廣播建立方式有幾種?有什麼區別?


6.多執行緒有幾種實現方式?
繼承Thread,  實現Runnable介面, AsynTask


------------------------------------------------------------


一、listview如何優化(這個很重要,多次被問到)
1.分頁載入
2.convertView快取
3.viewHolder
4.scrollListener,記住滑動的狀態


二、常用排序演算法,各種演算法的複雜度,用Java實現一種排序演算法。




四、單連結串列的反轉、合併、排序


五、二分查詢法

六、Intent Flag常用的記住幾個




七、AIDL怎麼用?全稱是什麼?


八、taskAffinity 親和性
這個一般人應該都不熟悉,瞭解一下,面試中可能被問到,機率不大。


--------------------------------------------------------------


百度各種面試總結


1.Listview item快取如何實現
convertView


2.很多view如何快取


3.圖片上傳


4.圖片過大如何處理?壓縮後圖片有多大?
解析度壓縮、質量壓縮




5.OOM怎麼辦?




6.圖片的快取機制,如何做到高效和穩定?




7.自定義view怎麼做能提高效率? 自定義view如何做圖片快取?自定義view如何判斷單擊和雙擊?自定義view 的 onDraw方法主要做什麼?


避免重複呼叫measure 和 layout


8.是否看過view的原始碼


9.動畫的機制及其底層實現?


10.二叉樹、連結串列


11.平時看什麼書?去哪些論壇看?


12.問專案底層實現


13.Linux檔案系統實現,如何實現檔案的隱藏?
---------------------------------------------------------------------------------------------------------

面試演算法題總結


1.有一個整數陣列,有負數和整數,用一個方法把正負數分開,要求空間複雜度是O(1),時間複雜度是:O(N)(百度移動平臺部)




2.有一個數列,奇數個,其中有3個是單個的, 其它都是成對的,怎麼找出其中任意一個單個的數(小米一面)




3.在一個陣列中,找出出現次數最多且數值最大的一個數並輸出




4.用最快的方式將兩個陣列合併到一個陣列中?時間複雜度


============================================================================================

2013-4-10補充:
問題:怎樣的類可以作為HashMap的鍵?
答:這個問題是搜狗2012年的筆試題,我開始還真是沒想太明白。剛才看到HashMap的時候才發現原來是這麼回事。
當需要往ArrayList,HashMap中放東西時,像int,double這種內建型別是放不進去的,因為容器都是裝object的,這就需要這些內建型別的外覆類了。比如:int對應的Integer,double對應的Double。
同樣是搜狗的筆試題:適合頻繁插入和查詢的資料結構
答:頻繁插入,連結串列效率高,頻繁查詢陣列效率高,那麼綜合一下,我個人覺得是雜湊表,或者說HashMap等使用hash演算法的資料結構。

1、對於簡歷上所寫的每個問題,面試官感興趣的會對我提問,並分析裡邊遇到的問題以及得到的經驗。面試過程描述以前做過的專案。專案中你認為的難點是什麼。
2、對於網路互動這塊兒需要注意什麼問題
3、android是一個什麼樣的系統。Jni呼叫機制是什麼。用uml畫一個在你的專案中使用的設計模式。


面試中常問的非技術類問題:
1.簡單介紹一下你自己。
2.對自己做個評價,優點、缺點。
3.自己做過的專案,詳細介紹一下。
4.實習經歷,在實習過程中遇到哪些問題,如何解決的?
5.你對公司有什麼問題要問嗎(對公司有什麼要了解的)?
技術類的問題主要就看對技術的掌握程度和自己的綜合能力了。
百度移動終端研發工程師筆試題,題量不大,2個小時,有點難度。
1.寫一個字串逆序的程式,時間複雜度和空間複雜度最低,效率越高越好。
2.實質:二叉樹的層序遍歷,每層的結點用單連結串列輸出。
3.1-N(N最大32000,且未知),記憶體只有4K,找出其中的重複數
4.程式設計題,比較複雜,是個系統設計題,與《程式設計之美》中3.2,電話號碼對應英語單詞類似。
百度軟體開發工程師一面問題:
1.有101個數,為[1,100]之間的數,其中一個數是重複的,如何尋找這個重複的數,其時間複雜度和空間複雜度是多少?
2.Java中抽象類與介面的區別。
3.程式與執行緒之間的聯絡與區別。(多家公司都在問,好好研究一下)
4.談談對設計模式的認識與理解,簡單介紹一下你所知道的設計模式。(多家公司都問,Android方向面試必考的)
5.執行緒、多執行緒相關(必問)
6.Linux常用的命令,shell程式設計,grep命令的使用。
7.海量資料查詢或者排序,有資源限制要求。(常考的)
建議:簡歷中對自己的專業技能要實事求是的寫,突出自己的重點,不宜託大,面試官面試時提問的依據就是簡歷上的內容。百度的工作環境很好,做技術的員工給人的感覺就是雖然人家的技術水平很高,但是都比較謙遜。百度確實是一個不錯的網際網路公司。
Sina無線客戶端開發工程師面試
筆試的題目和7月22日實習生的題目差不多。面試主要問了:
1.二叉樹的一些基礎知識。
2.Java多執行緒,對stop()方法的認識,如何安全的終止一個執行緒。
3.設計模式相關的問題
4.談談你對物件導向程式設計中繼承的認識
5.排序演算法
網易2012校招無線客戶端開發筆試,題目不太難,比較基礎。
1.物件導向程式設計中多型的概念,用虛擬碼展示出來。
2.斐波那契數列程式設計,效率越高越好(詳見《程式設計之美》2.9)
3.60W長度為32的字串一次性讀入記憶體中,大約佔用多少記憶體空間?
4.一個X向量n,如何求其內部的最大距離。
5.在瀏覽器中輸入http://www.163.com,從輸入到頁面在瀏覽器中顯示出來,期間發生了哪些過程,越詳細越好。
6.簡單介紹一下Android系統中的Activity,Service, Intent, ContentProvider元件。
7.程式設計解析一段josn格式內容,並在介面上顯示出來。
8.英文閱讀,考察英語能力。
9.網路應用分析,發揮自己的主觀能動性和積累。
搜狗2012校招筆試
搜狗的題目出的很全,所有職位的題目都在一份卷子上,涉及到資料結構、網路、作業系統、演算法、軟體工程等多方面,根據自己所投遞的職位,有針對性的選擇要答的題目即可。
金山2012校園招聘筆試
為了保險,做了運維的題目,難度不大,主要是網路和Linux作業系統方面的,稍微準備一下即可。答題的時候自我感覺良好,結果沒收到面試通知,被鄙視了,o(╯□╰)o
Android開發工程師面試中經常會問到的問題
1.Activity的生命週期(最基本的)。
2.Android基本框架結構。
3.Android終止一個程式的方法,如何徹底終止一個程式。
4.如何改寫程式,改變android手機中返回鍵的功能(西安TCL研究院技術面試)。
一般來說,大公司的校園招聘中首先看的還是基礎,有工作或者實習經驗的會重點考慮,多問一些在實習中的專案細節,同時會問一些演算法,建議認真研讀《程式設計之美》《程式設計珠璣》之類的書籍。首先要做好充足的準備,打好基礎,其次還要看一些演算法、設計的內容,一面以後的技術面問的題目都有一定的挑戰性。如果有實習或者專案經歷,可以大大增加校招中簡歷篩選通過的機率。對於網際網路公司,特別喜歡海量資料的排序、搜尋,網上類似的資源很多,可以看看。技術更新永無止境,要時刻保持清醒的頭腦,不斷學習,充實自己,才能在競爭中不被淘汰,祝大家好運,找到心儀的工作。

=================================================================================================================

1.程式之間親和性的理解
eoe的一個朋友的回答,要不我還真想不到是什麼。
是問affinity吧
sdk文件中有詳細說明
2.Task任務棧的分配
3.Activity如何啟動一個service
這個問題開始真是小看了,個人覺得有兩種:一種就是start一個service,另外一種就是bind一個service。

百度android
筆試題
java如何同步
wait 和 sleep的區別
java常用的資料結構 如何實現
過載與重寫區別
android 如何提高穩定性
--------------------------------------------------------------
android 有哪些安全機制
基於上面兩篇文章,我也總結下:1.Android基於Linux,Linux的安全機制適用於Android,通過使用者id,組id等實現;2.Android的許可權機制:在manifest.xml中會配置相應的許可權 3.Android的獨立程式機制:每個應用都執行在獨立的程式中,互相不干擾,當然他們共享資源和記憶體等;還有注意shareId如果相同會執行在一個程式中 4.簽名機制:Android打包的時候有自己獨立的keystore檔案,所以這個檔案是唯一的,保證應用的安全性
-------------------------------------------------------------

android 應用之間有幾種共享資料的方法
android 哪些操作會導致記憶體洩露 如何排查
.9.png 和 png 的區別
sqlite 使用注意事項
Listview 中 getview中 convertview 的工作原理
service 有什麼特徵,在哪種情況下會用到service

面試
面試的時候會問你關於簡歷上的專案,會問得比較細,問你幾個人做的,做了多長時間,畫出原理圖
intent 如何開啟activity的?
manifest 的作用
記憶體過低時,是用什麼策略殺死程式@?

1. Intent的幾種有關Activity啟動的方式有哪些,你瞭解每個含義嗎?
這裡Android123提示大家,Intent的一些標記有FLAG_ACTIVITY_BROUGHT_TO_FRONT 、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK 等。每種含義大家看SDK文件和具體跑下這樣你的記憶會更深刻些。
2. Activity和Task的啟動模式有哪些? 每種含義是什麼?
有關在AndroidManifest.xml中的android:launchMode定義,主要有standard、singleTop、singleTask和singleInstance,同時對於android:taskAffinity這些問題大家也要了解,Android開發網在以前的文章中講過,不過很多開發者仍然不是很清楚,這些基礎問題我們以後仍然會再次總結。
3. 通過Intent傳遞一些二進位制資料的方法有哪些?
1). 使用Serializable介面實現序列化,這是Java常用的方法。
2). 實現Parcelable介面,這裡Android的部分類比如Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換資料也很常見的。
4. 能說下Android應用的入口點嗎?
在Google的虛擬機器中Application例項中已經實現了main方法,有關具體的Application介紹可以參考 Android程式的入口點是什麼,不是Main()嗎:http://www.android123.com.cn/kaifafaq/829.html
5. Java基礎問題,說說HashSet和HashTable的區別?
這個相信Java程式設計師都知道HashSet相對於HashMap就是不能存放重複的資料,對於HashTable來說,存放的資料不能出現key或value為null這樣的情況。
6. Java基礎問題,用Java的集合類寫下廣度優先搜尋.
這個屬於基礎資料結構問題,通過佇列處理一層一層,相對於深度優先的棧處理方式來說更實用一些。
7. Android都有哪些XML解析器,都熟練掌握嗎?
這裡XmlPull、SAX和DOM相信做過Web開發的都已經滾瓜爛熟了。
8. SQLite支援事務嗎? 新增刪除如何提高效能?
SQLite作為輕量級的資料庫,比MySQL還小,但支援SQL語句查詢,提高效能可以考慮通過原始經過優化的SQL查詢語句方式處理。
9. Android Service和Binder、AIDL你都熟練嗎?
作為Android重要的後臺服務,這些每個Android開發者都應該掌握,這也算是和Java SE最大的不同了,具體的例項大家可以檢視Android音樂播放器的原始碼Music.git中的,這裡不再贅述。


百度Android開發面試題
1、 Android dvm的程式和Linux的程式, 應用程式的程式是否為同一個概念
DVM指Dalvik的虛擬機器。每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個DVM都是在Linux 中的一個程式,所以說可以認為是同一個概念。
2、sim卡的EF 檔案有何作用
sim卡的檔案系統有自己規範,主要是為了和手機通訊,sim本
身可以有自己的作業系統,EF就是作儲存並和手機通訊用的
3、嵌入式作業系統記憶體管理有哪幾種,各有何特性 ?
頁式,段式,段頁,用到了MMU,虛擬空間等技術
4、什麼是嵌入式實時作業系統, Android 作業系統屬於實時作業系統嗎?
嵌入式實時作業系統是指當外界事件或資料產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致執行的嵌入式作業系統。主要用於工業控制、軍事裝置、
航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而android是基於linux核心的,因此屬於軟實時。
5、一條最長的簡訊息約佔多少byte?
中文70(包括標點),英文160個位元組
6、 android中的動畫有哪幾類,它們的特點和區別是什麼?
兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使檢視元件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
7、handler機制的原理
andriod提供了 Handler 和 Looper 來滿足執行緒間的通訊。Handler 先進先出原則。Looper類用來管理特定執行緒內物件之間的訊息交換(Message Exchange)。
1)Looper: 一個執行緒可以產生一個Looper物件,由它來管理此執行緒裡的Message Queue(訊息佇列)。
2)Handler: 你可以構造Handler物件來與Looper溝通,以便push新訊息到Message Queue裡;或者接收Looper從Message Queue取出)所送來的訊息。
3) Message Queue(訊息佇列):用來存放執行緒放入的訊息。
4)執行緒:UI thread 通常就是main thread,而Android啟動程式時會替它建立一個Message Queue。
8、說說mvc模式的原理,它在android中的運用
MVC(Model_view_contraller)” 模型_檢視_控制器”。 MVC應用程式總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要 Controller改變了Models的資料或者屬性,所有依賴的View都會自動更新。類似的,只要Controller改變了View,View會
從潛在的Model中獲取資料來重新整理自己。
View重繪和記憶體洩露的好像是面試經常問的問題
1. View的重新整理:
在需要重新整理的地方,使用handle.sendmessage傳送資訊,然後在handle的getmessage裡面執行invaliate或者postinvaliate.
2. GC記憶體洩露
出現情況:
1.資料庫的cursor沒有關閉
2.構造adapter時,沒有使用快取contentview
衍生listview的優化問題-----減少建立view的物件,充分使用contentview,可以使用一靜態類來優化處理getview的過程/
3.Bitmap物件不使用時採用recycle()釋放記憶體
4.activity中的物件的生命週期大於activity
除錯方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]
還有其他問題,大家歡迎提出阿,可以是整體架構的,還有這個Hal層.
這篇文章會涉及到以下幾個內容
一 Activity的生命週期
二 讓Activity變成一個視窗:Activity屬性設定
三 你後臺的Activity被系統
回收怎麼辦:onSaveInstanceState
四 呼叫與被呼叫:我們的通訊使者 - Intent
一 Activity的生命週期
和其他手機 平臺 的應用程式一樣,Android的應用程式的生命週期是被統一掌控的,也就是說我們寫的應用程式命運掌握在別人(系統)的手裡,我們不能改變它,只能學習並適應它。
簡單地說一下為什麼是這樣:我們手機在執行
一個應用程式的時候,有可能打進來電話發進來簡訊,或者沒有電了,這時候程式都會被中斷,優先去服務電話的基本功能,另外系統也不允許你佔用太多資源,至少要保證電話功能吧,所以資源不足的時候也就有可能被幹掉。言歸正傳,Activity的基本生命週期如下程式碼所示:
Java 程式碼
1
public class MyActivity extends Activity
2
{
3
protected void onCreate(Bundle savedInstanceState);
4
protected void onStart();
5
protected void onResume();
6
protected void onPause();
7
protected void onStop();
8
protected void onDestroy();
9
}
你自己寫的Activity會按需要
重 載這些方法,onCreate是免不了的,在一個Activity正常啟動的過程中,他們被呼叫的順序是 onCreate -> onStart ->onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期,但是有人問了
,程式正執行著呢來電話了,這個程式咋辦?中止了唄,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,如果打斷
這個應用程式的是一個Theme為Translucent 或者Dialog 的Activity那麼只是onPause ,恢復
的時候onResume 。
詳細介紹一下這幾個方法中系統在做什麼以及我們應該做什麼:
onCreate:
在這裡建立介面,做一些資料的初始化工作
onStart:
到這一步變成使用者可見不可互動的
onResume:
變成和使用者可互動的,(在activity 棧系統通過棧的方式管理這些個Activity的最上面,執行完彈出棧,則回到上一個Activity)
onPause:
到 這一步是可見但不可互動的,系統會停止動畫等消耗CPU 的事情從上文的描述已經知道,應該在這裡儲存你的一些資料,因為這個時候你的程式的優先順序降低,有可能被系統收回。在這裡儲存的資料,應該在 onResume裡讀出來,注意:這個方法裡做的事情時間要短,因為下一個activity不會等到這個方法完成才啟動
onstop:
變得不可見,被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被呼叫方法了,可能是外面類呼叫finish方法或者是系統為了節省空間將它暫時性的幹掉,可以用 isFinishing()來判斷它,如果你有一個Progress Dialog線上程中轉動,請在onDestroy裡把他cancel掉,不然等執行緒結束的時候,呼叫Dialog的cancel方法會拋異常的。
onPause,onstop, onDestroy,三種狀態下 activity都有可能被系統幹掉為了保證程式的正確性,你要在onPause()裡寫上持久層操作的程式碼,將使用者編輯的內容都儲存到儲存介質上(一般 都是資料庫)。實際工作中因為生命週期的變化而帶來的問題也很多,比如你的應用程式起了新的執行緒在跑,這時候中斷了,你還要去維護那個執行緒,是暫停還是殺 掉還是資料回滾,是吧?因為Activity可能被殺掉,所以執行緒中使用的變數和一些介面元素就千萬要注意了,一般我都是採用Android的訊息機制 [Handler,Message]來處理多執行緒和介面互動的問題。這個我後面會講一些,最近因為這些東西頭已經很大了,等我理清思緒再跟大家分享。
二 讓Activity變成一個視窗:Activity屬性設定
講點輕鬆的吧,可能有人希望做出來的應用程式是一個漂浮在手機主介面的東西,那麼很 簡單你只需要設定一下Activity的主題就可以了在AndroidManifest.xml 中定義 Activity的地方一句話:
Xml程式碼
android
:theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"
這就使你的應用程式變成對話方塊的形式彈出來了,或者 Xml程式碼
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
就 變成半透明的,[友情提示-.-]類似的這種activity的屬性可以在android.R.styleable 類的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的屬性的介紹都可以參考這個類android.R.styleable
上面說的是屬性名稱,具體有什麼值是在android.R.style中
可以看到,比如這個"@android:style/Theme.Dialog"就對應於android.R.style.Theme_Dialog ,('_'換成'.' <--注意:這個是文章內容不是笑臉)就可以用在描述檔案
中了,找找類定義和描述檔案中的對應關係就都明白了。
三 你後臺的Activity被系統回收怎麼辦:onSaveInstanceState
當你的程式中某一個Activity A 在執行時中,主動或被動地執行另一個新的Activity B 這個時候A會執行
Java程式碼
1
public void onSaveInstanceState(Bundle outState) {
2
super.onSaveInstanceState(outState);
3
outState.putLong("id", 1234567890);
4
}
5
public void onSaveInstanceState(Bundle outState) {
6
}
B 完成以後又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回 收的A就要重新呼叫onCreate()方法,不同於直接啟動的是這回 onCreate()裡是帶上引數 savedInstanceState,沒被收回的就還是onResume就好了。
savedInstanceState是一個Bundle物件,你基本上可以把他理解為系統幫你維護的一個Map物件。在onCreate()裡你可能會用到它,如果正常啟動onCreate就不會有它,所以用的時候要判斷一下是否為空。
Java程式碼
1
if(savedInstanceState !=null){
2
long id =savedInstanceState.getLong("id");
3
}
4
if(savedInstanceState !=null){}
就像官方的Notepad教程
裡的情況,你正在編輯某一個note,突然被中斷,那麼就把這個note的id記住,再起來的時候就可以根據這個id去把那個note取出來,程式就完整一些。這也是看你的應用需不需要儲存什麼,比如你的介面就是讀取一個列表,那就不需要特殊記住什麼,哦,
沒準你需要記住滾動條的位置...
四 呼叫與被呼叫:我們的通訊使者Intent
要 說Intent了,Intent就是這個這個意圖,應用程式間Intent進行交流,打個電話啦,來個電話啦都會發Intent, 這個是Android架構的鬆耦合的精髓部分,大大提高了元件的複用性,比如你要在你的應用程式中點選按鈕,給某人打電話,很簡單啊,看下程式碼先:
Java程式碼 :
1
Intent intent = new Intent();
2
intent.setAction(Intent.ACTION_CALL);
3
intent.setData(Uri.parse("tel:"+ number));
4
startActivity(intent);
扔出這樣一個意圖,系統看到了你的意圖就喚醒了電話撥號程式,打出來電話。什麼讀聯絡人,發簡訊啊,郵件啊,統統只需要扔出intent就好了,這個部分設計地確實很好啊。
那Intent通過什麼來告訴系統需要誰來接受他呢?
通常使用Intent有兩種方法,第一種是直接說明需要哪一個類來接收程式碼如下:
Java程式碼
1
Intent intent = new Intent(this,MyActivity.class);
2
intent.getExtras().putString("id","1");
3
startActivity(intent);
4
Intent intent = new Intent(this,MyActivity.class);intent.getExtras().putString("id","1");
5
startActivity(intent);
第一種方式很明顯,直接指定了MyActivity為接受者,並且傳了一些資料給MyActivity,在MyActivity裡可以用getIntent()來的到這個intent和資料。
第二種就需要先看一下AndroidMenifest中的intentfilter的配置了
Xml程式碼
01
<intent-filter>
02
<action android:name="android.intent.action.VIEW" />
03
<action android:value="android.intent.action.EDIT" />
04
<action android:value="android.intent.action.PICK" />
05
<category android:name="android.intent.category.DEFAULT"/>
06
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
07
</intent-filter>
08
<intent-filter>
09
<action android:name="android.intent.action.VIEW"/>
10
<action android:value="android.intent.action.EDIT" />
11
<action android:value="android.intent.action.PICK" />
12
<category android:name="android.intent.category.DEFAULT" />
13
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
14
</intent-filter>
這裡面配置用到了action, data, category這些東西,那麼聰明的你一定想到intent裡也會有這些東西,然後一匹配不就找到接收者了嗎?
action其實就是一個意圖的字串名稱。
上 面這段intent-filter的配置檔案說明了這個Activity可以接受不同的 Action,當然相應的程式邏輯也不一樣咯,提一下那個 mimeType,他是在
ContentProvider裡定義的,你要是自己實現一個ContentProvider就知道了,必須指定 mimeType才能讓資料被別人使用。
不知道原理說明白沒,總結一句,就是你呼叫別的介面不是直接new那個介面,而是通過扔出一個intent,讓系統幫你去呼叫那個介面,這樣就多麼鬆藕合啊,而且符合了生命週期被系統管理的原則。
想知道category都有啥,Android為你預先定製好的action都有啥等等,請親自訪問官方連結Intent
ps:想知道怎麼呼叫系統應用程式的同學,可以仔細看一下你的logcat,每次執行一個程式的時候是不是有一些資訊比如:
Starting activity: Intent {action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }
再對照一下Intent的一些set方法,就知道怎麼呼叫咯,希望你喜歡:)
一,listview你是怎麼優化的。
二,view的重新整理,之前說過
三,IPC及原理
四,Android多執行緒
五,Android為什麼要設計4大元件,他們之間的聯絡,不設計行不行(主要是為了實現MVC模式,然而java中最難的模式也是這個,很少有產品能將這個模式做得很好【Technicolor的面試官問的這個】)
六,service的週期,activity的週期,談下你對Android內部應用的瞭解,比如他做電話,以及聯絡人等等應用。框架層有很多東西還是多看看,熟悉Android怎麼做的,不管你做應用程開發還是應用框架層開發很有好處的。
在就是你專案經驗,突出你遇到什麼難點,然後是怎麼解決的!儘量將每個技術點凸顯出來,當然面試官有時候會為了體現你是否真正做過,他會問你,你在這個應用中做那個模組,用了多少個類之類的問題。
偶爾有的面試官會問你,你用過Android自帶的單元測試了沒,怎麼用的?
當然我面試過很多家單位,有的是做平板,手機,數字電視,有的是做出個erp之類的客戶端等等,出於前面的三個,基本上都是將Android的全部改掉,如果真正要做Android的話,大家要學的還很多。
總 之,一句話,什麼樣的面試官都有,去面試的時候要做好一切心理準備,不管是技術還是基礎都得紮實。一個人的交談能力也很重要,總之不是非常標準的普通話, 最起碼你說的得讓別人聽得懂,而且得把面試官講得非常徹底,這樣你獲得offer的機會更大,談工資也有優勢~~當然曾經一家公司的面試官跟我說過,技術 是不惜錢的,只要你有能力,多少錢他都請。

1.View如何重新整理?
View 可以呼叫invalidate()和postInvalidate()這兩個方法重新整理

以下面試題都是在網上找的總結出來的,謝謝大家的分享!希望,我們共同進步,找到自己夢想的公司:


1.android dvm 的程式和Linux的程式,應用程式的程式是否為同一個概念:
答:dvm是dalivk虛擬機器。每一個android應用程式都在自己的程式中執行,都擁有一個dalivk虛擬機器例項。而每一個dvm都是在linux的一個程式。所以說可以認為是同一個概念。
2.android的動畫有哪幾種?他們的特點和區別是什麼?
答:兩種,一種是tween動畫,一種是frame動畫。tween動畫,這種實現方式可以使檢視元件移動,放大或縮小以及產生透明度的變化。frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
3.handler進位制的原理:
答:android提供了handler和looper來滿足執行緒間的通訊。Handler先進先出原則。looper用來管理特定執行緒內物件之間的訊息交換(message Exchange).
    1)looper:一個執行緒可以產生一個looper物件,由它來管理此執行緒裡的message queue(訊息佇列)
   2)handler:你可以構造一個handler物件來與looper溝通,以便push新訊息到messagequeue裡;或者接收looper(從messagequeue裡取出)所送來的訊息。
    3)messagequeue:用來存放執行緒放入的訊息。
    4)執行緒:UI thread 通常就是main thread,而android啟動程式時會為它建立一個message queue.
4.android view的重新整理:
答:Android中對View的更新有很多種方式,使用時要區分不同的應用場合。我感覺最要緊的是分清:多執行緒和雙緩衝的使用情況。
    1).不使用多執行緒和雙緩衝
   這種情況最簡單了,一般只是希望在View發生改變時對UI進行重繪。你只需在Activity中顯式地呼叫View物件中的invalidate()方法即可。系統會自動呼叫 View的onDraw()方法。
    2).使用多執行緒和不使用雙緩衝
    這種情況需要開啟新的執行緒,新開的執行緒就不好訪問View物件了。強行訪問的話會報:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.
    這時候你需要建立一個繼承了android.os.Handler的子類,並重寫handleMessage(Messagemsg)方法。android.os.Handler是能傳送和處理訊息的,你需要在Activity中發出更新UI的訊息,然後再你的Handler(可以使用匿名內部類)中處理訊息(因為匿名內部類可以訪問父類變數,你可以直接呼叫View物件中的invalidate()方法 )。也就是說:在新執行緒建立併傳送一個Message,然後再主執行緒中捕獲、處理該訊息。
    3).使用多執行緒和雙緩衝
    Android中SurfaceView是View的子類,她同時也實現了雙緩衝。你可以定義一個她的子類並實現SurfaceHolder.Callback介面。由於實現SurfaceHolder.Callback介面,新執行緒就不需要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪製玩新的影象後呼叫unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。

5.說說mvc模式的原理,它在android中的運用:
答:android的官方建議應用程式的開發採用mvc模式。何謂mvc?

 mvc是model,view,controller的縮寫,mvc包含三個部分:

  l模型(model)物件:是應用程式的主體部分,所有的業務邏輯都應該寫在該層。
  2檢視(view)物件:是應用程式中負責生成使用者介面的部分。也是在整個mvc架構中使用者唯一可以看到的一層,接收使用者的輸入,顯示處理結果。
  3控制器(control)物件:是根據使用者的輸入,控制使用者介面資料顯示及更新model物件狀態的部分,控制器更重要的一種導航功能,想用使用者出發的相關事件,交給m哦得了處理。

 android鼓勵弱耦合和元件的重用,在android中mvc的具體體現如下:
    1)檢視層(view):一般採用xml檔案進行介面的描述,使用的時候可以非常方便的引入,當然,如何你對android瞭解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作為view層,當然這裡需要進行java和javascript之間的通 信,幸運的是,android提供了它們之間非常方便的通訊實現。
 2)控制層(controller):android的控制層的重 任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫程式碼,要通過activity交割model業務邏輯層處理, 這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這裡,程式就很容易被回收掉。
 3)模型層(model):對資料庫的操作、對網路等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。

6.Activity的生命週期:
答:onCreate: 在這裡建立介面,做一些資料 的初始化工作

  onStart: 到這一步變成使用者可見不可互動的
    onResume:變成和使用者可互動 的,(在activity 棧系統通過棧的方式管理這些個Activity的最上面,執行完彈出棧,則回到上一個Activity)
  onPause: 到這一步是可見但不可互動的,系統會停止動畫 等消耗CPU 的事情從上文的描述已經知道,應該在這裡儲存你的一些資料,因為這個時候你的程式的優先順序降低,有可能被系統收回。在這裡儲存的資料,應該在
  onstop: 變得不可見,被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被呼叫方法了,可能是外面類呼叫finish方法或者是系統為了節省空間將它暫時性的幹掉

7.讓Activity變成一個視窗:
答:Activity屬性設定:有時候會做個應用程式是漂浮在手機主介面的。這個只需要在設定下Activity的主題theme,即在Manifest.xml定義Activity的地方加一句:
android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中常用的五種佈局:
答:LinearLayout線性佈局;AbsoluteLayout絕對佈局;TableLayout表格佈局;RelativeLayout相對佈局;FrameLayout幀佈局;
9.Android的五種資料儲存方式:
答:sharedPreferences;檔案;SQLite;contentProvider;網路
10.請解釋下在單執行緒模型中Message、Handler、Message Queue、Looper之間的關係:
答:Handler獲取當前執行緒中的looper物件,looper用來從存有Message的Message Queue裡取出message,再由Handler進行message的分發和處理。
11.AIDL的全稱是什麼?如何工作?能處理哪些型別的資料?
答:AIDL(AndroidInterface Definition Language)android介面描述語言
12.系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由:
答:通過直接傳送Uri把引數帶過去,或者通過manifest裡的intentfilter裡的data屬性。程式碼如下:
    Intent intent = new Intent();
Intent.setAction(“android.intent.action.View”);
Uri uriBrowsers = Uri.parse(“http://www.sina.com.cn”);
Intent.setData(uriBrowsers);
//包名、要開啟的activity
    intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);
startActivity(intent);
13.什麼是ANR,如何避免?
答:ANR的定義:
在android上,如果你的應用程式有一段時間響應不移靈敏,系統會向使用者提示“應用程式無響應”(ANR:application Not Responding)對話方塊。因此,在程式裡對響應效能的設計很重要,這樣,系統不會顯示ANR給使用者。
如何避免:
首先來研究下為什麼它會在android的應用程式裡發生和如何最佳構建應用程式來避免ANR.
    android應用程式通常是執行在一個單獨的執行緒(例如:main)裡,這就意味你的應用程式所做的事情如果在主執行緒裡佔用了大長時間的話,就會引發ANR對話方塊,因為你的應用程式並沒有給自己機會來處理輸入事件或者Intent廣播。
    因此,執行在主執行緒裡的任何訪求都儘可能少做事情。特別是,activity應該在它的關鍵生命週期方法(onCreate()和onResume())裡儘可能少的去作建立操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變點陣圖尺寸,應該在子執行緒裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主執行緒阻塞在那裡等待子執行緒的完成---也不是呼叫Thread.wait()或者Thread.sleep()。替代的方法是:主執行緒應該為子執行緒提供一個Handler,以便完成時能夠提交給主執行緒。以這種方式設計你的應用程式,將能保證你的主執行緒保持對輸入的響應性並能避免由5秒輸入事件的超時引發的ANR對話方塊。這種做法應該在其它顯示UI的執行緒裡效仿,因為它們都受相同的超時影響。
    IntentReceiver執行時間的特殊限制意味著它應該做:在後臺裡做小的、瑣碎的工作,如儲存設定或註冊一個Notification。和在主執行緒裡呼叫的其它方法一樣,應用程式應該避免在BroadcastReceiver裡做耗時的操作或計算,但也不是在子執行緒裡做這些任務(因為BroadcastReceiver的生命週期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程式應該啟動一個Service。順便提及一句,你也應該避免在Intent Receiver裡啟動一個Activity,因為它會建立一個新的畫面,並從當前使用者正在執行的程式上搶奪焦點。如果你的應用程式在響應Intent廣播時需要向使用者展示什麼,你應該使用Notification Manager來實現。
    一般來說,在應用程式裡,100到200ms是使用者能感知阻滯的時間閾值,下面總結了一些技巧來避免ANR,並有助於讓你的應用程式看起來有響應性。
    如果你的應用程式為響應使用者輸入正在後臺工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)。特別是遊戲,在子執行緒裡做移動的計算。如果你的程式有一個耗時的初始化過程的話,考慮可以顯示一個Splash Screen或者快速顯示主畫面並非同步來填充這些資訊。在這兩種情況下,你都應該顯示正在進行的進度,以免使用者認為程式被凍結了。

14.什麼情況會導致Force Close?如何避免?能否捕獲導致其的異常?
答:如空指標等可以導致ForceClose;可以看Logcat,然後找到對應的程式程式碼來解決錯誤。
15.橫豎屏切換時候的activity的生命週期:
答:
1) 新建一個activity,並把各個生命週期列印出來
2) 執行activity,得到如下資訊:
onCreate()à
onStart()à
onResume()à
    3)  按ctrl+F12切換成橫屏時
        onSaveInstanceState()à
        onPause()à
        onStop()à
        onDestroy()à
        onCreate()à
        onStart()à
        onRestoreInstanceState()à
        onResume()à
    4)  再按ctrl+f12切換成豎屏時,發現列印了兩次相同的Log
        onSaveInstanceState()à
        onPause()à
        onStop()à
        onDestroyà
        onCreate()à
        onStart()à
        onRestoreInstanceState()à
        onResume()à

        onSaveInstanceState()à
        onPause()à
        onStop()à
        onDestroyà
        onCreate()à
        onStart()à
        onRestoreInstanceState()à
        onResume()à
    5)  修改AndroidManifest.xml,把該Activity新增android:configChanges=“orientation”,執行步驟3
        onSaveInstanceState()à
        onPause()à
        onStop()à
        onDestroy()à
        onCreate()à
        onStart()à
        onRestoreInstanceState()à
        onResume()à
    6)  修改AndroidManifest.xml,把該Activity新增android:configChanges=“orientation”,執行步驟4,發現不會再列印相同資訊,但多列印了一行onConfigChanged
        onSaveInstanceState()à
        onPause()à
        onStop()à
        onDestroy()à
        onCreate()à
        onStart()à
        onRestoreInstanceState()à
        onResume()à
        onConfigurationChanged()à
    7)  把步驟5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,執行步驟3,就只列印onConfigChanged
        onConfigurationChanged()à
    8)  把步驟5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,執行步驟4
        onConfigurationChanged()à
        onConfigurationChanged()à
    總結:
1) 不設定activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
2) 設定activity的android:configChanges=“orientation”時, 切屏會重新呼叫各個生命週期,切橫屏、豎屏時都只會執行一次,但是豎屏最後多列印一條onConfigurationChanged()
3) 設定activity的android:configChanges=“orientation|keyboardHidden”時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged(),橫屏一次,豎屏兩次
再總結下整個activity的生命週期:
1)  當前activity產生事件彈出Toast和AlertDialog的時候Activity的生命週期不會有改變
2)  Activity執行時按下HOME鍵(跟被完全覆蓋一樣的)
onSavaInstanceStateà
onPauseà
onStopà

onRestartà
onStartà
onResumeà
    3)  未被完全覆蓋,只是失去焦點:
        onPauseà
        onResumeà
16.如何將SQLite資料庫(.db檔案)與apk檔案一起釋出?
答:可以將.db檔案複製到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。可以將.db檔案複製到res aw目錄中
17.如何將開啟res aw目錄中的資料庫檔案?
答:在Android中不能直接開啟res aw目錄中的資料庫檔案,而需要在程式第一次啟動時將該檔案複製到手機記憶體或SD卡的某個目錄中,然後再開啟該資料庫檔案。複製的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream物件,然後將該InputStream物件中的資料寫入其他的目錄中相應檔案中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來開啟任意目錄中的SQLite資料庫檔案。
18.android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區別:
答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕鬆些,但一些效能敏感的資料庫或手機上還是主要採用SAX方 式,SAX讀取是單向的,優點:不佔記憶體空間、解析屬性方便,但缺點就是對於套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML檔案載入到記憶體 中去,這裡Android開發網提醒大家該方法在查詢方面可以和XPath很好的結合如果資料量不是很大推薦使用,而PULL常常用在J2ME對於節點處 理比較好,類似SAX方式,同樣很節省記憶體,在J2ME中我們經常使用的KXML庫來解析。
19.DDMS和TraceView的區別?
答:DDMS是一個程式執行檢視器,在裡面可以看見執行緒和堆疊等資訊,TraceView是程式效能分析器
20.談談Android的IPC機制:
答:IPC是內部程式通訊的簡稱,是共享"命名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行互動,故在Android中該機制,只適用於Activity和Service之間的通訊,類似於遠端方法呼叫,類似於C/S模式的訪問。通過定義AIDL介面檔案來定義IPC介面。Servier端實現IPC介面,Client端呼叫IPC介面本地代理。
21.NDK是什麼:
答:NDK是一系列工具的集合
    NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java應用打成apk包
    NDK整合了交叉編譯器,並提供了相應的mk檔案和隔離cpu,平臺等的差異,開發人員只需簡單的修改mk檔案就可以建立出so
22.描述一下android的系統架構:
答:android系統架構分從下往上為Linux核心層、執行庫、應用程式框架層和應用程式層。
    Linux核心層:負責硬體的驅動程式、網路、電源、系統安全以及記憶體管理等功能。
執行庫和androidruntion:執行庫:即c/c++函式庫部分,大多數都是開放原始碼的函式庫,例如webkit,該函式庫負責android網頁瀏覽器的執行;例如標準的c函式庫libc、openssl、sqlite等,當然也包括支援遊戲開發的2dsgl和3dopengles,在多媒體方面有mediaframework框架來支援各種影音和圖形檔案的播放與顯示,如mpeg4、h.264、mp3、aac、amr、jpg和png等眾多的多媒體檔案格式。Androidruntion負責解釋和執行生成的dalvik格式的位元組碼
應用軟體架構:java應用程式開發人員主要是使用該層封裝好的api進行快速開發的。
應用程式層:該層是java的應用程式層,android內建的googlemaps、email、IM、瀏覽器等,都處於該層,java開發人員工發的程式也處於該層,而且和內建的應用程式具有平等的地位,可以呼叫內建的應用程式,也可以替換內建的應用程式

23.Activity 與 Task的啟動模式有哪些,它們含義具體是什麼?
答:在一個activity中,有多次呼叫startActivity來啟動另一個activity,要想只生成一個activity例項,可以設定啟動模式。
    一個activity有四種啟動模式:standed,signleTop,singleTask,singleInstance
    Standed:標準模式,一呼叫startActivity()方法就會產生一個新的例項。
    SingleTop:如果已經有一個例項位於activity棧頂,就不產生新的例項,而只是呼叫activity中的newInstance()方法。如果不位於棧頂,會產生一個新的例項。
    singleTask:會在一個新的task中產生這個例項,以後每次呼叫都會使用這個,不會去產生新的例項了。
    SingleInstance:這個和singleTask基本一樣,只有一個區別:在這個模式下的activity例項所處的task中,只能有這個activity例項,不能有其他例項
24.Application類的作用:
答:API裡的第一句是:
Base class for those who need to maintain global application state
如果想在整個應用中使用全域性變數,在java中一般是使用靜態變數,public型別;而在android中如果使用這樣的全域性變數就不符合Android的框架架構,但是可以使用一種更優雅的方式就是使用Application context。
  首先需要重寫Application,主要重寫裡面的onCreate方法,就是建立的時候,初始化變數的值。然後在整個應用中的各個檔案中就可以對該變數進行操作了。
  啟動Application時,系統會建立一個PID,即程式ID,所有的Activity就會在此程式上執行。那麼我們在Application建立的時候初始化全域性變數,同一個應用的所有Activity都可以取到這些全域性變數的值,換句話說,我們在某一個Activity中改變了這些全域性變數的值,那麼在同一個應用的其他Activity中值就會改變
25.說明onSaveInstanceState() 和 onRestoreInstanceState()在什麼時候被呼叫:
答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命週期方法,它們不同於 onCreate()、onPause()等生命週期方法,它們並不一定會被觸發。當應用遇到意外情況(如:記憶體不足、使用者直接按Home鍵)由系統銷燬一個Activity時,onSaveInstanceState()才會被呼叫。但是當使用者主動去銷燬一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被呼叫。因為在這種情況下,使用者的行為決定了不需要儲存Activity的狀態。通常onSaveInstanceState()只適合用於儲存一些臨時性的狀態,而onPause()適合用於資料的持久化儲存。
另外,當螢幕的方向發生了改變, Activity會被摧毀並且被重新建立,如果你想在Activity被摧毀前快取一些資料,並且在Activity被重新建立後恢復快取的資料。可以重寫Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
26.android的service的生命週期?哪個方法可以多次被呼叫:
答:1)與採用Context.startService()方法啟動服務有關的生命週期方法
onCreate() -> onStart() -> onDestroy()
onCreate()該方法在服務被建立時呼叫,該方法只會被呼叫一次,無論呼叫多少次startService()或bindService()方法,服務也只被建立一次。
onStart() 只有採用Context.startService()方法啟動服務時才會回撥該方法。該方法在服務開始執行時被呼叫。多次呼叫startService()方法儘管不會多次建立服務,但onStart() 方法會被多次呼叫。
onDestroy()該方法在服務被終止時呼叫。

2)與採用Context.bindService()方法啟動服務有關的生命週期方法
onCreate() -> onBind() -> onUnbind() -> onDestroy()
onBind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務繫結時被呼叫,當呼叫者與服務已經繫結,多次呼叫Context.bindService()方法並不會導致該方法被多次呼叫。
onUnbind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務解除繫結時被呼叫。
如果先採用startService()方法啟動服務,然後呼叫bindService()方法繫結到服務,再呼叫unbindService()方法解除繫結,最後呼叫bindService()方法再次繫結到服務,觸發的生命週期方法如下:
onCreate() ->onStart() ->onBind() ->onUnbind()[過載後的方法需返回true] ->onRebind()
27.android的broadcast的生命週期:
答:1)Broadcast receiver生命週期中僅有一個回撥方法: 
void onReceive(Context curContext, Intent broadcastMsg) 
當接收器接收到一條broadcast訊息,Android就會呼叫onReceiver(),並傳遞給它一個Intent物件,這個物件攜帶著那條broadcast訊息。我們認為僅當執行這個方式時,Broadcast receiver是活動的;這個方法返回時,它就終止了。這就是Broadcast receiver的生命週期。

2)由於Broadcast receiver的生命週期很短,一個帶有活動的Broadcast receiver的程式是受保護的,以避免被幹掉;但是別忘了有一點,Android會在任意時刻幹掉那些攜帶不再活動的元件的程式,所以很可能會造成這個問題。

3)解決上述問題的方案採用一個Service來完成這項工作,Android會認為那個程式中(Service所在的程式)仍然有在活動的元件。
28.android view,surfaceview,glsurfaceview的區別:
答:SurfaceView是從View基類中派生出來的顯示類,直接子類有GLSurfaceView和VideoView,可以看出GL和視訊播放以及Camera攝像頭一般均使用SurfaceView
SurfaceView和View最本質的區別在於,surfaceView是在一個新起的單獨執行緒中可以重新繪製畫面而View必須在UI的主執行緒中更新畫面。 
那麼在UI的主執行緒中更新畫面 可能會引發問題,比如你更新畫面的時間過長,那麼你的主UI執行緒會被你正在畫的函式阻塞。那麼將無法響應按鍵,觸屏等訊息。 
當使用surfaceView 由於是在新的執行緒中更新畫面所以不會阻塞你的UI主執行緒。但這也帶來了另外一個問題,就是事件同步。比如你觸屏了一下,你需要surfaceView中thread處理,一般就需要有一個event queue的設計來儲存touch event,這會稍稍複雜一點,因為涉及到執行緒同步。
所以基於以上,根據遊戲特點,一般分成兩類。
1)被動更新畫面的。比如棋類,這種用view就好了。因為畫面的更新是依賴於 onTouch 來更新,可以直接使用 invalidate。 因為這種情況下,這一次Touch和下一次的Touch需要的時間比較長些,不會產生影響。
2)主動更新。比如一個人在一直跑動。這就需要一個單獨的thread不停的重繪人的狀態,避免阻塞main UI thread。

  5、IntentService有何優點?

  答:IntentService 的好處

  * Acitivity的程式,當處理Intent的時候,會產生一個對應的Service

  * Android的程式處理器現在會盡可能的不kill掉你

  * 非常容易使用

  6、橫豎屏切換時候activity的生命週期?

  1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

  2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次,豎屏的時候還會執行onConfigurationChanged方法

  3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

1. 如何將SQLite資料庫(dictionary.db檔案)與apk檔案一起釋出?

  解答:可以將dictionary.db檔案複製到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。可以將dictionary.db檔案複製到res aw目錄中

  2. 如何將開啟res aw目錄中的資料庫檔案?

  解答:在Android中不能直接開啟res aw目錄中的資料庫檔案,而需要在程式第一次啟動時將該檔案複製到手機記憶體或SD卡的某個目錄中,然後再開啟該資料庫檔案。複製的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream物件,然後將該InputStream物件中的資料寫入其他的目錄中相應檔案中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來開啟任意目錄中的SQLite資料庫檔案。

  3. Android引入廣播機制的用意?

  答:a:從MVC的角度考慮(應用程式內)

 其實回答這個問題的時候還可以這樣問,android為什麼要有那4大元件,現在的移動開發模型基本上也是照搬的web那一套MVC架構,只不過是改了點嫁妝而已。android的四大元件本質上就是為了實現移動或者說嵌入式裝置上的MVC架構,它們之間有時候是一種相互依存的關係,有時候又是一種補充關係,引入廣播機制可以方便幾大元件的資訊和資料互動。

  b:程式間互通訊息(例如在自己的應用程式內監聽系統來電)

  c:效率上(參考UDP的廣播協議在區域網的方便性)

  d:設計模式上(反轉控制的一種應用,類似監聽者模式)


41. 如何退出 Activity?如何安全退出已呼叫多個 Activity 的 Application?
對於單一 Activity 的應用來說,退出很簡單,直接 finish()即可。 當然,也可以用 killProcess()和 System.exit()這樣的方法。 但是,對於多 Activity 的應用來說,在開啟多個 Activity 後,如果想在最後開啟的 Activity 直接退出,上邊的方法都是沒有用的,因為上邊的方法都是結束一個 Activity 而已。 當然,網上也有人說可以。 就好像有人問, 在應用裡如何捕獲 Home 鍵, 有人就會說用 keyCode 比較 KEYCODE_HOME 即可,而事實上如果不修改 framework,根本不可能做到這一點一樣。 所以,最好還是自己親自試一下。 那麼,有沒有辦法直接退出整個應用呢? 在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。 它可以直接結束整個應用。在使用時需要許可權 ndroid.permission.RESTART_PACKAGES。 注意不要被它的名字迷惑。
可是,在 2.2,這個方法失效了。 在 2.2 新增了一個新的方法,killBackgroundProcesses(),需要許可權 android.permission.KILL_BACKGROUND_PROCESSES。 可惜的是,它和 2.2 的 restartPackage 一樣,根本起不到應有的效果。 另外還有一個方法,就是系統自帶的應用程式管理裡,強制結束程式的方法, forceStopPackage()。 它需要許可權 android.permission.FORCE_STOP_PACKAGES。 並且需要新增 android:sharedUserId="android.uid.system"屬性 同樣可惜的是,該方法是非公開的,他只能執行在系統程式,第三方程式無法呼叫。 因為需要在 Android.mk 中新增 LOCAL_CERTIFICATE := platform。 而 Android.mk 是用於在 Android 原始碼下編譯程式用的。 從以上可以看出,在 2.2,沒有辦法直接結束一個應用,而只能用自己的辦法間接辦到。
現提供幾個方法,供參考:
1、拋異常強制退出: 該方法通過拋異常,使程式 Force Close。 驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出 Force Close 的視窗。
2、記錄開啟的 Activity: 每開啟一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。
3、傳送特定廣播: 在需要結束應用時,傳送一個特定的廣播,每個 Activity 收到廣播後,關閉即可。
4、遞迴退出 在開啟新的 Activity 時使用 startActivityForResult,然後自己加標誌,在 onActivityResult 中 處理,遞迴關閉。
除了第一個,都是想辦法把每一個 Activity 都結束掉,間接達到目的。 但是這樣做同樣不完美。 你會發現,如果自己的應用程式對每一個 Activity 都設定了 nosensor,在兩個 Activity 結束 的間隙,sensor 可能有效了。 但至少,我們的目的達到了,而且沒有影響使用者使用。
為了程式設計方便,最好定義一個 Activity 基類,處理這些共通問題。

43. 請介紹下 Android 的資料儲存方式。
一.SharedPreferences 方式
二.檔案儲存方式
三.SQLite 資料庫方式
四.內容提供器(Content provider)方式
五. 網路儲存方式

43. 請介紹下 ContentProvider 是如何實現資料共享的。
建立一個屬於你自己的 Content provider 或者將你的資料新增到一個已經存在的 Content provider 中,前提是有相同資料型別並且有寫入 Content provider 的許可權。

44. 如何啟用 Service,如何停用 Service。 Android 中的 service 類似於 windows 中的 service,service 一般沒有使用者操作介面,它執行 於系統中不容易被使用者發覺, 可以使用它開發如監控之類的程式。
一。步驟 第一步:繼承 Service 類 public class SMSService extends Service { }
   第二步:在 AndroidManifest.xml 檔案中的<application>節點裡對服務進行配置: <service android:name=".DemoService" />
二。Context.startService()和 Context.bindService 服務不能自己執行,需要通過呼叫 Context.startService()或 Context.bindService()方法啟動服 務。這兩個方法都可 以啟動 Service,但是它們的使用場合有所不同。
   1.使用 startService()方法啟用服務,呼叫者與服務之間沒有關連,即使呼叫者退出了,服務 仍然執行。 使用 bindService()方法啟用服務,呼叫者與服務繫結在了一起,呼叫者一旦退出,服務也就 終止。
   2.採用 Context.startService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的 onCreate()方法, 接著呼叫 onStart()方法。 如果呼叫 startService()方法前服務已經被建立, 多次呼叫 startService() 方法並 不會導致多次建立服務,但會導致多次呼叫 onStart()方法。 採用 startService()方法啟動的服務,只能呼叫 Context.stopService()方法結束服務,服務結束 時會呼叫 onDestroy()方法。
3.採用 Context.bindService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的 onCreate()方法, 接著呼叫 onBind()方法。這個時候呼叫者和服務繫結在一起,呼叫者退出了,系統就會先調 用服務的 onUnbind()方法, 。接著呼叫 onDestroy()方法。如果呼叫 bindService()方法前服務已經被繫結,多次呼叫 bindService()方法並不會 導致多次建立服務及繫結(也就是說 onCreate()和 onBind()方法並不會被多次呼叫)。 如果呼叫 者希望與正在繫結的服務 解除繫結,可以呼叫 unbindService()方法,呼叫該方法也會導致系統呼叫服務的 onUnbind()-->onDestroy()方法。
三。Service 的生命週期 1.Service 常用生命週期回撥方法如下: onCreate() 該方法在服務被建立時呼叫,該方法只會被呼叫一次,無論呼叫多少次 startService()或 bindService()方法, 服務也只被建立一次。 onDestroy()該方法在服務被終止時呼叫。 2. Context.startService()啟動 Service 有關的生命週期方法 onStart() 只有採用 Context.startService()方法啟動服務時才會回撥該方法。該方法在服務開 始執行時被呼叫。 多次呼叫 startService()方法儘管不會多次建立服務,但 onStart() 方法會被多次呼叫。 3. Context.bindService()啟動 Service 有關的生命週期方法 onBind()只有採用 Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與 服務繫結時被呼叫, 當呼叫者與服務已經繫結,多次呼叫 Context.bindService()方法並不會導致該方法被多次調 用。 onUnbind()只有採用 Context.bindService()方法啟動服務時才會回撥該方法。 該方法在呼叫者 與服務解除繫結時被呼叫。 備註: 1. 採用 startService()啟動服務 Intent intent = new Intent(DemoActivity.this, DemoService.class); startService(intent); 2.Context.bindService()啟動 Intent intent = new Intent(DemoActivity.this, DemoService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); //unbindService(conn);//解除繫結


2013-4-7號更新:
問的問題都比較底層,總結一下大體如下:
1.對多執行緒的運用和理解,及多執行緒之間handle的傳值。
我覺得這個問題問的好。多執行緒的理解很重要。但是開發的時候一般應該是用不到的。

2.對android虛擬機器的理解,包括記憶體管理機制垃圾回收機制。

3.framework工作方式及原理,Activity是如何生成一個view的,機制是什麼。

4.android本身的一些限制,比如apk包大小限制,讀取大檔案時的時間限制。

5.ANR是什麼?哪些情況下會發生?開發時如何尋找ANR?
   ANR,Application not respons,我個人認為就是在UI執行緒進行耗時操作所造成的。Android的Activity反應時間是5秒,BroadCast是10秒,所以儘量不要做耗時的操作。開發的時候如果遇到了ANR,就看你操作的地方是否進行了耗時操作,是否在UI執行緒進行了耗時的網路請求或者I/O操作,避免這些就OK了。
6.這個問題有必要看看,想當初畢業的時候對這個是多麼的熟悉啊,現在都忘了,平時用的確實比較少。還有String,StringBuilder,StringBuffer這3個的區別。都有必要好好看看。

7.java集合的理解

8.Java:重寫equals()和hashCode()

結束語:
總結一點,我和朋友最近面試了幾乎所有國內的稍大點的網際網路公司(百度、騰訊、阿里、金山、小米、360、美團、去哪、網易、搜狐等等吧)、國企、電商(萬達電商)、還有些小公司、安全類(360)的等等吧,上面都是我一點點整理出來的,希望大家認真的把每一個題弄懂,你去面試任何一家公司,我認為都是沒有問題的。說幾個點,注意一下。
1、資料結構和演算法
一般情況下,工作中是用不到的,但是就是問,每個公司都問,而且有的公司還問的特別深,還讓你手寫程式碼。我覺得這個確實有點噁心,我個人也是很討厭演算法的,但是真是沒辦法,人家就問,你說怎麼辦?只能學唄。列個表,大家可以按照下面的去學習。不要一下看完,你看完也沒用,你沒有深入理解。每三天學一種,半年後,我覺得你應該會進步很多。然後可以看看“程式設計之美”等演算法書,應該會有較大的提高。
常見的資料結構
線性:陣列、連結串列、佇列、堆疊、塊狀陣列(陣列+連結串列)
、hash表、雙端佇列、點陣圖(bitmap)
樹:堆(大頂堆、小頂堆),trie樹(字母樹or字典樹),字尾樹,字尾陣列,二叉排序/查詢樹,B+/B-/B*,AVL樹,Treap,紅黑樹,splay樹,線段樹,樹狀陣列
圖:圖
其它:並查集

常見演算法
1)基本思想:列舉,遞迴,分治,模擬,貪心,動態規劃,剪枝,回溯
2)圖演算法:深度優先遍歷與廣度優先遍歷,最短路徑,最小生成樹,拓撲排序
3)字串演算法:字串查詢,hash演算法,KMP演算法
4)排序演算法:冒泡、快排、桶排序
5)動態規劃:揹包問題,最長公共子序列,最優二分檢索樹
6)數論問題:素數問題,整數問題,進位制轉換,同餘模運算
7)排列組合:排序和組合演算法
8)其它:LCA與RMQ問題


2.網路層
HTTP協議、TCP/IP協議,這個在Android的面試中問的比較少,但是瞭解一下,或者你學的比較深入,優勢就比較明顯了。會是你的加分點。所以,系統並且深入的學習一下就非常有必要了。

3.Android的基礎
這個肯定是必須的了,比如listview優化、UI特效的實現、資料庫層的搭建、JNI的使用等等。參照上面的面試題就可以。

4.注意一些面試細節
1)為什麼離職?
2)對薪水的期望值
3)手機記得靜音或者關機
4)表達能力的提高

最後希望大家都能找到一份好工作。

相關文章