android面試

http://www.apkbus.com/android-115989-1-1.html
面試的幾個回答技巧

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.還問了下拉刷新和分頁載入的實現機制


-------------------------------------------------------javascript


盤古搜索面試總結


算法題
2.求一個數組的最大連續子序列和,比方:-10,3,5,2,-3,6,7
最笨的方法就是窮舉法。用三層for循環


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


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


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


3.本身定義控件


4.xmpp協議的理解


5.廣播建立方式有幾種?有什麼差異?


6.多線程有幾種實現方式?
繼承Thread,  實現Runnable接口。 AsynTask


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


1、listview怎樣優化(這個很是重要,屢次被問到)
1.分頁載入
2.convertView緩存
3.viewHolder
4.scrollListener,記住滑動的狀態


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






4、單鏈表的反轉、合併、排序


5、二分查找法

6、Intent Flag常用的記住幾個




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


8、taskAffinity 親和性
這個通常人應該都不熟悉,瞭解一下。面試中可能被問到,概率不大。html




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


百度各類面試總結


1.Listview item緩存怎樣實現
convertView


2.很是多view怎樣緩存


3.圖片上傳


4.圖片過大怎樣處理?壓縮後圖片有多大?
分辨率壓縮、質量壓縮




5.OOM怎麼辦?




6.圖片的緩存機制,怎樣作到高效和穩定?




7.本身定義view怎麼作能提升效率?java

本身定義view怎樣作圖片緩存?本身定義view怎樣推斷單擊和雙擊?本身定義view 的 onDraw方法主要作什麼?


避免反覆調用measure 和 layout


8.是否看過view的源代碼


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


10.二叉樹、鏈表


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


12.問項目底層實現


13.Linux文件系統實現,怎樣實現文件的隱藏?
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。
android

相同是搜狗的筆試題:適合頻繁插入和查找的數據結構
答:頻繁插入,鏈表效率高,頻繁查找數組效率高,那麼綜合一下,我我的認爲是哈希表,或者說HashMap等使用hash算法的數據結構。

一、對於簡歷上所寫的每個問題,面試官感興趣的會對我提問,並分析裏邊遇到的問題以及獲得的經驗。

面試過程描寫敘述曾經作過的項目。c++

項目中你以爲的難點是什麼。git


二、對於網絡交互這塊兒需要注意什麼問題web

三、android是一個什麼樣的系統。Jni調用機制是什麼。

用uml畫一個在你的項目中使用的設計模式。面試



面試中常問的非技術類問題:
1.簡介一下你本身。

2.對本身作個評價。長處、缺點。
3.本身作過的項目,具體介紹一下。
4.實習經歷,在實習過程當中遇到哪些問題,怎樣解決的?
5.你對公司有什麼問題要問嗎(對公司有什麼要了解的)?
技術類的問題主要就看對技術的掌握程度和本身的綜合能力了。
百度移動終端研發project師筆試題,題量不大,2個小時。有點難度。

1.寫一個字符串逆序的程序,時間複雜度和空間複雜度最低,效率越高越好。
2.實質:二叉樹的層序遍歷,每層的結點用單鏈表輸出。

3.1-N(N最大32000。且未知),內存僅僅有4K,找出當中的反覆數
4.編程題,比較複雜。是個系統設計題,與《編程之美》中3.2,電話號碼相應英語單詞相似。
百度軟件開發project師一面問題:
1.有101個數。爲[1。100]之間的數,當中一個數是反覆的。怎樣尋找這個反覆的數,其時間複雜度和空間複雜度是多少?
2.Java中抽象類與接口的差異。
3.進程與線程之間的聯繫與差異。

(多家公司都在問,好好研究一下)算法

4.談談對設計模式的認識與理解。簡介一下你所知道的設計模式。

(多家公司都問。Android方向面試必考的)

5.線程、多線程相關(必問)
6.Linux常用的命令,shell編程。grep命令的使用。
7.海量數據查找或者排序,有資源限制要求。

(常考的)

建議:簡歷中對本身的專業技能要實事求是的寫,突出本身的重點,不宜託大,面試官面試時提問的根據就是簡歷上的內容。百度的工做環境很是好。作技術的員工給人的感受就是儘管人家的技術水平很是高,但是都比較謙遜。百度確實是一個不錯的互聯網公司。

Sina無線client開發project師面試
筆試的題目和7月22日實習生的題目幾乎相同。面試主要問了:
1.二叉樹的一些基礎知識。
2.Java多線程。對stop()方法的認識,怎樣安全的終止一個線程。
3.設計模式相關的問題
4.談談你對面向對象編程中繼承的認識
5.排序算法
網易2012校招無線client開發筆試。題目不太難。比較基礎。
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校招筆試
搜狗的題目出的很是全,所有職位的題目都在一份卷子上。涉及到數據結構、網絡、操做系統、算法、軟件project等多方面。依據本身所投遞的職位,有針對性的選擇要答的題目就能夠。

金山2012校園招聘筆試
爲了保險。作了運維的題目,難度不大,主要是網絡和Linux操做系統方面的。略微準備一下就能夠。答題的時候自我感受良好。結果沒收到面試通知。被歧視了,o(╯□╰)o
Android開發project師面試中經常會問到的問題
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開發面試題
一、 Android dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念
DVM指Dalvik的虛擬機。

每一個Android應用程序都在它本身的進程中執行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux 中的一個進程,因此說可以以爲是同一個概念。

二、sim卡的EF 文件有何做用
sim卡的文件系統有本身規範。主要是爲了和手機通信,sim本
身可以有本身的操做系統,EF就是做存儲並和手機通信用的
三、嵌入式操做系統內存管理有哪幾種,各有何特性 ?
頁式,段式。段頁。用到了MMU,虛擬空間等技術
四、什麼是嵌入式實時操做系統, Android 操做系統屬於實時操做系統嗎?
嵌入式實時操做系統是指當外界事件或數據產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出高速響應。並控制所有實時任務協調一致執行的嵌入式操做系統。主要用於工業控制、軍事設備、
航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分爲軟實時和硬實時兩種。而android是基於linux內核的。所以屬於軟實時。
五、一條最長的短信息約佔多少byte?
中文70(包含標點),英文160個字節
六、 android中的動畫有哪幾類,它們的特色和差異是什麼?
兩種,一種是Tween動畫、另外一種是Frame動畫。Tween動畫,這樣的實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化。另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。
七、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。

八、說說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架構的鬆耦合的精髓部分,大大提升了組件的複用性,比方你要在你的應用程序中點擊button,給某人打電話,很是easy啊。看下代碼先:
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之類的client等等。出於前面的三個,基本上都是將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。假設耗時的操做放在這裏。程序就很是easy被回收掉。

 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 Androidproject中的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框架來支持各類影音和圖形文件的播放與顯示,如mpeg四、h.26四、mp三、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。

  五、IntentService有何長處?

  答:IntentService 的優勢

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

  * Android的進程處理器現在會盡量的不kill掉你

  * 很easy使用

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


  一、不設置Activity的android:configChanges時,切屏會又一次調用各個生命週期,切橫屏時會運行一次,切豎屏時會運行兩次

  二、設置Activity的android:configChanges="orientation"時,切屏仍是會又一次調用各個生命週期,切橫、豎屏時僅僅會運行一次,豎屏的時候還會運行onConfigurationChanged方法

  三、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會又一次調用各個生命週期。僅僅會運行onConfigurationChanged方法

1. 怎樣將SQLite數據庫(dictionary.db文件)與apk文件一塊兒公佈?

  解答:可以將dictionary.db文件拷貝到Eclipse Androidproject中的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 的應用來講,退出很是easy。直接 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,沒有辦法直接結束一個應用。而僅僅能用本身的辦法間接辦到。

現提供幾個方法,供參考:
一、拋異常強制退出: 該方法經過拋異常。使程序 Force Close。 驗證可以,但是,需要解決的問題是,怎樣使程序結束掉,而不彈出 Force Close 的窗體。
二、記錄打開的 Activity: 每打開一個 Activity。就記錄下來。

在需要退出時,關閉每一個 Activity 就能夠。

三、發送特定廣播: 在需要結束應用時。發送一個特定的廣播。每個 Activity 收到廣播後。關閉就能夠。

四、遞歸退出 在打開新的 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 通常沒實用戶操做界面,它執行 於系統中不easy被用戶發覺。 可以使用它開發如監控之類的程序。
一。

步驟 第一步:繼承 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)的等等吧,上面都是我一點點整理出來的,但願你們認真的把每一個題弄懂。你去面試不論什麼一家公司,我以爲都是沒有問題的。說幾個點。注意一下。
一、數據結構和算法
普通狀況下,工做中是用不到的,但是就是問,每個公司都問。而且有的公司還問的特別深,還讓你手寫代碼。我認爲這個確實有點噁心,我我的也是很是討厭算法的,但是真是沒辦法,人家就問。你說怎麼辦?僅僅能學唄。

列個表,你們可以依照如下的去學習。不要一下看完,你看完也沒用,你沒有深刻理解。每三天學一種,半年後,我認爲你應該會進步很是多。

而後可以看看「編程之美」等算法書,應該會有較大的提升。

常見的數據結構
線性:數組、鏈表、隊列、堆棧、塊狀數組(數組+鏈表)
、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)表達能力的提升

最後但願你們都能找到一份好工做。
相關文章
相關標籤/搜索