Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android面試

android面試

編輯:關於Android編程

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緩存如何實現
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

02

03

04

05

06

07


08

09

10

11

12

13

14


這裡面配置用到了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 文件中的節點裡對服務進行配置: 二。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)表達能力的提高
最後希望大家都能找到一份好工作。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved