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.還問了下拉刷新和分頁加載的實現機制
-------------------------------------------------------
盤古搜索面試總結
算法題
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 親和性
這個通常人應該都不熟悉,瞭解一下,面試中可能被問到,概率不大。
--------------------------------------------------------------
百度各類面試總結
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算法的數據結構。
一、對於簡歷上所寫的每一個問題,面試官感興趣的會對我提問,並分析裏邊遇到的問題以及獲得的經驗。面試過程描述之前作過的項目。項目中你認爲的難點是什麼。
二、對於網絡交互這塊兒須要注意什麼問題
三、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,如何求其內部的最大距離。
6.簡單介紹一下Android系統中的Activity,Service, Intent, ContentProvider組件。
7.編程解析一段josn格式內容,並在界面上顯示出來。
8.英文閱讀,考察英語能力。
9.網絡應用分析,發揮本身的主觀能動性和積累。
搜狗2012校招筆試
搜狗的題目出的很全,全部職位的題目都在一份卷子上,涉及到數據結構、網絡、操做系統、算法、軟件工程等多方面,根據本身所投遞的職位,有針對性的選擇要答的題目便可。
金山2012校園招聘筆試
爲了保險,作了運維的題目,難度不大,主要是網絡和Linux操做系統方面的,稍微準備一下便可。答題的時候自我感受良好,結果沒收到面試通知,被鄙視了,o(╯□╰)o
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應用的入口點嗎?
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架構的鬆耦合的精髓部分,大大提升了組件的複用性,好比你要在你的應用程序中點擊按鈕,給某人打電話,很簡單啊,看下代碼先:
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」);
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框架來支持各類影音和圖形文件的播放與顯示,如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掉你
* 很是容易使用
六、橫豎屏切換時候activity的生命週期?
一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
二、設置Activity的android:configChanges="orientation"時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次,豎屏的時候還會執行onConfigurationChanged方法
三、設置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,沒有辦法直接結束一個應用,而只能用本身的辦法間接辦到。
現提供幾個方法,供參考:
一、拋異常強制退出: 該方法經過拋異常,使程序 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 通常沒有用戶操做界面,它運行 於系統中不容易被用戶發覺, 能夠使用它開發如監控之類的程序。
一。步驟 第一步:繼承 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)表達能力的提升
最後但願你們都能找到一份好工做。