錄
1.怎么實現(xiàn)通知欄到聊天界面的跳轉(zhuǎn) 3
2.聊天界面左右分隔怎么實現(xiàn),怎么實現(xiàn)優(yōu)化使其不出現(xiàn)錯位 3
3.視頻,音頻的上傳 3
4.http協(xié)議和soap協(xié)議的區(qū)別 3
5.http和https的區(qū)別 4
6.listview的逐行顯示 5
7.edittext中文字的下劃線效果 5
8.activity以及service的生命周期 5
9.安卓系統(tǒng)的理解,優(yōu)缺點 5
10.sim卡EF文件是什么 6
11.四大組件哪些能動態(tài)注冊 6
12.安卓文件存儲方式 6
13.intent的功能,如何定義顯示intent,隱式intent? 6
14.內(nèi)存泄露遇見過哪些問題,解決辦法,回收的算法 7
15.接口和抽象類的區(qū)別? 7
16.string和stringbuffer和stringbuilder區(qū)別? 7
17.html5? 7
18.自定義一個不帶系統(tǒng)邊框的Dialog? 7
19.定義一個跑馬燈效果的textview? 7
20.圖片的異步加載的方法? 8
- 瀑布流實現(xiàn)方式? 8
- 把一張?zhí)貏e大的圖片,分成幾十張小的圖片,在最短的時間內(nèi)給處理? 8
- Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個概念? 8
- 嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,各有何特性 ? 9
- 什么是嵌入式實時操作系統(tǒng), Android 操作系統(tǒng)屬于實時操作系統(tǒng)嗎? 9
26.一條最長的短信息約占多少byte? 9 - android中的動畫有哪幾類,它們的特點和區(qū)別是什么? 9
28.handler機(jī)制的原理,looper通過什么方法開始的? 9
29.說說mvc模式的原理,在android中的運(yùn)用? 10
30.如何讓Activity變成一個窗口? 10
31.后臺的Activity被系統(tǒng)回收怎么辦? 10
32.ListView優(yōu)化? 10
33.IPC及其原理? 10
34.View如何刷新? 11
35.DDMS與TraceView的區(qū)別? 11
36.在Java中如何引入C語言? 11
37.鏈表和數(shù)組的區(qū)別? 11 - Hash表是什么?有什么用? 12
- 什么是鎖?有什么用?有哪些鎖?為什么需要鎖? 12
41.MVC作用? 12
42.px,dp,sp區(qū)別? 13
43.android 系統(tǒng)架構(gòu),按順序? 13
44.android有幾種布局,有什么特點? 13
45.常用的設(shè)計模式? 14
46.常用的排序法? 14
47.寫一個快速排序法? 14
48.synchronized 是什么?有什么用? 15
49.線程的狀態(tài)? 16
50.onSaveInstanceState() 和 onRestoreInstanceState(); 16
51.了解版本控制的工具嗎? 16
52.github git都是啥? 16
53.git svn 區(qū)別? 16
54.舉個簡單的socket編程 16
55.怎樣用數(shù)據(jù)庫語句實現(xiàn)分頁 18
56.怎樣實現(xiàn)自定義View 18
57.json的上限是多少(大小) 18
58.afinal框架和xUtils框架的區(qū)別 18
59.listView上拉加載監(jiān)聽 18
60.JSON/XML的區(qū)別 19
61.JNI怎樣用 19
62.廣播的兩種注冊方式 19
63.android中Serializable和Parcelable的聯(lián)系? 19
64.一個應(yīng)用中有多少個Context? 20
65.AsyncTask與使用線程處理耗時操作的優(yōu)劣是? 20
66.談?wù)勀銓ndroid事件分發(fā)機(jī)制的理解? 20
67.談?wù)勀銓YGOTE進(jìn)程的理解和認(rèn)識? 20
68.第三方注冊及登陸怎么實現(xiàn)的? 21
69.Fragment怎么實現(xiàn)的? 22
70.緩存怎么實現(xiàn)的? 22
71.解析XML PULL解析? 22
72.分享用的什么平臺? 22
73.橫豎屏切換 22 - 高并發(fā)業(yè)務(wù)請求處理方法 23
75.Android中如何設(shè)置兩個應(yīng)用程序為同一個進(jìn)程? 23
76.手機(jī)適配怎么做? 24 - 手機(jī)測試包括哪些? 24
78.Http中g(shù)et和post的區(qū)別? 25
79.側(cè)滑怎么實現(xiàn)的? 25
80.UDP和TCP的區(qū)別? 25
81.雙緩存怎么實現(xiàn)的? 25
82.垃圾收集算法的核心思想 26
83.觸發(fā)主GC(Garbage Collector)的條件 26
84.減少GC開銷的措施 26
85.gc與finalize方法 26
86.ViewPager如何實現(xiàn)? 26
87.請說出使用equal和==比較對象時的區(qū)別? 26
88.什么是Java序列化和反序列話,如何實現(xiàn)Java序列化? 27
89.請解釋下android程序運(yùn)行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別? 27
90.講一講overload和override的區(qū)別,overloaded的方法是否可以改變返回值的類型? 27
91.如何使用socket實現(xiàn)TCP點對點通信? 27
92.請簡述service可能被kill的場景,kill之后如何自啟? 27
93.請使用遞歸方式來遍歷盤下的所有文件,并計算出所有圖片文件的數(shù)量? 27
94.現(xiàn)有兩個單向鏈表,我想知道這兩個鏈表的相交情況税手。(可以不寫實現(xiàn),但思路必須寫清)? 28
95.使用javac/c++寫一段程序,找出數(shù)組中出現(xiàn)次數(shù)最多數(shù)字,并輸出出現(xiàn)次數(shù),請標(biāo)明算法的時間復(fù)雜值? 29
96.什么是OAuth,Oauth,的角色,Qauth驗證流程? 30
97.使用javac/c++寫一段程序,找出數(shù)組中第K大小的數(shù),輸出數(shù)所在的位置,請標(biāo)明算法的時間復(fù)雜度? 30
98.進(jìn)程通信和線程同步的方法? 31
99.面向?qū)ο蟮奶卣饔心男┓矫? 31
100.Context里面主要包括什么具體的東西? 32
101.簡述條形碼的掃描設(shè)計思路? 32 - ListView異步加載圖片實現(xiàn)思路(優(yōu)化篇) 32
- android下大文件分割上傳 39
- android listview 異步加載圖片并防止錯位 42
1.怎么實現(xiàn)通知欄到聊天界面的跳轉(zhuǎn)
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); //這樣可以清掉所有歷史activity
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
new一個新的Intent然后用上述方法即可實現(xiàn)跳轉(zhuǎn)。
2.聊天界面左右分隔怎么實現(xiàn),怎么實現(xiàn)優(yōu)化使其不出現(xiàn)錯位
我們可以在adapter里對消息的發(fā)放者進(jìn)行判斷,如果不是本人發(fā)送的那就設(shè)置靠左,否則設(shè)置靠右,具體實現(xiàn)如下:
封裝消息實體類時,將消息的發(fā)送者類型作為Boolean類型存入。在適配數(shù)據(jù)時,準(zhǔn)備兩種item_layout布局文件,一種用于別人的信息展示,另一種用于自己的信息吉殃。getView方法加載布局文件之前對消息的發(fā)放者進(jìn)行判斷,如果是本人發(fā)送,則加載靠右的布局,否則則使用靠左的布局文件,從而實現(xiàn)動態(tài)的位置改變
3.視頻,音頻的上傳
Android的視頻音頻上傳主要就是通過java的socket來進(jìn)行與服務(wù)器的交流,socket通信可以指定一個服務(wù)器的地址,然后可以通過io流實現(xiàn)視頻音頻的上傳仓犬。
4.http協(xié)議和soap協(xié)議的區(qū)別
HTTP(超文本傳輸協(xié)議)是利用TCP在兩臺電腦(通常是Web服務(wù)器和客戶端)之間傳輸信息的協(xié)議修噪∏K兀客戶端使用Web瀏覽器發(fā)起HTTP請求給Web服務(wù)器,Web服務(wù)器發(fā)送被請求的信息給客戶端劫乱。
SOAP(Simple Object Access Protocal,簡單對象訪問協(xié)議) 技術(shù)有助于實現(xiàn)大量異構(gòu)程序和平臺之間的互操作性,根據(jù)我有限的了解,SOAP是把成熟的基于HTTP的WEB技術(shù)與XML的靈活性和可擴(kuò)展性組合在了一起膊畴。比如我們.NET中的WEB服務(wù),就是基于SOAP掘猿。
簡單對象訪問協(xié)議(SOAP)是W3C組織的一個Note, 它描述了一種在分散的或分布式的環(huán)境中如何交換信息的輕量級協(xié)議。SOAP是一個基于XML的協(xié)議,它包括三個部分:SOAP封裝(Envelop),封裝定義了一個描述消息中的內(nèi)容是什么,是誰發(fā)送的,誰應(yīng)當(dāng)接受并處理它以及如何處理它們的框架;SOAP編碼規(guī)則(Encoding Rules),用于表示應(yīng)用程序需要使用的數(shù)據(jù)類型的實例;SOAP RPC表示(RPC Representation),表示遠(yuǎn)程過程調(diào)用和應(yīng)答的協(xié)定;SOAP可以和多種傳輸協(xié)議綁定(Binding),使用底層協(xié)議交換信息唇跨。在這個文檔中,目前只定義了SOAP如何和HTTP以及HTTP擴(kuò)展進(jìn)行綁定的框架稠通。
SOAP是個通信協(xié)議, SOAP在HTTP協(xié)議的基礎(chǔ)上,把編寫成XML的REQUEST參數(shù), 放在HTTP BODY上提交個WEB SERVICE服務(wù)器(SERVLET,ASP什么的) 處理完成后,結(jié)果也寫成XML作為RESPONSE送回用戶端, 為了使用戶端和WEB SERVICE可以相互對應(yīng),可以使用WSDL作為這種通信方式的描述文件,利用WSDL工具可以自動生成WS和用戶端的框架文件,SOAP具備把復(fù)雜對象序列化捆綁到XML里去的能力衬衬。
SOAP的前身是RPC, 就是遠(yuǎn)程呼叫處理的協(xié)議,這個協(xié)議安全性不是很好,多數(shù)防火墻都會阻擋RPC的通信包,而SOAP則使用HTTP協(xié)議作為基本的協(xié)議,使用端口80使得SOAP可以透過防火墻,完成RPC的功能。
SOAP協(xié)議和HTTP協(xié)議一樣,都是底層的通信協(xié)議,只是請求包的格式不同而已,SOAP包是XML格式的,現(xiàn)在我們編寫WEB SERVICE不需要深入理解SOAP也沒關(guān)系改橘。如果SERVICE和CLIENT在同樣的環(huán)境下使用SOAP,由于一般情況下都有自動生成SOAP程序框架的工具,因此不知道細(xì)節(jié)也沒關(guān)系. 可是, 如果CLIENT和SERVICE的環(huán)境不同,比如說JAVA的Client和.NET的SERVICE進(jìn)行通信,或者是VB CLIENT和TOMCAT下的JAVA SERVICE通信,還是要知道一點細(xì)節(jié)為好. 特別是, WSDL或者UDDI都不是標(biāo)準(zhǔn),如果不讓用就只好手工配制SOAP MESSAGE啦滋尉。
5.http和https的區(qū)別
在URL前加https://前綴表明是用SSL加密的。你的電腦與服務(wù)器之間收發(fā)的信息傳輸將更加安全飞主。 Web服務(wù)器啟用SSL需要獲得一個服務(wù)器證書并將該證書與要使用SSL的服務(wù)器綁定狮惜。 http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸碌识、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議
要比http協(xié)議安全
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協(xié)議
它是一個安全通信通道,它基于HTTP開發(fā),用于在客戶計算機(jī)和服務(wù)器之間交換信息碾篡。它使用安全套接字層(SSL)進(jìn)行信息交換,簡單來說它是HTTP的安全版。
它是由Netscape開發(fā)并內(nèi)置于其瀏覽器中,用于對數(shù)據(jù)進(jìn)行壓縮和解壓操作,并返回網(wǎng)絡(luò)上傳送回的結(jié)果筏餐。HTTPS實際上應(yīng)用了Netscape的安全全套接字層(SSL)作為HTTP應(yīng)用層的子層开泽。(HTTPS使用端口443,而不是象HTTP那樣使用端口80來和TCP/IP進(jìn)行通信。)SSL使用40 位關(guān)鍵字作為RC4流加密算法,這對于商業(yè)信息的加密是合適的魁瞪。HTTPS和SSL支持使用X.509數(shù)字認(rèn)證,如果需要的話用戶可以確認(rèn)發(fā)送者是誰眼姐。
HTTPS和HTTP的區(qū)別:
https協(xié)議需要到ca申請證書,一般免費(fèi)證書很少,需要交費(fèi)。
http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議
http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,后者是443佩番。
http的連接很簡單,是無狀態(tài)的
HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸众旗、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議 要比http協(xié)議安全
HTTPS解決的問題:
1 . 信任主機(jī)的問題. 采用https 的server 必須從CA 申請一個用于證明服務(wù)器用途類型的證書. 改證書只有用于對應(yīng)的server 的時候,客戶度才信任次主機(jī). 所以目前所有的銀行系統(tǒng)網(wǎng)站,關(guān)鍵部分應(yīng)用都是https 的. 客戶通過信任該證書,從而信任了該主機(jī). 其實這樣做效率很低,但是銀行更側(cè)重安全. 這一點對我們沒有任何意義,我們的server ,采用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server.
2 . 通訊過程中的數(shù)據(jù)的泄密和被竄改
- 一般意義上的https, 就是 server 有一個證書.
a) 主要目的是保證server 就是他聲稱的server. 這個跟第一點一樣.
b) 服務(wù)端和客戶端之間的所有通訊,都是加密的.
i. 具體講,是客戶端產(chǎn)生一個對稱的密鑰,通過server 的證書來交換密鑰. 一般意義上的握手過程.
ii. 加下來所有的信息往來就都是加密的. 第三方即使截獲,也沒有任何意義.因為他沒有密鑰. 當(dāng)然竄改也就沒有什么意義了. - 少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書.
a) 這里客戶端證書,其實就類似表示個人信息的時候,除了用戶名/密碼, 還有一個CA 認(rèn)證過的身份. 應(yīng)為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認(rèn)自己的身份.
b) 目前少數(shù)個人銀行的專業(yè)版是這種做法,具體證書可能是拿U盤作為一個備份的載體.
HTTPS 一定是繁瑣的.
a) 本來簡單的http協(xié)議,一個get一個response. 由于https 要還密鑰和確認(rèn)加密算法的需要.單握手就需要6/7 個往返.
i. 任何應(yīng)用中,過多的round trip 肯定影響性能.
b) 接下來才是具體的http協(xié)議,每一次響應(yīng)或者請求, 都要求客戶端和服務(wù)端對會話的內(nèi)容做加密/解密.
i. 盡管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 芯片. 如果CPU 信能比較低的話,肯定會降低性能,從而不能serve 更多的請求.
ii. 加密后數(shù)據(jù)量的影響. 所以,才會出現(xiàn)那么多的安全認(rèn)證提示
6.listview的逐行顯示
可以將每一條數(shù)據(jù)先加載到list集合中,然后通過適配器將每一條數(shù)據(jù)加載到listview中實現(xiàn)listview對數(shù)據(jù)的逐行顯示。
7.edittext中文字的下劃線效果
自定義一個·EditText的派生類,LineEditText,在LineEditText類的OnDraw函數(shù)中實現(xiàn)畫一條下劃線的功能
8.activity以及service的生命周期
activity
onCreate(Bundle savedInstanceState) 第一次創(chuàng)建時調(diào)用
onStart() 被用戶可見時調(diào)用
onRestart() 當(dāng)Activity處于stop狀態(tài)又被重新啟動時調(diào)用
onResume() 當(dāng)獲得焦點即可與用戶交互時調(diào)用
onPause() 當(dāng)失去焦點時調(diào)用
onStop() 當(dāng)不可見時調(diào)用
onDestroy() 當(dāng)銷毀時調(diào)用
service
startService:onCreate()- >onStartCommand()->startService()->onDestroy()
BindService:onCreate()->onBind()->onUnbind()->onDestroy()
9.安卓系統(tǒng)的理解,優(yōu)缺點
Android一詞的本義指“機(jī)器人”,同時也是Google于2007年11月5日 宣布的基于Linux平臺的開源手機(jī)操作系統(tǒng)的名稱,該平臺由操作系統(tǒng)趟畏、中間件
贡歧、用戶界面和應(yīng)用軟件組成。
版本:每個版本代表的甜點的尺寸越變越大,然后按照26個字母數(shù)序:紙杯蛋糕(Android 1.5),甜甜圈(Android 1.6),松餅(Android 2.0/2.1),凍酸奶(Android 2.2),姜餅(Android 2.3),蜂巢(Android 3.0),冰激凌三明治(Android 4.0),果凍豆(Jelly Bean,Android4.1和Android 4.2)赋秀。
Android分為四個層,從高層到低層分別是應(yīng)用程序?qū)永洹?yīng)用程序框架層、系統(tǒng)運(yùn)行庫層和Linux內(nèi)核層猎莲。
Android開發(fā)四大組件分別是:活動(Activity): 用于表現(xiàn)功能绍弟。服務(wù)(Service): 后臺運(yùn)行服務(wù),不提供界面呈現(xiàn)。廣播接收器(BroadcastReceiver):用于接收廣播著洼。內(nèi)容提供商(Content Provider): 支持在多個應(yīng)用中存儲和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫樟遣。
優(yōu)點:開放性,掙脫束縛,豐富硬件,Google應(yīng)用
缺點:版本過多,升級過快
用戶體驗不一致
10.sim卡EF文件是什么
SIM卡里的所有文件按樹來組織:
1>主文件MF(Master File)——每一塊SIM卡只有一個唯一的主文件, 其他所有文件都是它的子孫, 主文件只有文件頭,里面存放著整個SIM卡的控制和管理信息
2>專用文件DF(Dedicated File)——也是只有一個文件頭, 里面存放著整個目錄的管理控制信息, 專用文件相當(dāng)于一個目錄的根.
3>基本文件EF(Elementary File)——既有文件頭,也有文件體, 文件頭存放該文件的位置和控制信息, 文件體存放真正的數(shù)據(jù), 整個SIM卡中只有基本文件有文件體, 也只有基本文件才用來存放數(shù)據(jù).
11.四大組件哪些能動態(tài)注冊
廣播
12.安卓文件存儲方式
文件的操作模式:
Context.MODE_PRIVATE 為默認(rèn)的操作模式,代表該文件私有,只能被應(yīng)用本身使用,覆蓋源文件
Context.APPEND 為追加模式,私有的。存在就往文件追加內(nèi)容
Context.MODE_WORLD_READABLE:表示當(dāng)前文件可以被其他應(yīng)用讀取
Context.MODE_WORLD_WRITEABLE:表示當(dāng)前文件可以被其他應(yīng)用寫入
如果希望文件被其他應(yīng)用讀和寫,可以傳入:
openFileOutput(“zhgang.txt”,Context.MODE_WORLD_READABLE+
Context.MODE_WORLD_WRITEABLE);
android有一套自己的安全模型,當(dāng)應(yīng)用程序(.apk)在安裝時系統(tǒng)就會分配給他一個userid,當(dāng)該應(yīng)用要去訪問其他資源比如文件的時候
就需要userid匹配身笤。默認(rèn)情況下,任何應(yīng)用創(chuàng)建文件,sharedprefernces,數(shù)據(jù)庫都應(yīng)該是私有的(位于/data/data//files),
其他程序無法訪問,除非在創(chuàng)建時指定了Context.MODE_WORLD_READABLE,Context.MODE_WORLD_WRITEABLE,只有這樣其他程序才能正確訪問
13.intent的功能,如何定義顯示intent,隱式intent?
在一個Android應(yīng)用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通訊中,由Intent協(xié)助完成豹悬。
Intent傳遞過程中,要找到目標(biāo)消費(fèi)者(另一個Activity,IntentReceiver或Service),也就是Intent的響應(yīng)者,有兩種方法來匹配:
顯示intent:代碼簡潔明了,執(zhí)行了函數(shù),就會馬上跳轉(zhuǎn)到指定的Activity中( Intent i = new Intent(Test.this, TestB.class);
this.startActivity(i);)。
隱式intent:隱式匹配,首先要匹配Intent的幾項值:Action(要執(zhí)行的動作), Category(要執(zhí)行動作的目標(biāo)所具有的特質(zhì)或行為歸類), Data/extras(即執(zhí)行動作要操作的數(shù)據(jù)和傳遞到目的的附加信息),type(要執(zhí)行的目標(biāo)Activity所能處理的MIME數(shù)據(jù)類型)Component
如果填寫了Componet就是上例中的Test.class)這就形成了顯示匹配液荸。
14.內(nèi)存泄露遇見過哪些問題,解決辦法,回收的算法
問題:運(yùn)行兩次后的輸出結(jié)果,程序退出了,后臺仍然有兩個線程在跑,無法被釋放,如果是大程序,就會導(dǎo)致:一瞻佛、耗電;二、內(nèi)存泄露娇钱。
解決方法:
在程序銷毀的時候,要通過Handler的removeCallbacks(Runnable r)方法來手動釋放掉該線程,當(dāng)然要把Runnable單獨提出來寫伤柄。使用完后,程序必須負(fù)責(zé)相應(yīng)的調(diào)用free或delete釋放該內(nèi)存塊,否則,這塊內(nèi)存就不能被再次使用,我們就說這塊內(nèi)存泄漏了绊困。??
回收算法:tracing算法(Tracing Collector),compacting算法(Compacting Collector),copying算法(Coping Collector),generation算法(Generational Collector),adaptive算法(Adaptive Collector)
15.接口和抽象類的區(qū)別?
abstract可以修飾抽象方法,而一個類只要有一個抽象方法,就必須用abstract定義該類,即抽象類。
用interface修飾的類,里面的方法都是抽象方法,因此在定義接口的時候,可以直接不加那些修飾,系統(tǒng)會默認(rèn)的添上去适刀。接口里面的字段都是公有常量,即public static final修飾的字段秤朗。
16.string和stringbuffer和stringbuilder區(qū)別?
STRING的長度是不可變的,STRINGBUFFER的長度是可變的。如果你對字符串中的內(nèi)容經(jīng)常進(jìn)行操作,特別是內(nèi)容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法蔗彤。
stringbuilder類被設(shè)計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因為在大多數(shù)實現(xiàn)中,它比 StringBuffer 要快疯兼。兩者的方法基本相同然遏。
17.html5?
HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 標(biāo)準(zhǔn)的 HTML 1標(biāo)準(zhǔn)版本;現(xiàn)在仍處于發(fā)展階段,但大部分瀏覽器已經(jīng)支持某些 HTML5 技術(shù)。HTML 5有兩大特點:首先,強(qiáng)化了 Web 網(wǎng)頁的表現(xiàn)性能吧彪。其次,追加了本地數(shù)據(jù)庫等 Web 應(yīng)用的功能待侵。廣義論及HTML5時,實際指的是包括HTML、CSS和JavaScript在內(nèi)的一套技術(shù)組合姨裸。它希望能夠減少瀏覽器對于需要插件的豐富性網(wǎng)絡(luò)應(yīng)用服務(wù)(plug-in-based rich internet application,RIA),如Adobe Flash秧倾、Microsoft Silverlight,與Oracle JavaFX的需求,并且提供更多能有效增強(qiáng)網(wǎng)絡(luò)應(yīng)用的標(biāo)準(zhǔn)集。
是一種標(biāo)記語言傀缩。
18.自定義一個不帶系統(tǒng)邊框的Dialog?
首先定義樣式文件style.xml,邊框設(shè)計windowframe屬性為@null,將背景設(shè)置為自己想要的背景,將自定義dialog繼承Dialog,將布局文件載入,創(chuàng)建dialog,并將自己設(shè)置的樣式文件加載進(jìn)去,最終實現(xiàn)自定義的Dialog.
19.定義一個跑馬燈效果的textview?
顯示跑馬燈效果的前提條件就是你的文本內(nèi)容要比顯示文本的外部組件長,即外部組件無法完整的顯示那先。
內(nèi)部的文本內(nèi)容。
1赡艰、layout_width=””設(shè)置為成比文本內(nèi)容短的固定值,最好不要寫成wrap_content或者fill_parent售淡。
2,android:singleLine=”true” 表示使用單行文字
android:ellipsize=”marquee”
設(shè)置了文字過長時如何切斷文字,可以有none,start,middle, end, 如果使用走馬燈效果則設(shè)為marquee。
android:focusableInTouchMode=”true”
android:focusable=”true”
android:marqueeRepeatLimit=”marquee_forever”
Android的缺省行為是在控件獲得 Focus時才會顯示走馬燈效果慷垮。
20.圖片的異步加載的方法?
1.利用軟引用來緩存圖片Bitmap,用圖片的URL作為緩存查找的Key;
2.設(shè)兩級緩存,一級是SoftReference,二級是本地SD卡;
3.如果兩級緩存都沒取到圖片,則從服務(wù)器獲取,并加入緩存;
4.加載完后通過回調(diào)接口通知UI更新;
21.瀑布流實現(xiàn)方式?
1)自定義scrollView,動態(tài)代碼添加LinearLayout及ImageView
a.自定義scrollView,并且使用監(jiān)聽器模式,對其滾動到最頂部揖闸、及最底部進(jìn)行監(jiān)聽操作。
b.在Activity里對scrollView的橫向的LinearLayout動態(tài)添加列數(shù),每一列是一個豎向的linearLayout.
c.根據(jù)列數(shù)以及l(fā)ist.size()對每一列的linearLayout添加ImageView.
d.根據(jù)監(jiān)聽器對其滾動到頂部(不做操作)料身、滾到最底部(加載更多數(shù)據(jù))汤纸、正在滾動進(jìn)行操作(滾動超過兩屏,回收兩屏之前圖片回收及回滾到之前屏幕圖片重載)。
22.把一張?zhí)貏e大的圖片,分成幾十張小的圖片,在最短的時間內(nèi)給處理?
http://www.linuxidc.com/Linux/2012-11/73939p2.htm
方法1:如果你將return-data設(shè)置為“true”,你將會獲得一個與內(nèi)部數(shù)據(jù)關(guān)聯(lián)的Action,并且bitmap以此方式返回:(Bitmap)extras.getParcelable(“data”)芹血。注意:如果你最終要獲取的圖片非常大,那么此方法會給你帶來麻煩,所以你要控制outputX和outputY保持在較小的尺寸贮泞。鑒于此原因,在我的代碼中沒有使用此方法((Bitmap)extras.getParcelable(“data”))。
方法2: 如果你將return-data設(shè)置為“false”,那么在onActivityResult的Intent數(shù)據(jù)中你將不會接收到任何Bitmap,相反,你需要將MediaStore.EXTRA_OUTPUT關(guān)聯(lián)到一個Uri,此Uri是用來存放Bitmap的幔烛。但是還有一些條件,首先你需要有一個短暫的與此Uri相關(guān)聯(lián)的文件地址,當(dāng)然這不是個大問題(除非是那些沒有sdcard的設(shè)備)隙畜。
23.Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個概念?
DVM指dalivk的虛擬機(jī)。每一個Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個獨立的Dalvik虛擬機(jī)實例说贝。而每一個DVM進(jìn)程都是在Linux系統(tǒng)中的一個進(jìn)程,所以可以認(rèn)為是同一個概念议惰。
Dalvik和Java運(yùn)行環(huán)境的區(qū)別 [
1:Dalvik主要是完成對象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
2:Dalvik負(fù)責(zé)進(jìn)程隔離和線程管理,每一個Android應(yīng)用在底層都會對應(yīng)一個獨立的Dalvik虛擬機(jī)實例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行乡恕。
3:不同于Java虛擬機(jī)運(yùn)行java字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行的是其專有的文件格式Dex 4:dex文件格式可以減少整體文件尺寸,提高I/o操作的類查找速度言询。
5:odex是為了在運(yùn)行過程中進(jìn)一步提高性能,對dex文件的進(jìn)一步優(yōu)化俯萎。
6:所有的Android應(yīng)用的線程都對應(yīng)一個Linux線程,虛擬機(jī)因而可以更多的依賴操作系統(tǒng)的線程調(diào)度和管理機(jī)制
7:有一個特殊的虛擬機(jī)進(jìn)程Zygote,他是虛擬機(jī)實例的孵化器。它在系統(tǒng)啟動的時候就會產(chǎn)生,它會完成虛擬機(jī)的初始化,庫的加載,預(yù)制類庫和初始化的操作运杭。如果系統(tǒng)需要一個新的虛擬機(jī)實例,它會迅速復(fù)制自身,以最快的數(shù)據(jù)提供給系統(tǒng)夫啊。對于一些只讀的系統(tǒng)庫,所有虛擬機(jī)實例都和Zygote共享一塊內(nèi)存區(qū)域。
24.嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,各有何特性 ?
1辆憔、虛擬內(nèi)存管理機(jī)制: 有一些嵌入式處理器提供了MMU,在MMU具備內(nèi)存地址映射和尋址功能,它使操作系統(tǒng)的內(nèi)存管理更加方便撇眯。如果存在MMU ,操作系統(tǒng)會使用它完成從虛擬地址到物理地址的轉(zhuǎn)換, 所有的應(yīng)用程序只需要使用虛擬地址尋址數(shù)據(jù)。 這種使用虛擬地址尋址整個系統(tǒng)的主存和輔存的方式在現(xiàn)代操作系統(tǒng)中被稱為虛擬內(nèi)存虱咧。MMU 便是實現(xiàn)虛擬內(nèi)存的必要條件熊榛。 虛擬內(nèi)存的管理方法使系統(tǒng)既可以運(yùn)行體積比物理內(nèi)存還要大的應(yīng)用程序,也可以實現(xiàn)“按需調(diào)頁”策略,既滿足了程序的運(yùn)行速度,又節(jié)約了物理內(nèi)存空間。 在L inux系統(tǒng)中,虛擬內(nèi)存機(jī)制的實現(xiàn)實現(xiàn)為我們提供了一個典型的例子:在不同的體系結(jié)構(gòu)下, 使用了三級或者兩級頁式管理,利用MMU 完成從虛擬地址到物理地址之間的轉(zhuǎn)換腕巡⌒梗基于虛擬內(nèi)存管理的內(nèi)存最大好處是:由于不同進(jìn)程有自己單獨的進(jìn)程空間,十分有效的提高了系統(tǒng)可靠性和安全性。 2绘沉、非虛擬內(nèi)存管理機(jī)制: 在實時性要求比較高的情況下,很多嵌入式系統(tǒng)并不需要虛擬內(nèi)存機(jī)制:因為虛擬內(nèi)存機(jī)制會導(dǎo)致不確定性的 I/O阻塞時間, 使得程序運(yùn)行時間不可預(yù)期,這是實時嵌入式系統(tǒng)的致命缺陷;另外,從嵌入式處理器的成本考慮,大多采用不裝配MMU 的嵌入式微處理器煎楣。所以大多嵌入式系統(tǒng)采用的是實存儲器管理策略。因而對于內(nèi)存的訪問是直接的,它對地址的訪問不需要經(jīng)過MMU,而是直接送到地址線上輸出,所有程序中訪問的地址都是實際的物理地址;而且,大多數(shù)嵌入式操作系統(tǒng)對內(nèi)存空間沒有保護(hù),各個進(jìn)程實際上共享一個運(yùn)行空間车伞。一個進(jìn)程在執(zhí)行前,系統(tǒng)必須為它分配足夠的連續(xù)地址空間,然后全部載入主存儲器的連續(xù)空間择懂。
25.什么是嵌入式實時操作系統(tǒng), Android 操作系統(tǒng)屬于實時操作系統(tǒng)嗎?
嵌入式實時操作系統(tǒng)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實時任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)。
嵌入式操作系統(tǒng)主要用于工業(yè)控制另玖、軍事設(shè)備休蟹、航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時間有苛刻的要求,這就需要使用實時系統(tǒng)。又可分為軟實時和硬實時兩種,而 android 是基于 linux 內(nèi)核的,因此屬于軟實時日矫。
26.一條最長的短信息約占多少byte?
一條最長的短信息約占140byte
27.android中的動畫有哪幾類,它們的特點和區(qū)別是什么?
答:Android中動畫可以分為兩大類:幀動畫赂弓、補(bǔ)間動畫
1)補(bǔ)間動畫:(你定義一個開始和結(jié)束,中間的部分由程序運(yùn)算得到。就是對場景里的對象不斷的進(jìn)行圖像變化來產(chǎn)生動畫效果(旋轉(zhuǎn)哪轿、平移盈魁、放縮和漸變))AlphaAnimation(漸變型動畫)、scaleAnimation(縮放型動畫)窃诉、 TranslateAnimation(平移型動畫)杨耙、 RotateAnimation(旋轉(zhuǎn)型動畫)、
2)逐幀動畫:Frame(把一連串的圖片進(jìn)行系列化連續(xù)播放,如同放電影的效果),它是通過播放一張一張圖片來達(dá)到動畫的效果;
28.handler機(jī)制的原理,looper通過什么方法開始的?
一個Handler允許你發(fā)送和處理Message和Runable對象,每個線程都有自己的Looper,每個Looper中封裝著MessageQueue飘痛。Looper負(fù)責(zé)不斷的從自己的消息隊列里取出隊頭的任務(wù)或消息執(zhí)行珊膜。每個handler也和線程關(guān)聯(lián),Handler負(fù)責(zé)把Message和Runable對象傳遞給MessageQueue(用到post ,sendMessage等方法),而且在這些對象離開MessageQueue時,Handler負(fù)責(zé)執(zhí)行他們(用到handleMessage方法)。
其中Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數(shù)據(jù)對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域宣脉。
默認(rèn)情況下一個線程是不存在消息循環(huán)(message loop)的,需要調(diào)用Looper.prepare()來給線程創(chuàng)建一個消息循環(huán),調(diào)用Looper.loop()來使消息循環(huán)起作用,從消息隊列里取消息,處理消息车柠。調(diào)用Looper.loop()之后循環(huán)已經(jīng)開始,下一個由handler發(fā)的message將會被這個handler的handleMessage方法處理,這是一個—-循環(huán)。
Looper從MessageQueue中取出Message之后,交由Handler的handleMessage進(jìn)行處理。處理完成后,調(diào)用Message.recycle()將其放入Message Pool中竹祷。
29.說說mvc模式的原理,在android中的運(yùn)用?
答:mvc是model,view,controller的縮寫,mvc包含三個部分:
模型(model)對象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫在該層谈跛。
視圖(view)對象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果塑陵。
控制器(control)對象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對象狀態(tài)的部分,控制器更重要的一種導(dǎo)航功能,響應(yīng)用戶出發(fā)的相關(guān)事件,交給m層處理感憾。
android鼓勵弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:
1)視圖層(view):一般采用xml文件進(jìn)行界面的描述,使用的時候可以非常方便的引入,當(dāng)然,如果你對android了解的比較的多了話,就一定可以想到在android中也可以使用javascript+html等的方式作為view層,當(dāng)然這里需要進(jìn)行java和javascript之間的通信,幸運(yùn)的是,android提供了它們之間非常方便的通信實現(xiàn)。
2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業(yè)務(wù)邏輯層處理,這樣做的另外一個原因是android中的acitivity的響應(yīng)時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉令花。
3)模型層(model):對數(shù)據(jù)庫的操作阻桅、對網(wǎng)絡(luò)等的操作都應(yīng)該在model里面處理,當(dāng)然對業(yè)務(wù)計算等操作也是必須放在的該層的。
30.如何讓Activity變成一個窗口?
答:在清單文件AndroidManifest.xml中相應(yīng)的標(biāo)簽內(nèi)設(shè)置屬性android:theme=”@android:style/Theme.Dialog”
31.后臺的Activity被系統(tǒng)回收怎么辦?
除了在棧頂?shù)腁ctivity,其他的Activity都有可能在內(nèi)存不足的時候被系統(tǒng)回收,一個Activity越處于棧底,被回收的可能性就越大兼都。如果我們沒有覆寫onSaveInstanceState()方法,此方法的默認(rèn)實現(xiàn)會自動保存Activity中的某些狀態(tài)數(shù)據(jù),比如Activity中各種UI空間的狀態(tài)嫂沉。Android應(yīng)用框架中定義的幾乎所有的UI控件都恰當(dāng)?shù)膶崿F(xiàn)了onSaveInstanceState()方法,因此當(dāng)Activity被摧毀和重建時,這些UI控件會自動保存和恢復(fù)狀態(tài)數(shù)據(jù)。比如EditText控件會自動保存和恢復(fù)輸入的數(shù)據(jù),而CheckBox控件會自動保存和恢復(fù)選中狀態(tài)俯抖。開發(fā)者只需要為這些控件指定一個唯一的ID(通過設(shè)置android:id屬性即可),剩余的事情就可以自動完成了输瓜。如果沒有為控件指定ID,則這個控件就不會進(jìn)行自動的數(shù)據(jù)保存和恢復(fù)操作瓦胎。
由上所述,如果我們需要覆寫onSaveInstanceState()方法,一般會在第一行代碼中調(diào)用該方法的默認(rèn)實現(xiàn):super.onSaveInstanceState(outState)芬萍。
32.ListView優(yōu)化?
答:1)、對convetView進(jìn)行判空,是當(dāng)convertView不為空的時候直接重新使用convertView
從而減少了很多不必要的View的創(chuàng)建
2)定義一個ViewHolder,將convetView的tag設(shè)置為ViewHolder,不為空時重新使用即可
3)搔啊、當(dāng)ListView加載數(shù)據(jù)量較大時可以采用分頁加載和圖片異步加載
33.IPC及其原理?
1).Binder通信是如何實現(xiàn)的?
1.Binder通信是通過linux的binder driver來實現(xiàn)的,
2.Binder通信操作類似線程遷移(thread migration),兩個進(jìn)程間IPC看起來就象是一個進(jìn)程進(jìn)入另一個進(jìn)程執(zhí)行代碼然后帶著執(zhí)行的結(jié)果返回;
1)IPC(Inter-Process Communication,進(jìn)程間通信),
aidl是 Android Interface definition language的縮寫,它是一種android內(nèi)部進(jìn)程通信接口的描述語言,通過它我們可以定義進(jìn)程間的通信接口.編譯器可以通過擴(kuò)展名為aidl的文件生成一段代碼,通過預(yù)先定義的接口達(dá)到兩個進(jìn)程內(nèi)部通信進(jìn)程的目的.
BroadcastReceiver也可以實現(xiàn)進(jìn)程間通信
ContentProvider 提供進(jìn)程間數(shù)據(jù)共享
2).Android的 Service工作流程
1.Android虛擬機(jī)啟動之前系統(tǒng)會先啟動service Manager進(jìn)程;
2.service Manager打開binder驅(qū)動,并通知binder kernel驅(qū)動程序這個進(jìn)程將作為System Service Manager;
3.然后該進(jìn)程將進(jìn)入一個循環(huán),等待處理來自其他進(jìn)程的數(shù)據(jù)柬祠。
4.用戶創(chuàng)建一個System service后,通過defaultServiceManager得到一個遠(yuǎn)程ServiceManager的接口,通過這個接口我們可以調(diào)用addService函數(shù)將System service添加到Service Manager進(jìn)程中;
5.然后client可以通過getService獲取到需要連接的目的Service的IBinder對象,這個IBinder是Service的BBinder在binder kernel的一個參考,
6.所以service IBinder 在binder kernel中不會存在相同的兩個IBinder對象,每一個Client進(jìn)程同樣需要打開Binder驅(qū)動程序。對用戶程序而言,我們獲得這個對象就可以通過binder kernel訪問service對象中的方法负芋。
7.Client與Service在不同的進(jìn)程中,通過這種方式實現(xiàn)了類似線程間的遷移的通信方式,對用戶程序而言當(dāng)調(diào)用Service返回的IBinder接口后,訪問Service中的方法就如同調(diào)用自己的函數(shù)漫蛔。
34.View如何刷新?
安卓要更新界面不要在主線程中去做
如果是在線程thread中獲取到了新的數(shù)據(jù),需要配合使用hanlder進(jìn)行刷新.
在線程中刷新View用postinvalidate();
在UI線程中刷新View的方法是invalidate()函數(shù),
當(dāng)調(diào)用線程處于空閑狀態(tài)時,調(diào)onDraw()刷新界面
如果是listView刷新數(shù)據(jù),用adapter.notifyDataSetInvalidated();
adapter.notifyDataSetChanged();
35.DDMS與TraceView的區(qū)別?
DDMS是一個程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器 。
36.在Java中如何引入C語言?
java中利用JNI引用本地語言 (java native interface java 本地接口)接口 旧蛾。
1.在應(yīng)用程序中定義本地接口(native)編譯成.h頭文件,交由C程序員實現(xiàn),將.c實現(xiàn)通過NDk編譯成.so動態(tài)鏈接庫(windows下是.dll, linux下是.so,導(dǎo)入項目中的libs/armeabi,代碼中調(diào)用本地接口,
應(yīng)用場景:音頻,拍攝車牌號
37.鏈表和數(shù)組的區(qū)別?
數(shù)組是將元素在內(nèi)存中連續(xù)存放,由于每個元素占用內(nèi)存相同,可以通過下標(biāo)迅速訪問數(shù)組中任何元素莽龟。但是如果要在數(shù)組中增加一個元素,需要移動大量元素,在內(nèi)存中空出一個元素的空間,然后將要增加的元素放在其中。同樣的道理,如果想刪除一個元素,同樣需要移動大量元素去填掉被移動的元素锨天。如果應(yīng)用需要快速訪問數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組毯盈。
鏈表恰好相反,鏈表中的元素在內(nèi)存中不是順序存儲的,而是通過存在元素中的指針聯(lián)系到一起。比如:上一個元素有個指針指到下一個元素,以此類推,直到最后一個元素病袄。如果要訪問鏈表中一個元素,需要從第一個元素開始,一直找到需要的元素位置搂赋。但是增加和刪除一個元素對于鏈表數(shù)據(jù)結(jié)構(gòu)就非常簡單了,只要修改元素中的指針就可以了。如果應(yīng)用需要經(jīng)常插入和刪除元素你就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了益缠。
二者都屬于一種數(shù)據(jù)結(jié)構(gòu)
(1) 從邏輯結(jié)構(gòu)角度來看
a, 數(shù)組必須事先定義固定的長度(元素個數(shù)),不能適應(yīng)數(shù)據(jù)動態(tài)地增減的情況脑奠。當(dāng)數(shù)據(jù)增加時,可能超出原先定義的元素個數(shù);當(dāng)數(shù)據(jù)減少時,造成內(nèi)存浪費(fèi)。
b,鏈表動態(tài)地進(jìn)行存儲分配,可以適應(yīng)數(shù)據(jù)動態(tài)地增減的情況,且可以方便地插入幅慌、刪除數(shù)據(jù)項宋欺。(數(shù)組中插入、刪除數(shù)據(jù)項時,需要移動其它數(shù)據(jù)項)
(2)從內(nèi)存存儲角度來看
a,(靜態(tài))數(shù)組從棧中分配空間, 對于程序員方便快速,但自由度小。
b, 鏈表從堆中分配空間, 自由度大但申請管理比較麻煩.
39.Hash表是什么?有什么用?
散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)迄靠。也就是說,它通過把關(guān)鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度秒咨。這個映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表。
給定表M,存在函數(shù)f(key),對任意給定的關(guān)鍵字值key,代入函數(shù)后若能得到包含該關(guān)鍵字的記錄在表中的地址,則稱表M為哈希(Hash)表,函數(shù)f(key)為哈希(Hash) 函數(shù)
作用:HASH表主要就是提供更快的查找速度,簡單來說就是分桶掌挚。
比如說你們學(xué)校的一個年級有很多班是吧? 那么現(xiàn)在要查找一位同學(xué)雨席。如果不看班級直接找,就需要每個班級一個一個的查找是不? 那現(xiàn)在因為分了班級,我們有一個函數(shù)可以通過名字產(chǎn)生它的班級號。比如說王勇,二班吠式。 那么現(xiàn)在我們直接hash( 王勇) = 2; 然后我們就直接從2班開始找陡厘。 如果2班有50個學(xué)生,那么我們最多查找50次對嗎? 好。假設(shè)你們年級一共有10個班,如果沒有這個hash函數(shù),那么直接找,最壞可能要查找50*10=500次特占。!! 這個班級其實就是每個桶!! 這就是分桶糙置。。是目。通過哈希函數(shù)產(chǎn)生哈希值,然后相同哈希值的元素放在相同的桶里邊谤饭。。懊纳。!
這樣可以通過hash這個間接作用減少查找的時間和次數(shù)!這就是它的意義!!
40.什么是鎖?有什么用?有哪些鎖?為什么需要鎖?
鎖是為了保證安全性,如程序運(yùn)行時保證另外的程序不能再對本程序所使用到的數(shù)據(jù)進(jìn)行某些操作,版本軟件的“不能合并”文件不能同時被兩人修改等揉抵。
鎖分為:線程鎖,數(shù)據(jù)庫鎖,SVN鎖等等
1、當(dāng)幾個線程都用到了某個量,但是這個量卻能影響程序的運(yùn)行時就需要線程鎖來控制一次只能由一個線程訪問這個量嗤疯。如果沒有使用線程鎖會出現(xiàn)爭用情況冤今。
兩個或更多的線程或進(jìn)程讀或?qū)懸恍┕蚕頂?shù)據(jù),而最終結(jié)果取決于這些線程是如何被調(diào)度計時的。爭用情況可能會導(dǎo)致不可預(yù)見的結(jié)果和隱蔽的程序錯誤茂缚。
2戏罢、數(shù)據(jù)庫鎖的作用是防止程序運(yùn)行的時候其他的程序不能再對該程序所使用到的數(shù)據(jù)進(jìn)行操作,保護(hù)數(shù)據(jù)的安全性。
3脚囊、SVN鎖的作用是防止版本軟件中的“不能合并”的文件(如:圖形文件)不能被多人同時更改的時候進(jìn)行鎖定,當(dāng)一個人對其進(jìn)行操作時,其他人不能對這個文件再進(jìn)行操作,保證了文件的安全性龟糕。
41.MVC作用?
答: Android中界面部分也采用了當(dāng)前比較流行的MVC框架。
在Android中:
- 視圖層(View):一般采用XML文件進(jìn)行界面的描述,使用的時候可以非常方
便的引入悔耘。也可以使用JavaScript+HTML等的方式作為View層,通過WebView組
件加載,同時可以實現(xiàn)Java和JavaScript之間的通信讲岁。 - 控制層(Controller):這句話也就暗含了不要在Acitivity中寫代碼,要通過Activity
交割Model業(yè)務(wù)邏輯層處理,這樣做的另外一個原因是Android中的Acitivity的響
應(yīng)時間是5s,如果耗時的操作放在這里,Android的控制層的重任通常落在了眾多
的Acitvity的肩上,程序就很容易被回收掉。
3)模型層(Model):對數(shù)據(jù)庫的操作淮逊、對網(wǎng)絡(luò)等的操作都應(yīng)該在Model里面處理,
當(dāng)然對業(yè)務(wù)計算等操作也是必須放在的該層的催首。
在Android SDK中的數(shù)據(jù)綁定,也都是采用了與MVC框架類似的方法來顯示數(shù)據(jù)。在控制層上將數(shù)據(jù)按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就可以直接在視圖模型上顯示了,從而實現(xiàn)了數(shù)據(jù)綁定泄鹏。比如顯示Cursor中所有數(shù)據(jù)的ListActivity,其視圖層就是一個ListView,將數(shù)據(jù)封裝為ListAdapter,并傳遞給ListView,數(shù)據(jù)就在ListView中顯示寥袭。
42.px,dp,sp區(qū)別?
px:
即像素,1px代表屏幕上一個物理的像素點;
px單位不被建議使用,因為同樣100px的圖片,在不同手機(jī)上顯示的實際大小可能不同
dp = dip : device independent pixels(設(shè)備獨立像素). 不同設(shè)備有不同的顯示效果,這個和設(shè)備硬件有關(guān),一般我們?yōu)榱酥С諻VGA昔逗、HVGA和QVGA 推薦使用這個,不依賴像素位衩。
sp:
與縮放無關(guān)的抽象像素(Scale-independent Pixel)钢属。sp和dp很類似但唯一的區(qū)別是,Android系統(tǒng)允許用戶自定義文字尺寸大小(小分井、正常、大霉猛、超大等等),當(dāng)文字尺寸是“正吵呙”時1sp=1dp=0.00625英寸,而當(dāng)文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸。類似我們在windows里調(diào)整字體尺寸以后的效果——窗口大小不變,只有文字大小改變惜浅。
43.android 系統(tǒng)架構(gòu),按順序?
答:1)應(yīng)用程序?qū)?java語言 應(yīng)用程序開發(fā)
2)應(yīng)用程序框架層 java語言 OS定制 framework層開發(fā)
3)系統(tǒng)運(yùn)行庫層 C C++ 實現(xiàn) so庫
4)Linux內(nèi)核層
44.android有幾種布局,有什么特點?
答:最常用的布局有以下這幾種:
第一種:幀布局(框架布局)FrameLayout,在這個布局中,所有的子元素統(tǒng)統(tǒng)放于這塊區(qū)域的左上角,并且后面的子元素直接覆蓋在前面的子元素之上,將前面的子元素部分和全部遮擋瘫辩。
第二種:線性布局LinearLayout,最常用的一種布局方式,所有子控件的對齊方式,取決于如何定義 orientation的屬性:vertical 垂直方向 ,如果按照這種方向所有的子控件將按照垂直的方式分布在布局上,每行只允許有一個子元素,horizontal水平方向 ,這時子控件將會以水平的方向分布在布局中。
第三種:絕對布局AbsoluteLayout,又可以叫做坐標(biāo)布局,可以直接指定子元素的絕對位置,這種布局簡單直接,直觀性強(qiáng),但是由于手機(jī)屏幕尺寸差別比較大,使用絕對定位的適應(yīng)性會比較差坛悉。
第四種:相對布局RelativeLayout,允許子元素指定它們相對于其父元素或兄弟元素的位置,這是實際布局中最常用的布局方式之一伐厌。它靈活性大很多,當(dāng)然屬性也多,操作難度也大,屬性之間產(chǎn)生沖突的的可能性也大,使用相對布局時要多做些測試。
第五種:表格布局TableLayout,表格布局TableLayout以行列的形式管理子元素,每一行是一個TableRow布局對象,當(dāng)然也可以是普通的View對象,TableRow里每放一個元素就是一列,總列數(shù)由列數(shù)最多的那一行決定裸影。
第六種:網(wǎng)格布局 GridLayout,在Android 4.0中,新引入的GridLayout網(wǎng)格布局,GridLayout布局使用虛細(xì)線將布局劃分為行,列和單元格,也支持一個控件在行,列上都有交錯排列挣轨。而GridLayout使用的其實是跟LinearLayout類似的API,只不過是修改了一下相關(guān)的標(biāo)簽而已,所以對于開發(fā)者來說,掌握GridLayout還是很容易的事情。
(Android 4.0的SDK已經(jīng)發(fā)布,在眾多的新增特性中,其中對開發(fā)者來說比較重要的特性之一,是新增的兩種界面布局方式:Space和Gridlayout)
45.常用的設(shè)計模式?
答:單例模式;工廠模式;
觀察者模式:ContentObserver, 監(jiān)聽ContentProvider ContentResolver;
適配器模式Adapter(SimpleAdapter BaseAdapter ArrayAdapter CursorAdapter)以及各種Adapter的數(shù)據(jù)源;
代理模式 AOP;
46.常用的排序法?
答: 冒泡排序 O(n^2) : 冒泡排序也是最簡單最基本的排序方法之一轩猩。冒泡排序的思想很簡單,就是以此比較相鄰的元素大小,將小的前移,大的后移,就像水中的氣泡一樣,最小的元 素經(jīng)過幾次移動,會最終浮到水面上卷扮。
for (int i = 0; i < num.length; i++) {
// 內(nèi)循環(huán)控制比較后移位
for (int j = num.length-1; j > i ; j–) {
if (num[j-1]>num[j]) {
temp = num[j-1];
num[j-1] = num[j];
num[j] = temp;
}
}
快速排序O(n log n) : 快速排序采用的思想是分治思想【快速排序算法的核心算法是分區(qū)操作,即如何調(diào)整基準(zhǔn)的位置以及調(diào)整返回基準(zhǔn)的最終位置以便分治遞歸晤锹。
插入排序 O(n^2) :將新來的元素按順序放入一個已有的有序序列當(dāng)中。
選擇排序 O(n^2) :第i趟簡單選擇排序是指通過n-i次關(guān)鍵字的比較,從n-i+1個記錄中選出關(guān)鍵字最小的記錄,并和第i個記錄進(jìn)行交換浊猾。共需進(jìn)行i-1趟比較,直到所有記錄排序完成為止抖甘。
47.寫一個快速排序法?
快速排序(Quicksort)是對冒泡排序的一種改進(jìn)热鞍。它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個排序過程可以遞歸進(jìn)行,以此達(dá)到整個數(shù)據(jù)變成有序序列葫慎。
public class QuickSort {
public static void main(String[] args) {
Integer[] list={34,3,53,2,23,7,14,10};
QuickSort qs= new QuickSort();
qs.quick(list);
for( int i=0;i...}