Android面試精華
SIM卡的EF檔案有什麼作用?SIM卡裡的所有檔案按樹來組織:
主檔案MF(Master File)——主檔案只有檔案頭,裡面存放著整個SIM卡的控制和管理資訊
專用檔案DF(Dedicated File)——也是只有一個檔案頭, 裡面存放著整個目錄的管理控制資訊, 專用檔案相當於一個目錄的根.
基本檔案EF(Elementary File)——既有檔案頭,也有檔案體, 檔案頭存放該檔案的位置和控制資訊, 檔案體存放真正的資料, 整個SIM卡中只有基本檔案有檔案體, 也只有基本檔案才用來存放資料.
一條簡訊最長約佔多少byte?中文70(包括標點),英文160個位元組
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,controller的縮寫,mvc包含三個部分:
模型(model)對象:是應用程式的主體部分,所有的商務邏輯都應該寫在該層。
視圖(view)對象:是應用程式中負責產生使用者介面的部分。也是在整個mvc架構中使用者唯一可以看到的一層,接收使用者的輸入,顯示處理結果。
控制器(control)對象:是根據使用者的輸入,控制使用者介面資料顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,想用使用者出發的相關事件,交給m哦得了處理。在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裡面處理,當然對業務計算等操作也是必須放在的該層的。
如何讓Activity變成一個視窗?在AndroidManifest.xml 中定義 Activity的屬性:android :theme="@android:style/Theme.Dialog"
背景Activity被系統回收怎麼辦?當你的程式中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B 這個時候A會執行
public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("id", 123456);}B 完成以後又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上參數savedInstanceState,沒被收回的就還是onResume就好了.
if(savedInstanceState != null){ long id = savedInstanceState.getLong("id");}
Intent的作用
如何退出Activity?如何安全退出已調用多個Activity的Application?對於單一Activity的應用來說,退出很簡單,直接finish()即可。
當然,也可以用killProcess()和System.exit()這樣的方法。
Android的資料存放區方式1、使用SharedPreferences儲存資料;
2、檔案儲存體資料;
3、SQLite資料庫儲存資料;
4、使用ContentProvider儲存資料;
5、網路儲存資料;
Android常用的布局線性/相對/絕對/網格/表格/幀布局
Android的多螢幕適配a.在manifest裡定義你的程式支援的螢幕類型,相應代碼如下:
android:smallScreens=["true" | "false"] //是否支援小屏
android:normalScreens=["true" | "false"] //是否支援中屏
android:largeScreens=["true" | "false"] //是否支援大屏
android:xlargeScreens=["true" | "false"] //是否支援超大屏
android:anyDensity=["true" | "false"] //是否支援多種不同密度的螢幕
android:requiresSmallestWidthDp=”integer”
android:compatibleWidthLimitDp=”integer”
android:largestWidthLimitDp=”integer”/>
b.對不同大小的螢幕提供不同的layout。
比如,如果需要對大小為large的螢幕提供支援,需要在res目錄下建立一個檔案夾layout-large/並提供layout。當然,也可以在res目錄下建立layout-port和layout-land兩個目錄,裡面分別放置豎屏和橫屏兩種布局檔案,以適應對橫屏豎屏自動切換。
c.對不同密度的螢幕提供不同的圖片。
應盡量使用點9格式的圖片,如需對密度為low的螢幕提供合適的圖片,需建立檔案夾drawable-ldpi/,並放入合適大小的圖片。相應的,medium對應drawable-mdpi /,high對應drawable-hdpi/,extra high對應drawable-xhdpi/。
圖片大小的確定:low:medium:high:extra high比例為3:4:6:8。舉例來說,對於中等密度(medium)的螢幕你的圖片像素大小為48×48,那麼低密度(low)螢幕的圖片大小應為36×36,高(high)的為72×72,extra high為96×96。
ContentProvider是如何?資料共用的?一個程式可以通過實現一個Content provider的抽象介面將自己的資料完全暴露出去,而且Content providers是以類似資料庫中表的方式將資料暴露。Content providers儲存和檢索資料,通過它可以讓所有的應用程式訪問到,這也是應用程式之間唯一共用資料的方法。
要想使應用程式的資料公開化,可通過2種方法:建立一個屬於你自己的Content provider或者將你的資料添加到一個已經存在的Content provider中,前提是有相同資料類型並且有寫入Content provider的許可權。
註冊廣播有幾種方式?有何優缺點?靜態註冊:常駐型,佔資源比較大動態註冊:優先順序比較高,廣播跟隨程式的生命週期
有哪些方法可以實現前背景資料交換,包括文字和圖片?
有哪些方法實現訊息的推送?輪詢 : 應用程式應當階段性的與伺服器進行串連並查詢是否有新的訊息到達,你必須自己實現與伺服器之間的通訊SMS :(通過傳送簡訊並解析簡訊內容來擷取伺服器端的指令),這個出現的問題是很難找到免費的網關來傳送簡訊持久串連 : 主要是Socket通訊,這個解決了效能問題,但是耗電問題依舊沒能解決
網路通訊的方式
TCP/URL(URLConnection)/HTTP(HttpClient)/WebView/WebService
Activity啟動模式1. standard
模式啟動模式,每次啟用Activity時都會建立Activity,並放入任務棧中。
2. singleTop
如果在任務的棧頂正好存在該Activity的執行個體, 就重用該執行個體,否者就會建立新的執行個體並放入棧頂(即使棧中已經存在該Activity執行個體,只要不在棧頂,都會建立執行個體)。
3. singleTask
如果在棧中已經有該Activity的執行個體,就重用該執行個體(會調用執行個體的onNewIntent())。重用時,會讓該執行個體回到棧頂,因此在它上面的執行個體將會被移除棧。如果棧中不存在該執行個體,將會建立新的執行個體放入棧中。
4. singleInstance
在一個新棧中建立該Activity執行個體,並讓多個應用共用改棧中的該Activity執行個體。一旦改模式的Activity的執行個體存在於某個棧中,任何應用再啟用改Activity時都會重用該棧中的執行個體,其效果相當於多個應用程式共用一個應用,不管誰啟用該Activity都會進入同一個應用中。
NDK是什麼
NDK是一些列工具的集合,
NDK提供了一系列的工具,協助開發人員迅速的開發C/C++的動態庫,並能自動將so和java 應用打成apk包。
NDK整合了交叉編譯器,並提供了相應的mk檔案和隔離cpu、平台等的差異,開發人員只需簡單的修改mk檔案就可以建立出so
描述一下android的系統架構
android系統架構分從下往上為linux 核心層、運行庫、應用程式架構層、和應用程式層
linuxkernel:負責硬體的驅動程式、網路、電源、系統安全以及記憶體管理等功能。
libraries和 androidruntime:libraries:即c/c++函數庫部分,大多數都是開放原始碼的函數庫,例如webkit,該函數庫負責 android網頁瀏覽器的運行,例如標準的c函數庫libc、openssl、sqlite等,當然也包括支援遊戲開發2dsgl和 3dopengles,在多媒體方面有mediaframework架構來支援各種影音和圖形檔案的播放與顯示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等眾多的多媒體檔案格式。android的runtime負責解釋和執行產生的dalvik格式的位元組碼。
applicationframework(應用軟體架構),java應用程式開發人員主要是使用該層封裝好的api進行快速開發。
applications:該層是java的應用程式層,android內建的googlemaps、e-mail、即時通訊工具、瀏覽器、mp3播放 器等處於該層,java開發人員開發的程式也處於該層,而且和內建的應用程式具有平等的位置,可以調用內建的應用程式,也可以替換內建的應用程式。
談談Android的IPC機制
IPC是內部進程通訊的簡稱, 是共用"具名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行互動,故在Android中該機制,只適用於Activity和Service之間的通訊,類似於遠程方法調用,類似於C/S模式的訪問。通過定義AIDL介面檔案來定義IPC介面。Servier端實現IPC介面,Client端調用IPC介面本地代理。
java中如何引用本地語言?
可以用JNI介面
DDMS和TraceView的區別?
DDMS是一個程式執行查看器,在裡面可以看見線程和堆棧等資訊,TraceView是程式效能分析器
android中的動畫有哪幾類,它們的特點和區別是什麼?
兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
Android dvm的進程和Linux的進程, 應用程式的進程是否為同一個概念
DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機器執行個體。而每一個DVM都是在Linux 中的一個進程,所以說可以認為是同一個概念。
嵌入式作業系統記憶體管理有哪幾種, 各有何特性
頁式,段式,段頁,用到了MMU,虛擬空間等技術
什麼是嵌入式即時作業系統, Android 作業系統屬於即時作業系統嗎?
嵌入式即時作業系統是指當外界事件或資料產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有即時任務協調一致啟動並執行嵌入式作業系統。主要用於工業控制、 軍事裝置、 航空航天等領域對系統的回應時間有苛刻的要求,這就需要使用即時系統。又可分為軟即時和硬即時兩種,而android是基於linux核心的,因此屬於軟即時。
Activity的生命週期
和其他手機 平台 的應用 程式 一樣,Android的應用程式 的生命週期是被統一掌控 的,也就是說我們寫的應用程式命運掌握在別人(系統)的手裡,我們不能改變它,只能學習 並適應它。簡單地說一下為什麼是這樣:我們手機在運行 一個應用程式的時候,有可能打進來電話發進來簡訊 ,或者沒有電了,這時候程式都會被中斷,優先去服務電話的準系統 ,另外系統也不允許你佔用太多資源 ,至少要保證電話功能吧,所以資源不足的時候也就有可能被幹掉。
在一個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]來處理多線程和介面互動的問題。