編輯:關於Android編程
1.什麼是Service以及描述下它的生命周期。Service有哪些啟動方法,有什麼區別,怎樣停用Service?
Android Service是運行在後台的代碼,不能與用戶交互,可以運行在自己的進程,也可以運行在其他應用程序進程的上下文裡。
需要通過某一個Activity或者Context對象來調用。Service有兩個啟動方法,分別是Context.startService()和Context.bindService()。如果在Service執行耗時的操作需要啟動一個新線程來執行。
Android Service只繼承了onCreate(), onStart(),onDestroy()三個方法,當我們第一次啟動Service時,先後調用onCreate(), onStart()這兩個方法,當停止Service時,則執行onDestroy()方法時。如果Service已經啟動了,當我們再次啟動Service時,不會再執行onCreate()方法,而是直接執行onStart()方法。
2.Error與Exception的區別
Error一般是指恢復不是不可能但是很困難的情況下的一張嚴重問題,比如內存溢出,不可能是指指望程序能處理這樣的情況。
Exception是指程序的設計或實現問題,一般是比較容易恢復的,如果程序運行正常是不會出現在這樣的錯誤的。
3.接口與抽象類的區別
接口是公開的,裡面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量的,另外,實現接口的一定要實現接口裡定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是接口,然後是抽象類實現接口,最後才到具體類實現。還有,接口可以實現多重繼承,而一個類只能繼承一個超類,但可以通過繼承多個接口實現多重繼承,接口還有標識(裡面沒有任何方法,如Remote接口)和數據共享(裡面的變量全是常量)的作用.
3.Get和Post的區別
1.get是從服務器上獲取數據,post是向服務器傳送數據;
2.對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.From獲取提交的數據。
3.get安全性較低,post安全性較好,但是get的執行效率比post方式要好;
4.get傳送的數據量較小,而post傳送的數據量較大;
4.Activity的生命周期
相信不少朋友也已經看過這個流程圖了,也基本了解了Activity生命周期的幾個過程,我們就來說一說這幾個過程。
1.啟動Activity:系統會先調用onCreate方法,然後調用onStart方法,最後調用onResume,Activity進入運行狀態。
2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。
3.當前Activity由被覆蓋狀態回到前台或解鎖屏:系統會調用onResume方法,再次進入運行狀態。
4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居後台:系統會先調用onPause方法,然後調用onStop方法,進入停滯狀態。
5.用戶後退回到此Activity:系統會先調用onRestart方法,然後調用onStart方法,最後調用onResume方法,再次進入運行狀態。
6.當前Activity處於被覆蓋狀態或者後台不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,而後用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。
7.用戶退出當前Activity:系統先調用onPause方法,然後調用onStop方法,最後調用onDestory方法,結束當前Activity。
但是知道這些還不夠,我們必須親自試驗一下才能深刻體會,融會貫通。
下面是一張經典的Activity生命周期圖
5.簡單描述一下你對service的理解
service與activity的地位是並列的,它代表一個單獨的安卓組件。service與activity的區別在與:service通常位於後台運行,它一般不需要與用戶交互,因此service組件沒有圖形用戶界面。
與activity組件需要繼承Activity基類相似,service組件需要繼承service基類。一個service組件被運行起來後,它將擁有自己獨立的生命周期,service組件通常用於為其他的組件提供後台服務或監控其他組件的運行狀態。
6.handler機制的原理
andriod提供了Handler 和 Looper 來滿足線程間的通信。Handler先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(MessageExchange)。
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裡的MessageQueue(消息隊列)。
2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到MessageQueue裡;或者接收Looper從Message Queue取出)所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UIthread 通常就是main thread,而Android啟動程序時會替它建立一個MessageQueue。
7.說說mvc模式的原理,它在android中的運用
MVC(Model_view_contraller)”模型_視圖_控制器”。 MVC應用程序總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要Controller改變了Models的數據或者屬性,所有依賴的View都會自動更新。
8.請解釋下在單線程模型中Message、Handler、MessageQueue、Looper之間的關系。
Handler簡介:
一個Handler允許你發送和處理Message和Runable對象,這些對象和一個線程的MessageQueue相關聯。每一個線程實例和一個單獨的線程以及該線程的MessageQueue相關聯。當你創建一個新的Handler時,它就和創建它的線程綁定在一起了。這裡,線程我們也可以理解為線程的MessageQueue。從這一點上來看,Handler把Message和Runable對象傳遞給MessageQueue,而且在這些對象離開MessageQueue時,Handler負責執行他們。
Handler有兩個主要的用途:(1)確定在將來的某個時間點執行一個或者一些Message和Runnable對象。(2)在其他線程(不是Handler綁定線程)中排入一些要執行的動作。
Scheduling Message,即(1),可以通過以下方法完成:
post(Runnable):Runnable在handler綁定的線程上執行,也就是說不創建新線程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post這個動作讓你把Runnable對象排入MessageQueue,MessageQueue受到這些消息的時候執行他們,當然以一定的排序。sendMessage這個動作允許你把Message對象排成隊列,這些Message對象包含一些信息,Handler的hanlerMessage(Message)會處理這些Message.當然,handlerMessage(Message)必須由Handler的子類來重寫。這是編程人員需要作的事。
當posting或者sending到一個Hanler時,你可以有三種行為:當MessageQueue准備好就處理,定義一個延遲時間,定義一個精確的時間去處理。後兩者允許你實現timeout,tick,和基於時間的行為。
當你的應用創建一個新的進程時,主線程(也就是UI線程)自帶一個MessageQueue,這個MessageQueue管理頂層的應用對象(像activities,broadcast receivers等)和主線程創建的窗體。你可以創建自己的線程,並通過一個Handler和主線程進行通信。這和之前一樣,通過post和sendmessage來完成,差別在於在哪一個線程中執行這麼方法。在恰當的時候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。
Message簡介:
Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域,這可以讓你在大多數情況下不用作分配的動作。
盡管Message的構造函數是public的,但是獲取Message實例的最好方法是調用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收對象池中獲取一個。
MessageQueue簡介:
這是一個包含message列表的底層類。Looper負責分發這些message。Messages並不是直接加到一個MessageQueue中,而是通過MessageQueue.IdleHandler關聯到Looper。
你可以通過Looper.myQueue()從當前線程中獲取MessageQueue。
Looper簡介:
Looper類被用來執行一個線程中的message循環。默認情況,沒有一個消息循環關聯到線程。在線程中調用prepare()創建一個Looper,然後用loop()來處理messages,直到循環終止。
大多數和message loop的交互是通過Handler。
下面是一個典型的帶有Looper的線程實現。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public voidhandleMessage(Message msg) {
// process incomingmessages here
}
};
Looper.loop();
}
}
9.簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver
答:一個activity呈現了一個用戶可以操作的可視化用戶界面
一個service不包含可見的用戶界面,而是在後台無限地運行
可以連接到一個正在運行的服務中,連接後,可以通過服務中暴露出來的借口與其進行通信
一個broadcast receiver是一個接收廣播消息並作出回應的component,broadcastreceiver沒有界面
intent:content provider在接收到ContentResolver的請求時被激活。
activity, service和broadcast receiver是被稱為intents的異步消息激活的。
一個intent是一個Intent對象,它保存了消息的內容。對於activity和service來說,它指定了請求的操作名稱和待操作數據的URI
Intent對象可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基於manifest文件中的聲明)並激活它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component。
它是通過將Intent對象和目標的intent filter相比較來完成這一工作的。一個component的intent filter告訴android該component能處理的intent。intent filter也是在manifest文件中聲明的。
10.handler機制的原理
andriod提供了Handler 和 Looper 來滿足線程間的通信。Handler先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(MessageExchange)。
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裡的MessageQueue(消息隊列)。
2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到MessageQueue裡;或者接收Looper從Message Queue取出)所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UIthread 通常就是main thread,而Android啟動程序時會替它建立一個MessageQueue。
11.簡述Android應用程序的組成
(1)Activites 應用程序的表示層。
應用程序的每個界面都將是Activity類的擴展。Acitvities用視圖(View)構成GUI來顯示信息、響應用戶操作。就桌面開發而言,一個活動(Activity)相當於一個窗體(Form)。
(2)Services 應用程序中的隱形工作者。
Service組件在後台運行,更新你的數據源和可見的Activities,觸發通知(Notification)。在應用程序的Activities不激活或不可見時,用於執行依然需要繼續的長期處理。
(3)Content Providers 可共享的數據存儲。
Content Providers用於管理和共享應用程序數據庫。是跨應用程序邊界數據共享的優先方式。
(4)Intents 一個應用程序間(inter-application)的消息傳遞框架。
使用Intents你可以在系統范圍內廣播消息或者對一個目標Activity或Service發送消息,來表示你要執行一個動作。
(5)Widgets 可以添加到主屏幕界面(home screen)的可視應用程序組件。
作為Broadcase Receiver的特殊變種,widgets讓你可以為用戶創建可嵌入到主屏幕界面的動態的、交互的應用程序組件。
12.基礎變量與引用變量的存放
1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制.
2. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)
3. 堆:存放所有new出來的對象。
4. 靜態域:存放靜態成員(static定義的)
5. 常量池:存放字符串常量和基本類型常量(public static final)。
6. 非RAM存儲:硬盤等永久存儲空間
13.Android中listview出現卡頓的原因
1..Adapter的getView方法裡面convertView沒有使用setTag和getTag方式;
2.在getView方法裡面ViewHolder初始化後的賦值或者是多個控件的顯示狀態和背景的顯示沒有優化好,抑或是裡面含有復雜的計算和耗時操作;
3.在getView方法裡面 inflate的row 嵌套太深(布局過於復雜)或者是布局裡面有大圖片或者背景所致;
4.Adapter多余或者不合理的notifySetDataChanged;
5.listview 被多層嵌套,多次的onMessure導致卡頓,如果多層嵌套無法避免,建議把listview的高和寬設置為fill_parent. 如果是代碼繼承的listview,那麼也請你別忘記為你的繼承類添加上LayoutPrams,注意高和寬都是fill_parent的;
14.左連接與右連接的區別
左連接是已左邊表中的數據為基准,若左表有數據右表沒有數據,則顯示左表中的數據右表中的數據顯示為空。
左聯接的結果集包括 LEFT 子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。
右聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
例子:
A表(a1,b1,c1) B表(a2,b2)
a1 b1 c1 a2 b2
01 數學 95 01 張三
02 語文 90 02 李四
03 英語 80 04 王五
select A.*,B.* from A
left outer join B on(A.a1=B.a2)
結果是:
a1 b1 c1 a2 b2
01 數學 95 01 張三
02 語文 90 02 李四
03 英語 80 NULL NULL
select A.*,B.* from A
right outer join B on(A.a1=B.a2)
結果是:
a1 b1 c1 a2 b2
01 數學 95 01 張三
02 語文 90 02 李四
NULL NULL NULL 04 王五
15.HashMap和Hashtable的區別是什麼?
HashMap:非線程安全,高效,支持null;Hashtable:線程安全,低效,不支持null;
16.List set map的區別是什麼?
list、set繼承collection接口,而map不是;
Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同key,每個key只能映射一個value。Map接口提供3種集合的視圖,Map的內容可以被當做一組key集合,一組value集合,或者一組key-value映射。(Map接口有三個實現類:HashMap,HashTable,LinkeHashMap)
List接口有三個實現類:LinkedList,ArrayList,Vector
ArrayList和Vector的區別:ArrayList是非線程安全的,效率高;Vector是基於線程安全的,效率低
list:有放入順序,元素可重復;
set :無放入順序,元素不可重復;
map:無放入順序,元素按鍵值對存儲;
17.什麼是嵌入式系統?
嵌入式系統是指當外部數據或事件產生時能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並且控制所有實時任務協調一致運行的系統。
18.MVC模式是什麼,有何優缺點?
MVC指的是模型、視圖、控制器,一般MVC應用程序都是由這三個部分組成,事件導致控制器改變模型或視圖,或者同時改變兩者,控制器改變模型的數據或屬性後,所有依賴的視圖都會自動更新數據,同樣,控制器改變視圖,視圖也會從隱藏的模型中獲取最新的數據。
優點:
1、開發人員可以只關注整個結構中的其中某一層;
2、可以很容易的用新的實現來替換原有層次的實現;
3、可以降低層與層之間的依賴;
4、有利於標准化;
5、利於各層邏輯的復用。
缺點:
1.降低了整體的性能;
2.有時會導致級聯的修改;
在看android基礎的時候,關於網絡操作一般都會介紹HttpClient以及HttpConnection這兩個包。前者是apache的開源庫,後者是android自帶的
Fragment 的出現一方面是為了緩解 Activity 任務過重的問題,另一方面是為了處理在不同屏幕上 UI 組件的布局問題,而且它還提供了一些新的特性(例如 Ret
主要內容1. Call涉及的目錄結構及框架結構2. InCallUI層的基本架構(所涉及的Presenter、Fragment及Activity)3. Call的幾種狀態
Android日常開發中,對於下拉與上拉刷新控件的使用非常之頻繁。一般都會采用第三方庫,但是下拉刷新做到簡單優雅並不是太多,甚至有的兼容性都存在問題。這個是不能接受的。最