百度Android開發面試題
一、 Android dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念
DVM指dalivk的虛擬機。每個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 代碼
public class MyActivity extends Activity
{
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
你本身寫的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代碼 public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("id", 1234567890); } public void onSaveInstanceState(Bundle outState) { B 完成之後又會來找A, 這個時候就有兩種狀況,一種是A被回收,一種是沒有 被回收,被回 收的A就要從新調用onCreate()方法,不一樣於直接啓動的是這 回 onCreate()裏是帶上參數 savedInstanceState,沒被收回的就仍是 onResume就行了。 savedInstanceState是一個Bundle對象,你基本上能夠把他理解爲系統幫你 維護的一個Map對象。在onCreate()裏你可能會用到它,若是正常啓動onCreate 就不會有它,因此用的時候要判斷一下是否爲空。 Java代碼 if(savedInstanceState !=null){ long id =savedInstanceState.getLong("id"); } if(savedInstanceState !=null){ 就像官方的Notepad教程 裏的狀況,你正在編輯某一個note,忽然被中斷,那麼就把這個note的id記 住,再起來的時候就能夠根據這個id去把那個note取出來,程序就完整一些。 這也是看你的應用需不須要保存什麼,好比你的界面就是讀取一個列表,那就不 須要特殊記住什麼,哦, 沒準你須要記住滾動條的位置... 四 調用與被調用:咱們的通訊使者Intent 要 說Intent了,Intent就是這個這個意圖,應用程序間Intent進行交流,打 個電話啦,來個電話啦都會發Intent, 這個是Android架構的鬆耦合的精髓部 分,大大提升了組件的複用性,好比你要在你的應用程序中點擊按鈕,給某人打 電話,很簡單啊,看下代碼先: Java代碼 : Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+ number)); startActivity(intent); 複製代碼 扔出這樣一個意圖,系統看到了你的意圖就喚醒了電話撥號程序,打出來電話。 什麼讀聯繫人,發短信啊,郵件啊,通通只須要扔出intent就行了,這個部分 設計地確實很好啊。 那Intent經過什麼來告訴系統須要誰來接受他呢? 一般使用Intent有兩種方法,第一種是直接說明須要哪個類來接收代碼如 下: Java代碼 Intent intent = new Intent(this,MyActivity.class); intent.getExtras().putString("id","1"); startActivity(intent); Intent intent = new Intent(this,MyActivity.class);intent.getExtras().putString("id","1"); tartActivity(intent);複製代碼 第一種方式很明顯,直接指定了MyActivity爲接受者,而且傳了一些數據給 MyActivity,在MyActivity裏能夠用getIntent()來的到這個intent和數據。 第二種就須要先看一下AndroidMenifest中的intentfilter的配置了 Xml代碼 <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:value="android.intent.action.EDIT" /> <action android:value="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <action android:value="android.intent.action.EDIT" /> <action android:value="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </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如何刷新? 2.DDMS與TraceView的區別? 3.activity被回收了怎麼辦? 4.在Java中如何引入C語言? 參考答案 : 1.View 能夠調用invalidate()和postInvalidate()這兩個方法刷新 2.DDMS是一個程序執行查看器,在裏面你能夠看見線程和堆棧等信息, TraceView是程序性能分析器 3.activity回收了,那就只有另起了 4.java調用C語言程序,能夠用JNI接口來實現 上面答案僅做參考,畢竟我我的能力也有限嘛,不免會回答錯誤,呵呵..... 解答: 1.View受系統刷新(系統內部有個循環,監控事件、作業務處理、繪UI), 能夠用postInvalidate()促使系統刷新。 2.(還真不知道) 3.請參照Activity生命週期,若是被系統destroy了,也就是說的回收,只 有重新start了 4.經過JNI調用。建議閱讀《The Java Native InterfaceProgrammer's Guide and Specification》,英文版的,從sun網站下吧。