android面试题总结加强
在加強版的基礎上又再加強的android應用面試題集
有些補充略顯臃腫,只為學習
1.activity的生命周期。
| 方法 | 描述 | 可被殺死 | 下一個 | ||
| onCreate() | 在activity第一次被創建的時候調用。這里是你做所有初始化設置的地方──創建視圖、設置布局、綁定數據至列表等。如果曾經有狀態記錄(參閱后述Saving?Activity?State。),則調用此方法時會傳入一個包含著此activity以前狀態的包對象做為參數。? 總繼之以onStart()。 | 否 | onStart() | ||
| ???? | onRestart() | 在activity停止后onStop(),在再次啟動之前被調用。? 總繼之以onStart()。 | 否 | onStart() | |
| onStart() | 當activity正要變得為用戶所見時被調用。? 當activity轉向前臺時繼以onResume(),在activity變為隱藏時繼以onStop()。 | 否 | onResume()? | ||
| ???? | onResume() | 在activity開始與用戶進行交互之前被調用。此時activity位于堆棧頂部,并接受用戶輸入。? 繼之以onPause()。 | 否 | onPause() | |
| onPause() | 當系統將要啟動另一個activity時調用。此方法主要用來將未保存的變化進行持久化,停止類似動畫這樣耗費CPU的動作等。這一切動作應該在短時間內完成,因為下一個activity必須等到此方法返回后才會繼續。? 當activity重新回到前臺是繼以onResume()。當activity變為用戶不可見時繼以onStop()。 | 是 | onResume()? | ||
| onStop() | 當activity不再為用戶可見時調用此方法。這可能發生在它被銷毀或者另一個activity(可能是現存的或者是新的)回到運行狀態并覆蓋了它。? 如果activity再次回到前臺跟用戶交互則繼以onRestart(),如果關閉activity則繼以onDestroy()。 | 是 | onRestart()? | ||
| onDestroy() | 在activity銷毀前調用。這是activity接收的最后一個調用。這可能發生在activity結束(調用了它的?finish()?方法)或者因為系統需要空間所以臨時的銷毀了此acitivity的實例時。你可以用isFinishing()?方法來區分這兩種情況。 | 是 | nothing | ||
(補充)
1、onCreate():當Activity被創建的時候調用(第一次)。操作:設置布局文件,初始化視圖,綁定數據文件等。
2、onStart():當Activity能被我們看到的時候。
3、onResume():當Activity獲得用戶的焦點的時候,就是能被用戶操作的時候。
4、onPause()[pause暫停的意思]:Activity暫停。應用程序啟動了另一個Activity的時候。例子:來了一個電話,系統啟動了電話Activity。在這個函數里要做的就是把Activity的數據保存起來,當接完電話的時候,再把這些數據讀出來,把原來的Activity還原出來。
5、onstop():當第二個Activity把第一個Activity完全遮擋住了的時候。對話框并沒有把原來的Activity完全遮擋起來,不會調用。
6、onDestroy():銷毀Activity。1)調用了finish()方法。2)系統資源不夠用了。
函數調用過程:
啟動第一個Activity的時候:
第一次創建onCreate()-->Activity可見了onStart()-->Activity可以操作了onResume()。
?
點擊第一個Activity上的按鈕通過Intent跳到第二個Activity:
第一個Activity暫停onPause()-->創建第二個ActivityonCreate()-->Activity可見onStart()-->Activity可操作onResume()-->第一個Activity被第二個Activity完全遮蓋onStop()(如果調用了finish(),或者系統資源緊缺,則會被銷毀onDestory())。
?
點擊系統返回功能建,從第二個Activity回到第一個Activity?:
第二個Activity暫停onPause()-->第一個Activity重啟動OnRestart()(并沒有被銷毀,如果銷毀了則要創建onCreate())-->第一個Activity可見onStart()-->第一個Activity可操作onResume()-->第二個Activity被完全遮蓋onStop()(如果調用了finish(),或者系統資源緊缺,則會被銷毀onDestory())。
2.橫豎屏切換時候activity的生命周期
1.不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次.?
2.設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次.?
3.設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法.
3.android中的動畫有哪幾類,它們的特點和區別是什么?
?
Android提供兩種創建簡單動畫的機制:tweened animation(補間動畫)?和 frame-by-frame animation(幀動畫).
- tweened animation:通過對場景里的對象不斷做圖像變換(平移、縮放、旋轉)產生動畫效果
- frame-by-frame animation:順序播放事先做好的圖像,跟電影類似
這兩種動畫類型都能在任何View對象中使用,用來提供簡單的旋轉計時器,activity圖標及其他有用的UI元素。Tweened animation被andorid.view.animation包所操作;frame-by-frame animation被android.graphics.drawable.AnimationDrawable類所操作。
想了解更多關于創建tweened和frame-by-frame動畫的信息,讀一下Dev Guide-Graphics-2D Graphics里面相關部分的討論。
?
Animation 是以 XML格式定義的,定義好的XML文件存放在res/anim中。由于Tween Animation與Frame-by-frame Animation的定義、使用都有很大的差異,我們將分開介紹,本篇幅中主要介紹Tween Animation的定義與使用。按照XML文檔的結構【父節點,子節點,屬性】來介紹Tween Animation,其由4種類型:
- Alpha: 漸變透明度動畫效果
- Scale:漸變尺寸伸縮動畫效果
- Translate:畫面轉換位置移動動畫效果
- Rotate: 畫面轉換角度移動動畫效果
在介紹以上4種 類型前,先介紹Tween Animation共同的節點屬性。
| 表一 | ||
| 屬性[類型] | 功能 | ? |
| Duration[long] | 屬性為動畫持續時間 | 時間以毫秒為單位 |
| fillAfter [boolean] | 當設置為true ,該動畫轉化在動畫結束后被應用 | |
| fillBefore[boolean] | 當設置為true ,該動畫轉化在動畫開始前被應用 | |
| interpolator | 指定一個動畫的插入器 | 有一些常見的插入器 accelerate_decelerate_interpolator 加速-減速 動畫插入器 accelerate_interpolator 加速-動畫插入器 decelerate_interpolator 減速- 動畫插入器 其他的屬于特定的動畫效果 |
| repeatCount[int] | 動畫的重復次數 | ? |
| RepeatMode[int] | 定義重復的行為 | 1:重新開始? 2:plays backward |
| startOffset[long] | 動畫之間的時間間隔,從上次動畫停多少時間開始執行下個動畫 | |
| zAdjustment[int] | 定義動畫的Z Order的改變 | 0:保持Z Order不變 1:保持在最上層 -1:保持在最下層 |
?
下面我們開始結 合具體的例子,分別介紹4種類型各自特有的節點元素。
| 表二 | ||
| XML節點 | 功能說明 | |
| alpha | 漸變透明度動畫效果 | |
| <alpha android:fromAlpha=”0.1″ android:toAlpha=”1.0″ android:duration=”3000″ /> | ||
| fromAlpha | 屬性為動畫起始時透明度 | 0.0表示完全不透明 1.0表示完全透明 以上值取0.0-1.0之間的float數據類型的數字 |
| toAlpha | 屬性為動畫結束時透明度 | |
| 表三 | |||
| scale | 漸變尺寸伸縮動畫效果 | ||
| <scale android:interpolator= “@android:anim/accelerate_decelerate_interpolator” android:fromXScale=”0.0″ android:toXScale=”1.4″ android:fromYScale=”0.0″ android:toYScale=”1.4″ android:pivotX=”50%” android:pivotY=”50%” android:fillAfter=”false” android:startOffset=“700” android:duration=”700″ android:repeatCount=”10″ /> | |||
| fromXScale[float] fromYScale[float] | 為動畫起始時,X、Y坐標上的伸縮尺寸 | 0.0表示收縮到沒有 1.0表示正常無伸縮 值小于1.0表示收縮 值大于1.0表示放大 | |
| toXScale [float] toYScale[float] | 為動畫結束時,X、Y坐標上的伸縮尺寸 | ||
| pivotX[float] pivotY[float] | 為動畫相對于物件的X、Y坐標的開始位置 | 屬性值說明:從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置 | |
| ? | ? | ? | ? |
| 表四 | |||
| translate | 畫面轉換位置移動動畫效果 | ||
| <translate android:fromXDelta=”30″ android:toXDelta=”-80″ android:fromYDelta=”30″ android:toYDelta=”300″ android:duration=”2000″ /> | |||
| fromXDelta toXDelta | 為動畫、結束起始時 X坐標上的位置 | ? | |
| fromYDelta toYDelta | 為動畫、結束起始時 Y坐標上的位置 | ? | |
| ? | ? | ? | ? |
| 表五 | |||
| rotate | 畫面轉移旋轉動畫效果 | ||
| <rotate android:interpolator=”@android:anim/accelerate_decelerate_interpolator” android:fromDegrees=”0″ android:toDegrees=”+350″ android:pivotX=”50%” android:pivotY=”50%” android:duration=”3000″ /> | |||
| fromDegrees | 為動畫起始時物件的角度 | 說明 當角度為負數——表示逆時針旋轉 當角度為正數——表示順時針旋轉 (負數from——to正數:順時針旋轉) (負數from——to負數:逆時針旋轉) (正數from——to正數:順時針旋轉) (正數from——to負數:逆時針旋轉) | |
| toDegrees | 為動畫結束時物 件旋轉的角度 可以大于360度 | ||
| pivotX pivotY | 為動畫相對于物件的X、Y坐標的開始位置 | 說明:以上兩個屬性值 從0%-100%中取值 50%為物件的X或Y方向坐標上的中點位置 | |
?
Android SDK提供了基類:Animation,包含大量的set/getXXXX()函數來設置、讀取Animation的屬性,也就是前面表一中顯示的各種屬性。Tween Animation由4種類型:alpha、scale、translate、roate,在Android SDK中提供了相應的類,Animation類派生出了AlphaAnimation、ScaleAnimation、 TranslateAnimation、RotateAnimation分別實現了?改變 Alpha值?、?伸縮?、?平移?、?旋轉?等動畫,每個子類都在父類的基礎上增加了各自獨有的屬性。
(補充)
? ? ?Android的動畫效果分為兩種,一種是tweened animation(補間動畫),第二種是frame by frame animation。一般我們用的是第一種。補間動畫又分為AlphaAnimation,透明度轉換 ?RotateAnimation,旋轉轉換 ?ScaleAnimation,縮放轉換 ?TranslateAnimation 位置轉換(移動)。
動畫效果在anim目錄下的xml文件中定義,在程序中用AnimationUtils.loadAnimation(Context context,int ResourcesId)載入成Animation對象,在需要顯示動畫效果時,執行需要動畫的View的startAnimation方法,傳入Animation,即可。切換Activity也可以應用動畫效果,在startActivity方法后,執行overridePendingTransition方法,兩個參數分別是切換前的動畫效果,切換后的動畫效果
4.?一條最長的短信息約占多少byte?
? 中文70(包括標點),英文160個字節。
5.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。
6.什么是嵌入式實時操作系統,?Android?操作系統屬于實時操作系統嗎?
嵌入式實時操作系統是指當外界事件或數據產生時,能夠接受并以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,并控制所有實時任務協調一致運行的嵌入式操作系統。主要用于工業控制、?軍事設備、?航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而android是基于linux內核的,因此屬于軟實時
7.android中線程與線程,進程與進程之間如何通信
1、一個?Android?程序開始運行時,會單獨啟動一個Process。
???默認情況下,所有這個程序中的Activity或者Service都會跑在這個Process。
???默認情況下,一個Android程序也只有一個Process,但一個Process下卻可以有許多個Thread。
2、一個?Android?程序開始運行時,就有一個主線程Main?Thread被創建。該線程主要負責UI界面的顯示、更新和控件交互,所以又叫UI?Thread。
???一個Android程序創建之初,一個Process呈現的是單線程模型--即Main?Thread,所有的任務都在一個線程中運行。所以,Main?Thread所調用的每一個函數,其耗時應該越短越好。而對于比較費時的工作,應該設法交給子線程去做,以避免阻塞主線程(主線程被阻塞,會導致程序假死?現象)。?
3、Android單線程模型:Android?UI操作并不是線程安全的并且這些操作必須在UI線程中執行。如果在子線程中直接修改UI,會導致異常。
8.Android?dvm的進程和Linux的進程,?應用程序的進程是否為同一個概念?
DVM指dalivk的虛擬機。每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux?中的一個進程,所以說可以認為是同一個概念。?
9.sim卡的EF?文件有何作用?
sim卡的文件系統有自己規范,主要是為了和手機通訊,sim本?身可以有自己的操作系統,EF就是作存儲并和手機通訊用的
11.讓Activity變成一個窗口:Activity屬性設定?
講點輕松的吧,可能有人希望做出來的應用程序是一個漂浮在手機主界面的東西,那么很?簡單你只需要設置?一下Activity的主題就可以了在AndroidManifest.xml?中定義?Activity的?地方一句話:?
Xml代碼?
1.?android?:theme="@android:style/Theme.Dialog"?
這就使你的應用程序變成對話框的形式彈出來了,或者?
Xml代碼?
1.?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?,('_'換成'.'?<?--注意:這個是文章內容不是笑臉)就可以用在描述文件?中了,找找類定義和描述文件中的對應關系就都明白了。?
12.如何將SQLite數據庫(dictionary.db文件)與apk文件一起發布??
解答:可以將dictionary.db文件復制到Eclipse?Android工程中的res raw目錄中。所有在res raw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將dictionary.db文件復制到res raw目錄中?
13.如何將打開res?aw目錄中的數據庫文件??
解答:在Android中不能直接打開res raw目錄中的數據庫文件,而需要在程序第一次啟動時將該文件復制到手機內存或SD卡的某個目錄中,然后再打開該數據庫文件。復制的基本方法是使用getResources().openRawResource方法獲得res raw目錄中資源的?InputStream對象,然后將該InputStream對象中的數據寫入其他的目錄中相應文件中。在Android?SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件。?
14.在android中mvc的具體體現
Android?的官方建議應用程序的開發采用MVC?模式。何謂MVC?先看看下圖
MVC?是Model,View,Controller?的縮寫,從上圖可以看出MVC?包含三個部分:
..?模型(Model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該
層。
..?視圖(View)對象:是應用程序中負責生成用戶界面的部分。也是在整個
MVC?架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
..?控制器(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里面處理,當然對業務計算等操作也是必須放在的該層的。
15.Android系統的架構
android的系統架構和其操作系統一樣,采用了分層的架構。從架構圖看,android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和linux核心層。
1.應用程序
Android會同一系列核心應用程序包一起發布,該應用程序包包括email客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。所有的應用程序都是使用JAVA語言編寫的。
2.應用程序框架
開發人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序都可以發布它的功能塊并且任何其它的應用程序都可以使用其所發布的功能塊(不過得遵循框架的安全性限制)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。
隱藏在每個應用后面的是一系列的服務和系統,?其中包括;
*?豐富而又可擴展的視圖(Views),可以用來構建應用程序,?它包括列表(lists),網格(grids),文本框(text?boxes),按鈕(buttons),?甚至可嵌入的web瀏覽器。
*?內容提供器(Content?Providers)使得應用程序可以訪問另一個應用程序的數據(如聯系人數據庫),?或者共享它們自己的數據
*?資源管理器(Resource?Manager)提供?非代碼資源的訪問,如本地字符串,圖形,和布局文件(?layout?files?)。
*?通知管理器?(Notification?Manager)?使得應用程序可以在狀態欄中顯示自定義的提示信息。
*?活動管理器(?Activity?Manager)?用來管理應用程序生命周期并提供常用的導航回退功能。
有關更多的細節和怎樣從頭寫一個應用程序,請參考?如何編寫一個?Android?應用程序.
3.系統運行庫
1)程序庫
Android?包含一些C/C++庫,這些庫能被Android系統中不同的組件使用。它們通過?Android?應用程序框架為開發者提供服務。以下是一些核心庫:
*?系統?C?庫?-?一個從?BSD?繼承來的標準?C?系統函數庫(?libc?),?它是專門為基于?embedded?linux?的設備定制的。
*?媒體庫?-?基于?PacketVideo?OpenCORE;該庫支持多種常用的音頻、視頻格式回放和錄制,同時支持靜態圖像文件。編碼格式包括MPEG4,?H.264,?MP3,?AAC,?AMR,?JPG,?PNG?。
*?Surface?Manager?-?對顯示子系統的管理,并且為多個應用程序提?供了2D和3D圖層的無縫融合。
*?LibWebCore?-?一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。
*?SGL?-?底層的2D圖形引擎
*?3D?libraries?-?基于OpenGL?ES?1.0?APIs實現;該庫可以使用硬件?3D加速(如果可用)或者使用高度優化的3D軟加速。
*?FreeType?-位圖(bitmap)和矢量(vector)字體顯示。
*?SQLite?-?一個對于所有應用程序可用,功能強勁的輕型關系型數據庫引擎。
2)Android?運行庫
Android?包括了一個核心庫,該核心庫提供了JAVA編程語言核心庫的大多數功能。
每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。Dalvik被設計成一個設備可以同時高效地運行多個虛擬系統。?Dalvik虛擬機執行(.dex)的Dalvik可執行文件,該格式文件針對小內存使用做了優化。同時虛擬機是基于寄存器的,所有的類都經由JAVA編譯器編譯,然后通過SDK中?的?“dx”?工具轉化成.dex格式由虛擬機執行。
Dalvik虛擬機依賴于linux內核的一些功能,比如線程機制和底層內存管理機制。
4.Linux?內核
Android?的核心系統服務依賴于?Linux?2.6?內核,如安全性,內存管理,進程管理,?網絡協議棧和驅動模型。?Linux?內核也同時作為硬件和軟件棧之間的抽象層。
(補充)
16.Android常用控件的信息
單選框(RadioButton與RadioGroup):
RadioGroup用于對單選框進行分組,相同組內的單選框只有一個單選框被選中。
事件:setOnCheckedChangeListener(),處理單選框被選擇事件。把RadioGroup.OnCheckedChangeListener實例作為參數傳入。
多選框(CheckBox):
每個多選框都是獨立的,可以通過迭代所有的多選框,然后根據其狀態是否被選中在獲取其值。
事件:setOnCheckedChangeListener(),處理多選框被選擇事件。把CheckBox.OnCheckedChangeListener()實例作為參數傳入。
下拉列表框(Spinner):
Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());獲取下拉列表框的值。
事件:setOnItemSelectedListener(),處理下拉列表框被選擇事件把Spinner.OnItemSelectedListener()實例作為參數傳入。
拖動條(SeekBar):
SeekBar.getProgress()獲取拖動條當前值
事件:setOnSeekBarChangeListener(),處理拖動條值變化事件,把SeekBar.OnSeekBarChangeListener實例作為參數傳入。
菜單(Menu):
重寫Activity的onCreatOptionMenu(Menu?menu)方法,該方法用于創建選項菜單,當用戶按下手機的"Menu"按鈕時就會顯示創建好的菜單,在onCreatOptionMenu(Menu?Menu)方法內部可以調用Menu.add()方法實現菜單的添加。
重寫Activity的onMenuItemSelected()方法,該方法用于處理菜單被選擇事件。
進度對話框(ProgressDialog):
創建并顯示一個進度對話框:ProgressDialog.show(ProgressDialogActivity.this,"請稍等","數據正在加載中....",true);
設置對話框的風格:setProgressStyle()
ProgressDialog.STYLE_SPINNER??旋轉進度條風格(為默認風格)
ProgressDialog.STYLE_HORIZONTAL?橫向進度條風格
(補充)
下面是各種常用控件的事件監聽的使用
①EditText(編輯框)的事件監聽---OnKeyListener
②RadioGroup、RadioButton(單選按鈕)的事件監聽---OnCheckedChangeListener
③CheckBox(多選按鈕)的事件監聽---OnCheckedChangeListener
④Spinner(下拉列表)的事件監聽---OnItemSelectedListener
⑤Menu(菜單)的事件處理---onMenuItemSelected
⑥Dialog(對話框)的事件監聽---DialogInterface.OnClickListener()
http://www.iteye.com/topic/1060815
17.請介紹下Android中常用的五種布局
Android布局是應用界面開發的重要一環,在Android中,共有五種布局方式,分別是:FrameLayout(幀布局),LinearLayout?(線性布局),
AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)。?
??1.FrameLayout????
? ? ? ?這個布局可以看成是墻腳堆東西,有一個四方的矩形的左上角墻腳,我們放了第一個東西,要再放一個,那就在放在原來放的位置的上面,這樣依次的放,會蓋住原來的東西。這個布局比較簡單,也只能放一點比較簡單的東西。????
? 2.LinearLayout????
? ? ? ?線性布局,這個東西,從外框上可以理解為一個div,他首先是一個一個從上往下羅列在屏幕上。每一個LinearLayout里面又可分為垂直布局?(android:orientation="vertical")和水平布局(android:orientation="horizontal"?)。當垂直布局時,每一行就只有一個元素,多個元素依次垂直往下;水平布局時,只有一行,每一個元素依次向右排列。????
LinearLayout中有一個重要的屬性?android:layout_weight="1",這個weight在垂直布局時,代表行距;水平的時候代表列寬;weight值越大就越大。????
? 3.AbsoluteLayout????
? ? ? ?絕對布局猶如div指定了absolute屬性,用X,Y坐標來指定元素的位置android:layout_x="20px"?android:layout_y="12px"?這種布局方式也比較簡單,但是在垂直隨便切換時,往往會出問題,而且多個元素的時候,計算比較麻煩。????
4.RelativeLayout????
????相對布局可以理解為某一個元素為參照物,來定位的布局方式。主要屬性有:????
????相對于某一個元素????
????android:layout_below="@id/aaa"?該元素在?id為aaa的下面????
????android:layout_toLeftOf="@id/bbb"?該元素在?id為bbb的左邊?????
?????相對于父元素的地方????
?????android:layout_alignParentLeft="true" ?與父元素左對齊????
?????android:layout_alignParentRight="true" 與父元素右對齊????
?????還可以指定邊距等,具體詳見API ? ?? ??
5.TableLayout????
?????表格布局類似Html里面的Table。每一個TableLayout里面有表格行TableRow,TableRow里面可以具體定義每一個元素,設定他的對齊方式?android:gravity=""?。????
?????每一個布局都有自己適合的方式,另外,這五個布局元素可以相互嵌套應用,做出美觀的界面。
18.如何啟用Service,如何停用Service?
Android中的服務和windows中的服務是類似的東西,服務一般沒有用戶操作界面,它運行于系統中不容易被用戶發覺,可以使用它開發如監控之類的程序。服務的開發比較簡單,如下:
第一步:繼承Service類
public?class?SMSService?extends?Service?{
}
第二步:在AndroidManifest.xml文件中的<application>節點里對服務進行配置:
<service?android:name=".SMSService"?/>
?
服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。
?
如果打算采用Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法并不會導致多次創建服務,但會導致多次調用onStart()方法。采用startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
?
如果打算采用Context.bindService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()方法,接著調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法并不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法并不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()-->onDestroy()方法。
服務常用生命周期回調方法如下:
onCreate()?該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被創建一次。
onDestroy()該方法在服務被終止時調用。
?
與采用Context.startService()方法啟動服務有關的生命周期方法
onStart()?只有采用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。多次調用startService()方法盡管不會多次創建服務,但onStart()?方法會被多次調用。
?
與采用Context.bindService()方法啟動服務有關的生命周期方法
onBind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法并不會導致該方法onBind()被多次調用。
onUnbind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用
[java]?view plaincopy
19.ListView的優化方案
1,如果自定義適配器,那么在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創建contentView并返回,如果不為null則直接使用。在這個方法中,盡可能少創建view。
2,給contentView設置tag(setTag()),傳入一個viewHolder對象,用于緩存要顯示的數據,可以達到圖像數據異步加載的效果
3,如果listview需要顯示的item很多,就要考慮分頁加載。比如一共要顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表底部的時候,再去加載接下來的20條。
20廣播接收者生命周期
廣播接收器只有一個回調方法:
void onReceive(Context curContext, Intent broadcastMsg)
當廣播消息抵達接收器時,Android調用它的onReceive()方法并將包含消息的Intent對象傳遞給它。廣播接收器僅在它執行這個方法時處于活躍狀態。當onReceive()返回后,它即為失活狀態。
擁有一個活躍狀態的廣播接收器的進程被保護起來而不會被殺死。但僅擁有失活狀態組件的進程則會在其它進程需要它所占有的內存的時候隨時被殺掉。
這種方式引出了一個問題:如果響應一個廣播信息需要很長的一段時間,我們一般會將其納入一個衍生的線程中去完成,而不是在主線程內完成它,從而保證用戶交互過程的流暢。如果onReceive()衍生了一個線程并且返回,則包涵新線程在內的整個進程都被會判為失活狀態(除非進程內的其它應用程序組件仍處于活躍狀態),于是它就有可能被殺掉。這個問題的解決方法是令onReceive()啟動一個新服務,并用其完成任務,于是系統就會知道進程中仍然在處理著工作。
21.設計模式和IoC(Inversion of Control?控制反轉)
Android?框架魅力的源泉在于IoC,在開發Android?的過程中你會時刻感受到IoC?帶來
的巨大方便,就拿Activity?來說,下面的函數是框架調用自動調用的:
protected?void?onCreate(Bundle?savedInstanceState)?;
不是程序編寫者主動去調用,反而是用戶寫的代碼被框架調用,這也就反轉
了!當然IoC?本身的內涵遠遠不止這些,但是從這個例子中也可以窺視出IoC
帶來的巨大好處。此類的例子在Android?隨處可見,例如說數據庫的管理類,
例如說Android?中SAX?的Handler?的調用等。有時候,您甚至需要自己編寫簡
單的IoC?實現,上面展示的多線程現在就是一個說明
22.Android中的長度單位詳解
現在這里介紹一下dp?和sp。dp?也就是dip。這個和sp?基本類似。如果設置表示長度、高度等屬性時可以使用dp?或sp。但如果設置字體,需要使用sp。dp?是與密度無關,sp?除了與密度無關外,還與scale?無關。如果屏幕密度為160,這時dp?和sp?和px?是一樣的。1dp=1sp=1px,但如果使用px?作單位,如果屏幕大小不變(假設還是3.2?寸),而屏幕密度變成了320。那么原來TextView?的寬度設成160px,在密度為320?的3.2?寸屏幕里看要比在密度為160?的3.2?寸屏幕上看短了一半。但如果設置成160dp?或160sp?的話。系統會自動將width?屬性值設置成320px?的。也就是160?*?320?/?160。其中320?/?160?可稱為密度比例因子。
也就是說,如果使用dp?和sp,系統會根據屏幕密度的變化自動進行轉換。
下面看一下其他單位的含義
px:表示屏幕實際的象素。例如,320*480?的屏幕在橫向有320個象素,
在縱向有480?個象素。
in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54?厘米。例如,形容
手機屏幕大小,經常說,3.2(英)寸、3.5(英)寸、4(英)寸就是指這個
單位。這些尺寸是屏幕的對角線長度。如果手機的屏幕是3.2?英寸,表示手機
的屏幕(可視區域)對角線長度是3.2*2.54?=?8.128?厘米。讀者可以去量
一量自己的手機屏幕,看和實際的尺寸是否一致。 ?
23.?4種activity的啟動模式
standard:?標準模式,一調用startActivity()方法就會產生一個新的實例。?
singleTop:?如果已經有一個實例位于Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。如果不位于棧頂,會產生一個新的實例。?
singleTask:?會在一個新的task中產生這個實例,以后每次調用都會使用這個,不會去產生新的實例了。?
singleInstance:?這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity實例所處的task中,只能有這個activity實例,不能有其他的實例。
24.什么是ANR?如何避免它?
ANR:Application?Not?Responding。
在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列情況時,Android就會顯示ANR對話框了:?
用戶對應用程序的操作(如輸入事件,按鍵、觸摸屏事件)在5秒內無響應
廣播接受器(BroadcastReceiver)在10秒內仍未執行完畢?
Android應用程序完全運行在一個獨立的線程中(例如main)。這就意味著,任何在主線程中運行的,需要消耗大量時間的操作都會引發ANR。因為此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intent?broadcast)。?
避免方法:Activity應該在它的關鍵生命周期方法(如 onCreate()和onResume())里盡可能少的去做創建操作,
潛在的耗時操作。例如網絡或數據庫操作,或者高耗時的計算如改變位圖尺寸,應該在子線程里(或者異步方式)來完成。
主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。
25.Android?Intent的使用
在一個Android應用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通訊中,由Intent協助完成。
正如網上一些人解析所說,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將?Intent傳遞給調用的組件,并完成組件的調用。Intent在這里起著實現調用者與被調用者之間的解耦作用。
Intent傳遞過程中,要找到目標消費者(另一個Activity,IntentReceiver或Service),也就是Intent的響應者,有兩種方法來匹配:
1,顯示匹配(Explicit):?
代碼簡潔明了,執行了switchActivity()函數,就會馬上跳轉到名為TestB的Activity中。?
2,隱式匹配(Implicit):
???
??隱式匹配,首先要匹配Intent的幾項值:Action,?Category,?Data/Type,Component
如果填寫了Componet就是上例中的Test.class)這就形成了顯示匹配。所以此部分只講前幾種匹配。匹配規則為最大匹配規則,
1,如果你填寫了Action,如果有一個程序的Manifest.xml中的某一個Activity的IntentFilter段中定義了包含了相同的Action那么這個Intent就與這個目標Action匹配,如果這個Filter段中沒有定義Type,Category,那么這個Activity就匹配了。但是如果手機中有兩個以上的程序匹配,那么就會彈出一個對話可框來提示說明。
Action的值在Android中有很多預定義,如果你想直接轉到你自己定義的Intent接收者,你可以在接收者的IntentFilter中加入一個自定義的Action值(同時要設定Category值為"android.intent.category.DEFAULT"),在你的Intent中設定該值為Intent的Action,就直接能跳轉到你自己的Intent接收者中。因為這個Action在系統中是唯一的。
2,data/type,你可以用Uri來做為data,比如Uri?uri?=?Uri.parse(http://www.google.com?);
Intent?i?=?new?Intent(Intent.ACTION_VIEW,uri);手機的Intent分發過程中,會根據http://www.google.com?的scheme判斷出數據類型type
手機的Brower則能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW?Action,也能處理http:的type,
3,至于分類Category,一般不要去在Intent中設置它,如果你寫Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,這樣所有不設置Category(Intent.addCategory(String?c);)的Intent都會與這個Category匹配。
4,extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,比如,如果要執行“發送電子郵件”這個動作,可以將電子郵件的標題、正文等保存在extras里,傳給電子郵件發送組件。
?
26.如果后臺的Activity由于某原因被系統回收了,如何在被系統回收之前保存當前狀態?
當你的程序中某一個Activity?A?在運行時中,主動或被動地運行另一個新的Activity?B?
這個時候A會執行
Java代碼
public?void?onSaveInstanceState(Bundle?outState)?{???
? ? ? super.onSaveInstanceState(outState);????
? ? ? outState.putLong("id",?1234567890);
}??
?
B?完成以后又會來找A,?這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回
收的A就要重新調用onCreate()方法,不同于直接啟動的是這回onCreate()里是帶上參數savedInstanceState,沒被收回的就還是onResume就好了。
savedInstanceState是一個Bundle對象,你基本上可以把他理解為系統幫你維護的一個Map對象。在onCreate()里你可能會?用到它,如果正常啟動onCreate就不會有它,所以用的時候要判斷一下是否為空。
Java代碼
if(savedInstanceState?!=?null){??
?????long?id?=?savedInstanceState.getLong("id");??
}??
就像官方的Notepad教程?里的情況,你正在編輯某一個note,突然被中斷,那么就把這個note的id記住,再起來的時候就可以根據這個id去把那個note取出來,程序就完整?一些。這也是看你的應用需不需要保存什么,比如你的界面就是讀取一個列表,那就不需要特殊記住什么,哦,?沒準你需要記住滾動條的位置...
27.如何退出Activity
對于單一Activity的應用來說,退出很簡單,直接finish()即可。當然,也可以用killProcess()和System.exit()這樣的方法。現提供幾個方法,供參考:
1、拋異常強制退出:該方法通過拋異常,使程序Force?Close。驗證可以,但是,需要解決的問題是,如何使程序結束掉,而不彈出Force?Close的窗口。
2、記錄打開的Activity:每打開一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
3、發送特定廣播:在需要結束應用時,發送一個特定的廣播,每個Activity收到廣播后,關閉即可。
4、遞歸退出在打開新的Activity時使用startActivityForResult,然后自己加標志,在onActivityResult中處理,遞歸關閉。除了第一個,都是想辦法把每一個Activity都結束掉,間接達到目的。但是這樣做同樣不完美。你會發現,如果自己的應用程序對每一個Activity都設置了nosensor,在兩個Activity結束的間隙,sensor可能有效了。但至少,我們的目的達到了,而且沒有影響用戶使用。為了編程方便,最好定義一個Activity基類,處理這些共通問題。
28.請解釋下在單線程模型中Message、Handler、Message?Queue、Looper之間的關系。
答:簡單的說,Handler獲取當前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發和處理.
Message Queue(消息隊列):用來存放通過Handler發布的消息,通常附屬于某一個創建它的線程,可以通過Looper.myQueue()得到當前線程的消息隊列
Handler:可以發布或者處理一個消息或者操作一個Runnable,通過Handler發布消息,消息將只會發送到與它關聯的消息隊列,然也只能處理該消息隊列中的消息
Looper:是Handler和消息隊列之間通訊橋梁,程序組件首先通過Handler把消息傳遞給Looper,Looper把消息放入隊列。Looper也把消息隊列里的消息廣播給所有的
Handler:Handler接受到消息后調用handleMessage進行處理
Message:消息的類型,在Handler類中的handleMessage方法中得到單個的消息進行處理
在單線程模型下,為了線程通信問題,Android設計了一個Message Queue(消息隊列), 線程間可以通過該Message Queue并結合Handler和Looper組件進行信息交換。下面將對它們進行分別介紹:
1. Message
????Message消息,理解為線程間交流的信息,處理數據后臺線程需要更新UI,則發送Message內含一些數據給UI線程。
2. Handler
????Handler處理者,是Message的主要處理者,負責Message的發送,Message內容的執行處理。后臺線程就是通過傳進來的 Handler對象引用來sendMessage(Message)。而使用Handler,需要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操作內容,例如Update UI。通常需要子類化Handler來實現handleMessage方法。
3. Message Queue
????Message Queue消息隊列,用來存放通過Handler發布的消息,按照先進先出執行。
??? 每個message queue都會有一個對應的Handler。Handler會向messagequeue通過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾并按先進先出執行。但通過這兩種方法發送的消息執行的方式略有不同:通過sendMessage發送的是一個message對象,會被 Handler的handleMessage()函數處理;而通過post方法發送的是一個runnable對象,則會自己執行。
4. Looper
????Looper是每條線程里的Message Queue的管家。Android沒有Global的MessageQueue,而Android會自動替主線程(UI線程)建立Message Queue,但在子線程里并沒有建立Message Queue。所以調用Looper.getMainLooper()得到的主線程的Looper不為NULL,但調用Looper.myLooper()得到當前線程的Looper就有可能為NULL。對于子線程使用Looper,API Doc提供了正確的使用方法:這個Message機制的大概流程:
??? 1. 在Looper.loop()方法運行開始后,循環地按照接收順序取出Message Queue里面的非NULL的Message。
??? 2. 一開始Message Queue里面的Message都是NULL的。當Handler.sendMessage(Message)到Message Queue,該函數里面設置了那個Message對象的target屬性是當前的Handler對象。隨后Looper取出了那個Message,則調用 該Message的target指向的Hander的dispatchMessage函數對Message進行處理。在dispatchMessage方法里,如何處理Message則由用戶指定,三個判斷,優先級從高到低:
??? 1) Message里面的Callback,一個實現了Runnable接口的對象,其中run函數做處理工作;
??? 2) Handler里面的mCallback指向的一個實現了Callback接口的對象,由其handleMessage進行處理;
??? 3) 處理消息Handler對象對應的類繼承并實現了其中handleMessage函數,通過這個實現的handleMessage函數處理消息。
??? 由此可見,我們實現的handleMessage方法是優先級最低的!
??? 3. Handler處理完該Message (updateUI) 后,Looper則設置該Message為NULL,以便回收!
??? 在網上有很多文章講述主線程和其他子線程如何交互,傳送信息,最終誰來執行處理信息之類的,個人理解是最簡單的方法——判斷Handler對象里面的Looper對象是屬于哪條線程的,則由該線程來執行!
??? 1. 當Handler對象的構造函數的參數為空,則為當前所在線程的Looper;
? ? 2. Looper.getMainLooper()得到的是主線程的Looper對象,Looper.myLooper()得到的是當前線程的Looper對象。
29.你如何評價Android系統?優缺點。
答:Android平臺手機 5大優勢:
一、開放性
在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。開放性對于Android的發展而言,有利于積累人氣,這里的人氣包括消費者和廠商,而對于消費者來講,隨大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。
二、掙脫運營商的束縛
在過去很長的一段時間,特別是在歐美地區,手機應用往往受到運營商制約,使用什么功能接入什么網絡,幾乎都受到運營商的控制。從去年iPhone 上市 ,用戶可以更加方便地連接網絡,運營商的制約減少。隨著EDGE、HSDPA這些2G至3G移動網絡的逐步過渡和提升,手機隨意接入網絡已不是運營商口中的笑談,當你可以通過手機IM軟件方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是不是像噩夢一樣?互聯網巨頭Google推動的Android終端天生就有網絡特色,將讓用戶離互聯網更近。
三、豐富的硬件選擇
這一點還是與Android平臺的開放性相關,由于Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到數據同步、甚至軟件的兼容,好比你從諾基亞 Symbian風格手機 一下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟件帶到iPhone上使用、聯系人等資料更是可以方便地轉移,是不是非常方便呢?
四、不受任何限制的開發商
Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別致的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如可控制正是留給Android難題之一。
五、無縫結合的Google應用
如今叱詫互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成為連接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。
再說Android的5大不足:
一、安全和隱私
由于手機 與互聯網的緊密聯系,個人隱私很難得到保守。除了上網過程中經意或不經意留下的個人足跡,Google這個巨人也時時站在你的身后,洞穿一切,因此,互聯網的深入將會帶來新一輪的隱私危機。
二、首先開賣Android手機的不是最大運營商
眾所周知,T-Mobile在23日,于美國紐約發布 了Android首款手機G1。但是在北美市場,最大的兩家運營商乃AT&T和Verizon,而目前所知取得Android手機銷售權的僅有 T-Mobile和Sprint,其中T-Mobile的3G網絡相對于其他三家也要遜色不少,因此,用戶可以買賬購買G1,能否體驗到最佳的3G網絡服務則要另當別論了!
三、運營商仍然能夠影響到Android手機
在國內市場,不少用戶對購得移動定制機不滿,感覺所購的手機被人涂畫了廣告一般。這樣的情況在國外市場同樣出現。Android手機的另一發售運營商Sprint就將在其機型中內置其手機商店程序。
四、同類機型用戶減少
在不少手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,并分享軟件資源。而對于Android平臺手機,由于廠商豐富,產品類型多樣,這樣使用同一款機型的用戶越來越少,缺少統一機型的程序強化。舉個稍顯不當的例子,現在山寨機泛濫,品種各異,就很少有專門針對某個型號山寨機的討論和群組,除了哪些功能異常搶眼、頗受追捧的機型以外。
五、過分依賴開發商缺少標準配置
在使用PC端的Windows Xp系統的時候,都會內置微軟Windows Media Player這樣一個播放器程序,用戶可以選擇更多樣的播放器,如Realplay或暴風影音等。但入手開始使用默認的程序同樣可以應付多樣的需要。在Android平臺中,由于其開放性,軟件更多依賴第三方廠商,比如Android系統的SDK中就沒有內置音樂 播放器,全部依賴第三方開發,缺少了產品的統一性。
30.談談android數據存儲方式。
Android提供了5種方式存儲數據:
(1)使用SharedPreferences存儲數據;它是Android提供的用來存儲一些簡單配置信息的一種機制,采用了XML格式將數據存儲到設備中。只能在同一個包內使用,不能在不同的包之間使用。
(2)文件存儲數據;文件存儲方式是一種較常用的方法,在Android中讀取/寫入文件的方法,與Java中實現I/O的程序是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取設備上的文件。
(3)SQLite數據庫存儲數據;SQLite是Android所帶的一個標準的數據庫,它支持SQL語句,它是一個輕量級的嵌入式數據庫。
(4)使用ContentProvider存儲數據;主要用于應用程序之間進行數據交換,從而能夠讓其他的應用保存或讀取此Content?Provider的各種數據類型。
(5)網絡存儲數據;通過網絡上提供給我們的存儲空間來上傳(存儲)和下載(獲取)我們存儲在網絡空間中的數據信息。
31.?Android中Activity,?Intent,?Content?Provider,?Service各有什么區別。
Activity:?活動,是最基本的android應用程序組件。一個活動就是一個用戶可以操作的可視化用戶界面,每一個活動都被實現為一個獨立的類,并且從活動基類繼承而來。
Intent:?意圖,描述應用想干什么。最重要的部分是動作和動作對應的數據。
Content?Provider:內容提供器,android應用程序能夠將它們的數據保存到文件、SQLite數據庫中,甚至是任何有效的設備中。當你想將你的應用數據和其他應用共享時,內容提供器就可以發揮作用了。
Service:服務,具有一段較長生命周期且沒有用戶界面的程序組件。
32.View,?surfaceView,?GLSurfaceView有什么區別。
view是最基礎的,必須在UI主線程內更新畫面,速度較慢。
SurfaceView?是view的子類,類似使用雙緩機制,在新的線程中更新畫面所以刷新界面速度比view快
GLSurfaceView?是SurfaceView的子類,opengl?專用的
33.Manifest.xml文件中主要包括哪些信息?
manifest:根節點,描述了package中所有的內容。
uses-permission:請求你的package正常運作所需賦予的安全許可。
permission:?聲明了安全許可來限制哪些程序能你package中的組件和功能。
instrumentation:聲明了用來測試此package或其他package指令組件的代碼。
application:包含package中application級別組件聲明的根節點。
activity:Activity是用來與用戶交互的主要工具。
receiver:IntentReceiver能使的application獲得數據的改變或者發生的操作,即使它當前不在運行。
service:Service是能在后臺運行任意時間的組件。
provider:ContentProvider是用來管理持久化數據并發布給其他應用程序使用的組件。
34.根據自己的理解描述下Android數字簽名。
(1)所有的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序
(2)Android程序包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證
(3)如果要正式發布一個Android程序,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。
(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候才會檢查證書的有效期。如果程序已經安裝在系統中,即使證書過期也不會影響程序的正常功能。
35.?AIDL的全稱是什么?如何工作?能處理哪些類型的數據?
AIDL全稱Android?Interface?Definition?Language(Android接口描述語言)是一種借口描述語言;?編譯器可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程跨界對象訪問的目的.AIDL的IPC的機制和COM或CORBA類似,?是基于接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值.?如果要使用AIDL,?需要完成2件事情:?1.?引入AIDL的相關類.;?2.?調用aidl產生的class.理論上,?參數可以傳遞基本數據類型和String,?還有就是Bundle的派生類,?不過在Eclipse中,目前的ADT不支持Bundle做為參數,
具體實現步驟如下:
1、創建AIDL文件,?在這個文件里面定義接口,?該接口定義了可供客戶端訪問的方法和屬性。
2、編譯AIDL文件,?用Ant的話,?可能需要手動,?使用Eclipse?plugin的話,可以根據adil文件自動生產java文件并編譯,?不需要人為介入.
3、在Java文件中,?實現AIDL中定義的接口.?編譯器會根據AIDL接口,?產生一個JAVA接口。這個接口有一個名為Stub的內部抽象類,它繼承擴展了接口并實現了遠程調用需要的幾個方法。接下來就需要自己去實現自定義的幾個接口了.
4、向客戶端提供接口ITaskBinder,?如果寫的是service,擴展該Service并重載onBind?()方法來返回一個實現上述接口的類的實例。
5、在服務器端回調客戶端的函數.?前提是當客戶端獲取的IBinder接口的時候,要去注冊回調函數,?只有這樣,?服務器端才知道該調用那些函數
AIDL語法很簡單,可以用來聲明一個帶一個或多個方法的接口,也可以傳遞參數和返回值。?由于遠程調用的需要,?這些參數和返回值并不是任何類型.下面是些AIDL支持的數據類型:
1.?不需要import聲明的簡單Java編程語言類型(int,boolean等)
2.?String,?CharSequence不需要特殊聲明
3.?List,?Map和Parcelables類型,?這些類型內所包含的數據成員也只能是簡單數據類型,?String等其他比支持的類型.
(另外:?我沒嘗試Parcelables,?在Eclipse+ADT下編譯不過,?或許以后會有所支持).
實現接口時有幾個原則:
.拋出的異常不要返回給調用者.?跨進程拋異常處理是不可取的.
.IPC調用是同步的。如果你知道一個IPC服務需要超過幾毫秒的時間才能完成地話,你應該避免在Activity的主線程中調用。也就是IPC調用會掛起應用程序導致界面失去響應.?這種情況應該考慮單起一個線程來處理.
.不能在AIDL接口中聲明靜態屬性。
IPC的調用步驟:
1.?聲明一個接口類型的變量,該接口類型在.aidl文件中定義。
2.?實現ServiceConnection。
3.?調用ApplicationContext.bindService(),并在ServiceConnection實現中進行傳遞.
4.?在ServiceConnection.onServiceConnected()實現中,你會接收一個IBinder實例(被調用的Service).?調用
YourInterfaceName.Stub.asInterface((IBinder)service)將參數轉換為YourInterface類型。
5.?調用接口中定義的方法。你總要檢測到DeadObjectException異常,該異常在連接斷開時被拋出。它只會被遠程方法拋出。
6.?斷開連接,調用接口實例中的ApplicationContext.unbindService()
參考:http://buaadallas.blog.51cto.com/399160/372090
36.android:gravity與android:layout_gravity的區別
LinearLayout有兩個非常相似的屬性:android:gravity與android:layout_gravity。他們的區別在?于:android:gravity用于設置View組件的對齊方式,而android:layout_gravity用于設置Container組件的?對齊方式。
舉個例子,我們可以通過設置android:gravity="center"來讓EditText中的文字在EditText組件中居中顯示;同?時我們設置EditText的android:layout_gravity="right"來讓EditText組件在LinearLayout中居右 顯示。來實踐以下:
正如我們所看到的,在EditText中,其中的文字已經居中顯示了,而EditText組件自己也對齊到了LinearLayout的右側。
[html]?view plaincopy
38.?注冊廣播接收者兩種方式的區別,及優缺點
答:首先寫一個類要繼承BroadcastReceiver
第一種:在清單文件中聲明,添加
<receiveandroid:name=".IncomingSMSReceiver " >
<intent-filter>
?? <actionandroid:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
第二種使用代碼進行注冊如:
IntentFilterfilter =? newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiverreceiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);
兩種注冊類型的區別是:
1)第一種是常駐型(靜態注冊),也就是說當應用程序關閉后,如果有信息廣播來,程序也會被系統調用自動運行。
2)第二種不是常駐型廣播(動態注冊),也就是說廣播跟隨程序的生命周期。
注冊的方法有兩種,一種是靜態注冊,一種是動態注冊。
動態注冊優點:在 Android 的廣播機制中,動態注冊的優先級是要高于靜態注冊優先級的,因此在必要的情況下,我們是需要動態注冊廣播接收器的。
39.Dalvik基于JVM的改進
1.幾個class變為一個dex,constant?pool,省內存
2.Zygote,copy-on-write?shared,省內存,省cpu,省電
3.基于寄存器的bytecode,省指令,省cpu,省電
4.Trace-based?JIT,省cpu,省電,省內存
40.android中有哪幾種解析xml的類,官方推薦哪種?以及它們的原理和區別.
??DOM解析
????優點:
1.XML樹在內存中完整存儲,因此可以直接修改其數據和結構.?
2.可以通過該解析器隨時訪問XML樹中的任何一個節點.?
3.DOM解析器的API在使用上也相對比較簡單.
缺點:如果XML文檔體積比較大時,將文檔讀入內存是非常消耗系統資源的.
使用場景:DOM?是用與平臺和語言無關的方式表示?XML?文檔的官方?W3C?標準.DOM?是以層次結構組織的節點的集合.這個層次結構允許開發人員在樹中尋找特定信息.分析該結構通常需要加載整個文檔和構造層次結構,然后才能進行任何工作.DOM是基于對象層次結構的.
??SAX解析
優點:
SAX?對內存的要求比較低,因為它讓開發人員自己來決定所要處理的標簽.特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX?這種擴展能力得到了更好的體現.
缺點:
用SAX方式進行XML解析時,需要順序執行,所以很難訪問到同一文檔中的不同數據.此外,在基于該方式的解析編碼過程也相對復雜.
使用場景:
對于含有數據量十分巨大,而又不用對文檔的所有數據進行遍歷或者分析的時候,使用該方法十分有效.該方法不用將整個文檔讀入內存,而只需讀取到程序所需的文檔標簽處即可.
??Xmlpull解析
android?SDK提供了xmlpull?api,xmlpull和sax類似,是基于流(stream)操作文件,然后根據節點事件回調開發者編寫的處理程序.因為是基于流的處理,因此xmlpull和sax都比較節約內存資源,不會象dom那樣要把所有節點以對橡樹的形式展現在內存中.xmlpull比sax更簡明,而且不需要掃描完整個流.
41.Android系統中GC什么情況下會出現內存泄露呢?
出現情況:
1.?數據庫的cursor沒有關閉
2.構造adapter時,沒有使用緩存contentview
???衍生listview的優化問題-----減少創建view的對象,充分使用contentview,可以使用一靜態類來優化處理getview的過程
3.Bitmap對象不使用時采用recycle()釋放內存
4.activity中的對象的生命周期大于activity
調試方法:?DDMS==>?HEAPSZIE==>dataobject==>[Total?Size]
42.談談對Android?NDK的理解
NDK全稱:Native Development Kit。 1、NDK是一系列工具的集合。 * NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,并能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。 * NDK集成了 交叉編譯器 ,并提供了相應的mk文件隔離CPU、平臺、ABI等差異,開發人員只需要簡單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創建出so。 * NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。 2、NDK提供了一份穩定、功能有限的API頭文件聲明。 Google明確聲明該API是穩定的,在后續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標準庫(libc)、標準數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。
1,雙緩沖技術原理以及優缺點:
創建一幅后臺圖像,將每一幀畫入圖像,然后調用drawImage()方法將整個后臺圖像一次畫到屏幕上去。
優點:雙緩沖技術的優點在于大部分繪制是離屏的。
? ? ? ? ? ? 將離屏圖像一次繪至屏幕上,比直接在屏幕上繪制要有效得多。
? ? ? ? ? ? 雙緩沖技術可以使動畫平滑。
缺點:要分配一個后臺圖像的緩沖,如果圖像相當大,這將占用很大一塊內存。
2,AsyncTask簡介
在開發Android移動客戶端的時候往往要使用多線程來進行操作,我們通常會將耗時的操作放在單獨的線程執行,避免其占用主線程而給用戶帶來不好的用戶體驗。但是在子線程中無法去操作主線程(UI 線程),在子線程中操作UI線程會出現錯誤。因此android提供了一個類Handler來在子線程中來更新UI線程,用發消息的機制更新UI界面,呈現給用戶。這樣就解決了子線程更新UI的問題。但是費時的任務操作總會啟動一些匿名的子線程,太多的子線程給系統帶來巨大的負擔,隨之帶來一些性能問題。因此android提供了一個工具類AsyncTask,顧名思義異步執行任務。這個AsyncTask生來就是處理一些后臺的比較耗時的任務,給用戶帶來良好用戶體驗的,從編程的語法上顯得優雅了許多,不再需要子線程和Handler就可以完成異步操作并且刷新用戶界面。
3,Socket通信編程
客戶端編程步驟:
1、?創建客戶端套接字(指定服務器端IP地址與端口號)
2、?連接(Android?創建Socket時會自動連接)
3、?與服務器端進行通信
4、?關閉套接字
服務器端:
1.創建一個ServerSocket,用于監聽客戶端Socket的連接請求
2.采用循環不斷接受來自客戶端的請求
3.每當接受到客戶端Socket的請求,服務器端也對應產生一個Socket
總結
以上是生活随笔為你收集整理的android面试题总结加强的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 面试精华题目总结
- 下一篇: android最全面试题71道题 详解