錄
1.怎么實(shí)現(xiàn)通知欄到聊天界面的跳轉(zhuǎn) 3
2.聊天界面左右分隔怎么實(shí)現(xiàn),怎么實(shí)現(xiàn)優(yōu)化使其不出現(xiàn)錯(cuò)位 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)缺點(diǎn) 5
10.sim卡EF文件是什么 6
11.四大組件哪些能動(dòng)態(tài)注冊(cè) 6
12.安卓文件存儲(chǔ)方式 6
13.intent的功能,如何定義顯示intent,隱式intent? 6
14.內(nèi)存泄露遇見(jiàn)過(guò)哪些問(wèn)題,解決辦法,回收的算法 7
15.接口和抽象類的區(qū)別? 7
16.string和stringbuffer和stringbuilder區(qū)別? 7
17.html5? 7
18.自定義一個(gè)不帶系統(tǒng)邊框的Dialog? 7
19.定義一個(gè)跑馬燈效果的textview? 7
20.圖片的異步加載的方法? 8
- 瀑布流實(shí)現(xiàn)方式? 8
- 把一張?zhí)貏e大的圖片,分成幾十張小的圖片,在最短的時(shí)間內(nèi)給處理? 8
- Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念? 8
- 嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,各有何特性 ? 9
- 什么是嵌入式實(shí)時(shí)操作系統(tǒng), Android 操作系統(tǒng)屬于實(shí)時(shí)操作系統(tǒng)嗎? 9
26.一條最長(zhǎng)的短信息約占多少byte? 9 - android中的動(dòng)畫(huà)有哪幾類,它們的特點(diǎn)和區(qū)別是什么? 9
28.handler機(jī)制的原理,looper通過(guò)什么方法開(kāi)始的? 9
29.說(shuō)說(shuō)mvc模式的原理,在android中的運(yùn)用? 10
30.如何讓Activity變成一個(gè)窗口? 10
31.后臺(tái)的Activity被系統(tǒng)回收怎么辦? 10
32.ListView優(yōu)化? 10
33.IPC及其原理? 10
34.View如何刷新? 11
35.DDMS與TraceView的區(qū)別? 11
36.在Java中如何引入C語(yǔ)言? 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有幾種布局,有什么特點(diǎn)? 13
45.常用的設(shè)計(jì)模式? 14
46.常用的排序法? 14
47.寫(xiě)一個(gè)快速排序法? 14
48.synchronized 是什么?有什么用? 15
49.線程的狀態(tài)? 16
50.onSaveInstanceState() 和 onRestoreInstanceState(); 16
51.了解版本控制的工具嗎? 16
52.github git都是啥? 16
53.git svn 區(qū)別? 16
54.舉個(gè)簡(jiǎn)單的socket編程 16
55.怎樣用數(shù)據(jù)庫(kù)語(yǔ)句實(shí)現(xiàn)分頁(yè) 18
56.怎樣實(shí)現(xiàn)自定義View 18
57.json的上限是多少(大小) 18
58.afinal框架和xUtils框架的區(qū)別 18
59.listView上拉加載監(jiān)聽(tīng) 18
60.JSON/XML的區(qū)別 19
61.JNI怎樣用 19
62.廣播的兩種注冊(cè)方式 19
63.android中Serializable和Parcelable的聯(lián)系? 19
64.一個(gè)應(yīng)用中有多少個(gè)Context? 20
65.AsyncTask與使用線程處理耗時(shí)操作的優(yōu)劣是? 20
66.談?wù)勀銓?duì)Android事件分發(fā)機(jī)制的理解? 20
67.談?wù)勀銓?duì)ZYGOTE進(jìn)程的理解和認(rèn)識(shí)? 20
68.第三方注冊(cè)及登陸怎么實(shí)現(xiàn)的? 21
69.Fragment怎么實(shí)現(xiàn)的? 22
70.緩存怎么實(shí)現(xiàn)的? 22
71.解析XML PULL解析? 22
72.分享用的什么平臺(tái)? 22
73.橫豎屏切換 22 - 高并發(fā)業(yè)務(wù)請(qǐng)求處理方法 23
75.Android中如何設(shè)置兩個(gè)應(yīng)用程序?yàn)橥粋€(gè)進(jìn)程? 23
76.手機(jī)適配怎么做? 24 - 手機(jī)測(cè)試包括哪些? 24
78.Http中g(shù)et和post的區(qū)別? 25
79.側(cè)滑怎么實(shí)現(xiàn)的? 25
80.UDP和TCP的區(qū)別? 25
81.雙緩存怎么實(shí)現(xiàn)的? 25
82.垃圾收集算法的核心思想 26
83.觸發(fā)主GC(Garbage Collector)的條件 26
84.減少GC開(kāi)銷的措施 26
85.gc與finalize方法 26
86.ViewPager如何實(shí)現(xiàn)? 26
87.請(qǐng)說(shuō)出使用equal和==比較對(duì)象時(shí)的區(qū)別? 26
88.什么是Java序列化和反序列話,如何實(shí)現(xiàn)Java序列化? 27
89.請(qǐng)解釋下android程序運(yùn)行時(shí)權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別? 27
90.講一講overload和override的區(qū)別,overloaded的方法是否可以改變返回值的類型? 27
91.如何使用socket實(shí)現(xiàn)TCP點(diǎn)對(duì)點(diǎn)通信? 27
92.請(qǐng)簡(jiǎn)述service可能被kill的場(chǎng)景,kill之后如何自啟? 27
93.請(qǐng)使用遞歸方式來(lái)遍歷盤(pán)下的所有文件,并計(jì)算出所有圖片文件的數(shù)量? 27
94.現(xiàn)有兩個(gè)單向鏈表,我想知道這兩個(gè)鏈表的相交情況。(可以不寫(xiě)實(shí)現(xiàn),但思路必須寫(xiě)清)? 28
95.使用javac/c++寫(xiě)一段程序,找出數(shù)組中出現(xiàn)次數(shù)最多數(shù)字,并輸出出現(xiàn)次數(shù),請(qǐng)標(biāo)明算法的時(shí)間復(fù)雜值? 29
96.什么是OAuth,Oauth,的角色,Qauth驗(yàn)證流程? 30
97.使用javac/c++寫(xiě)一段程序,找出數(shù)組中第K大小的數(shù),輸出數(shù)所在的位置,請(qǐng)標(biāo)明算法的時(shí)間復(fù)雜度? 30
98.進(jìn)程通信和線程同步的方法? 31
99.面向?qū)ο蟮奶卣饔心男┓矫? 31
100.Context里面主要包括什么具體的東西? 32
101.簡(jiǎn)述條形碼的掃描設(shè)計(jì)思路? 32 - ListView異步加載圖片實(shí)現(xiàn)思路(優(yōu)化篇) 32
- android下大文件分割上傳 39
- android listview 異步加載圖片并防止錯(cuò)位 42
1.怎么實(shí)現(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一個(gè)新的Intent然后用上述方法即可實(shí)現(xiàn)跳轉(zhuǎn)。
2.聊天界面左右分隔怎么實(shí)現(xiàn),怎么實(shí)現(xiàn)優(yōu)化使其不出現(xiàn)錯(cuò)位
我們可以在adapter里對(duì)消息的發(fā)放者進(jìn)行判斷,如果不是本人發(fā)送的那就設(shè)置靠左,否則設(shè)置靠右,具體實(shí)現(xiàn)如下:
封裝消息實(shí)體類時(shí),將消息的發(fā)送者類型作為Boolean類型存入。在適配數(shù)據(jù)時(shí),準(zhǔn)備兩種item_layout布局文件,一種用于別人的信息展示,另一種用于自己的信息。getView方法加載布局文件之前對(duì)消息的發(fā)放者進(jìn)行判斷,如果是本人發(fā)送,則加載靠右的布局,否則則使用靠左的布局文件,從而實(shí)現(xiàn)動(dòng)態(tài)的位置改變
3.視頻,音頻的上傳
Android的視頻音頻上傳主要就是通過(guò)java的socket來(lái)進(jìn)行與服務(wù)器的交流,socket通信可以指定一個(gè)服務(wù)器的地址,然后可以通過(guò)io流實(shí)現(xiàn)視頻音頻的上傳。
4.http協(xié)議和soap協(xié)議的區(qū)別
HTTP(超文本傳輸協(xié)議)是利用TCP在兩臺(tái)電腦(通常是Web服務(wù)器和客戶端)之間傳輸信息的協(xié)議??蛻舳耸褂肳eb瀏覽器發(fā)起HTTP請(qǐng)求給Web服務(wù)器,Web服務(wù)器發(fā)送被請(qǐng)求的信息給客戶端。
SOAP(Simple Object Access Protocal,簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議) 技術(shù)有助于實(shí)現(xiàn)大量異構(gòu)程序和平臺(tái)之間的互操作性,根據(jù)我有限的了解,SOAP是把成熟的基于HTTP的WEB技術(shù)與XML的靈活性和可擴(kuò)展性組合在了一起。比如我們.NET中的WEB服務(wù),就是基于SOAP。
簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP)是W3C組織的一個(gè)Note, 它描述了一種在分散的或分布式的環(huán)境中如何交換信息的輕量級(jí)協(xié)議。SOAP是一個(gè)基于XML的協(xié)議,它包括三個(gè)部分:SOAP封裝(Envelop),封裝定義了一個(gè)描述消息中的內(nèi)容是什么,是誰(shuí)發(fā)送的,誰(shuí)應(yīng)當(dāng)接受并處理它以及如何處理它們的框架;SOAP編碼規(guī)則(Encoding Rules),用于表示應(yīng)用程序需要使用的數(shù)據(jù)類型的實(shí)例;SOAP RPC表示(RPC Representation),表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答的協(xié)定;SOAP可以和多種傳輸協(xié)議綁定(Binding),使用底層協(xié)議交換信息。在這個(gè)文檔中,目前只定義了SOAP如何和HTTP以及HTTP擴(kuò)展進(jìn)行綁定的框架。
SOAP是個(gè)通信協(xié)議, SOAP在HTTP協(xié)議的基礎(chǔ)上,把編寫(xiě)成XML的REQUEST參數(shù), 放在HTTP BODY上提交個(gè)WEB SERVICE服務(wù)器(SERVLET,ASP什么的) 處理完成后,結(jié)果也寫(xiě)成XML作為RESPONSE送回用戶端, 為了使用戶端和WEB SERVICE可以相互對(duì)應(yīng),可以使用WSDL作為這種通信方式的描述文件,利用WSDL工具可以自動(dòng)生成WS和用戶端的框架文件,SOAP具備把復(fù)雜對(duì)象序列化捆綁到XML里去的能力。
SOAP的前身是RPC, 就是遠(yuǎn)程呼叫處理的協(xié)議,這個(gè)協(xié)議安全性不是很好,多數(shù)防火墻都會(huì)阻擋RPC的通信包,而SOAP則使用HTTP協(xié)議作為基本的協(xié)議,使用端口80使得SOAP可以透過(guò)防火墻,完成RPC的功能。
SOAP協(xié)議和HTTP協(xié)議一樣,都是底層的通信協(xié)議,只是請(qǐng)求包的格式不同而已,SOAP包是XML格式的,現(xiàn)在我們編寫(xiě)WEB SERVICE不需要深入理解SOAP也沒(méi)關(guān)系。如果SERVICE和CLIENT在同樣的環(huán)境下使用SOAP,由于一般情況下都有自動(dòng)生成SOAP程序框架的工具,因此不知道細(xì)節(jié)也沒(méi)關(guān)系. 可是, 如果CLIENT和SERVICE的環(huán)境不同,比如說(shuō)JAVA的Client和.NET的SERVICE進(jìn)行通信,或者是VB CLIENT和TOMCAT下的JAVA SERVICE通信,還是要知道一點(diǎn)細(xì)節(jié)為好. 特別是, WSDL或者UDDI都不是標(biāo)準(zhǔn),如果不讓用就只好手工配制SOAP MESSAGE啦。
5.http和https的區(qū)別
在URL前加https://前綴表明是用SSL加密的。你的電腦與服務(wù)器之間收發(fā)的信息傳輸將更加安全。 Web服務(wù)器啟用SSL需要獲得一個(gè)服務(wù)器證書(shū)并將該證書(shū)與要使用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é)議
它是一個(gè)安全通信通道,它基于HTTP開(kāi)發(fā),用于在客戶計(jì)算機(jī)和服務(wù)器之間交換信息。它使用安全套接字層(SSL)進(jìn)行信息交換,簡(jiǎn)單來(lái)說(shuō)它是HTTP的安全版。
它是由Netscape開(kāi)發(fā)并內(nèi)置于其瀏覽器中,用于對(duì)數(shù)據(jù)進(jìn)行壓縮和解壓操作,并返回網(wǎng)絡(luò)上傳送回的結(jié)果。HTTPS實(shí)際上應(yīng)用了Netscape的安全全套接字層(SSL)作為HTTP應(yīng)用層的子層。(HTTPS使用端口443,而不是象HTTP那樣使用端口80來(lái)和TCP/IP進(jìn)行通信。)SSL使用40 位關(guān)鍵字作為RC4流加密算法,這對(duì)于商業(yè)信息的加密是合適的。HTTPS和SSL支持使用X.509數(shù)字認(rèn)證,如果需要的話用戶可以確認(rèn)發(fā)送者是誰(shuí)。
HTTPS和HTTP的區(qū)別:
https協(xié)議需要到ca申請(qǐng)證書(shū),一般免費(fèi)證書(shū)很少,需要交費(fèi)。
http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議
http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,后者是443。
http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的
HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議 要比http協(xié)議安全
HTTPS解決的問(wèn)題:
1 . 信任主機(jī)的問(wèn)題. 采用https 的server 必須從CA 申請(qǐng)一個(gè)用于證明服務(wù)器用途類型的證書(shū). 改證書(shū)只有用于對(duì)應(yīng)的server 的時(shí)候,客戶度才信任次主機(jī). 所以目前所有的銀行系統(tǒng)網(wǎng)站,關(guān)鍵部分應(yīng)用都是https 的. 客戶通過(guò)信任該證書(shū),從而信任了該主機(jī). 其實(shí)這樣做效率很低,但是銀行更側(cè)重安全. 這一點(diǎn)對(duì)我們沒(méi)有任何意義,我們的server ,采用的證書(shū)不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server.
2 . 通訊過(guò)程中的數(shù)據(jù)的泄密和被竄改
- 一般意義上的https, 就是 server 有一個(gè)證書(shū).
a) 主要目的是保證server 就是他聲稱的server. 這個(gè)跟第一點(diǎn)一樣.
b) 服務(wù)端和客戶端之間的所有通訊,都是加密的.
i. 具體講,是客戶端產(chǎn)生一個(gè)對(duì)稱的密鑰,通過(guò)server 的證書(shū)來(lái)交換密鑰. 一般意義上的握手過(guò)程.
ii. 加下來(lái)所有的信息往來(lái)就都是加密的. 第三方即使截獲,也沒(méi)有任何意義.因?yàn)樗麤](méi)有密鑰. 當(dāng)然竄改也就沒(méi)有什么意義了. - 少許對(duì)客戶端有要求的情況下,會(huì)要求客戶端也必須有一個(gè)證書(shū).
a) 這里客戶端證書(shū),其實(shí)就類似表示個(gè)人信息的時(shí)候,除了用戶名/密碼, 還有一個(gè)CA 認(rèn)證過(guò)的身份. 應(yīng)為個(gè)人證書(shū)一般來(lái)說(shuō)上別人無(wú)法模擬的,所有這樣能夠更深的確認(rèn)自己的身份.
b) 目前少數(shù)個(gè)人銀行的專業(yè)版是這種做法,具體證書(shū)可能是拿U盤(pán)作為一個(gè)備份的載體.
HTTPS 一定是繁瑣的.
a) 本來(lái)簡(jiǎn)單的http協(xié)議,一個(gè)get一個(gè)response. 由于https 要還密鑰和確認(rèn)加密算法的需要.單握手就需要6/7 個(gè)往返.
i. 任何應(yīng)用中,過(guò)多的round trip 肯定影響性能.
b) 接下來(lái)才是具體的http協(xié)議,每一次響應(yīng)或者請(qǐng)求, 都要求客戶端和服務(wù)端對(duì)會(huì)話的內(nèi)容做加密/解密.
i. 盡管對(duì)稱加密/解密效率比較高,可是仍然要消耗過(guò)多的CPU,為此有專門(mén)的SSL 芯片. 如果CPU 信能比較低的話,肯定會(huì)降低性能,從而不能serve 更多的請(qǐng)求.
ii. 加密后數(shù)據(jù)量的影響. 所以,才會(huì)出現(xiàn)那么多的安全認(rèn)證提示
6.listview的逐行顯示
可以將每一條數(shù)據(jù)先加載到list集合中,然后通過(guò)適配器將每一條數(shù)據(jù)加載到listview中實(shí)現(xiàn)listview對(duì)數(shù)據(jù)的逐行顯示。
7.edittext中文字的下劃線效果
自定義一個(gè)·EditText的派生類,LineEditText,在LineEditText類的OnDraw函數(shù)中實(shí)現(xiàn)畫(huà)一條下劃線的功能
8.activity以及service的生命周期
activity
onCreate(Bundle savedInstanceState) 第一次創(chuàng)建時(shí)調(diào)用
onStart() 被用戶可見(jiàn)時(shí)調(diào)用
onRestart() 當(dāng)Activity處于stop狀態(tài)又被重新啟動(dòng)時(shí)調(diào)用
onResume() 當(dāng)獲得焦點(diǎn)即可與用戶交互時(shí)調(diào)用
onPause() 當(dāng)失去焦點(diǎn)時(shí)調(diào)用
onStop() 當(dāng)不可見(jiàn)時(shí)調(diào)用
onDestroy() 當(dāng)銷毀時(shí)調(diào)用
service
startService:onCreate()- >onStartCommand()->startService()->onDestroy()
BindService:onCreate()->onBind()->onUnbind()->onDestroy()
9.安卓系統(tǒng)的理解,優(yōu)缺點(diǎn)
Android一詞的本義指“機(jī)器人”,同時(shí)也是Google于2007年11月5日 宣布的基于Linux平臺(tái)的開(kāi)源手機(jī)操作系統(tǒng)的名稱,該平臺(tái)由操作系統(tǒng)、中間件
、用戶界面和應(yīng)用軟件組成。
版本:每個(gè)版本代表的甜點(diǎn)的尺寸越變?cè)酱?然后按照26個(gè)字母數(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分為四個(gè)層,從高層到低層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層和Linux內(nèi)核層。
Android開(kāi)發(fā)四大組件分別是:活動(dòng)(Activity): 用于表現(xiàn)功能。服務(wù)(Service): 后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn)。廣播接收器(BroadcastReceiver):用于接收廣播。內(nèi)容提供商(Content Provider): 支持在多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù)。
優(yōu)點(diǎn):開(kāi)放性,掙脫束縛,豐富硬件,Google應(yīng)用
缺點(diǎn):版本過(guò)多,升級(jí)過(guò)快
用戶體驗(yàn)不一致
10.sim卡EF文件是什么
SIM卡里的所有文件按樹(shù)來(lái)組織:
1>主文件MF(Master File)——每一塊SIM卡只有一個(gè)唯一的主文件, 其他所有文件都是它的子孫, 主文件只有文件頭,里面存放著整個(gè)SIM卡的控制和管理信息
2>專用文件DF(Dedicated File)——也是只有一個(gè)文件頭, 里面存放著整個(gè)目錄的管理控制信息, 專用文件相當(dāng)于一個(gè)目錄的根.
3>基本文件EF(Elementary File)——既有文件頭,也有文件體, 文件頭存放該文件的位置和控制信息, 文件體存放真正的數(shù)據(jù), 整個(gè)SIM卡中只有基本文件有文件體, 也只有基本文件才用來(lái)存放數(shù)據(jù).
11.四大組件哪些能動(dòng)態(tài)注冊(cè)
廣播
12.安卓文件存儲(chǔ)方式
文件的操作模式:
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)用寫(xiě)入
如果希望文件被其他應(yīng)用讀和寫(xiě),可以傳入:
openFileOutput(“zhgang.txt”,Context.MODE_WORLD_READABLE+
Context.MODE_WORLD_WRITEABLE);
android有一套自己的安全模型,當(dāng)應(yīng)用程序(.apk)在安裝時(shí)系統(tǒng)就會(huì)分配給他一個(gè)userid,當(dāng)該應(yīng)用要去訪問(wèn)其他資源比如文件的時(shí)候
就需要userid匹配。默認(rèn)情況下,任何應(yīng)用創(chuàng)建文件,sharedprefernces,數(shù)據(jù)庫(kù)都應(yīng)該是私有的(位于/data/data//files),
其他程序無(wú)法訪問(wèn),除非在創(chuàng)建時(shí)指定了Context.MODE_WORLD_READABLE,Context.MODE_WORLD_WRITEABLE,只有這樣其他程序才能正確訪問(wèn)
13.intent的功能,如何定義顯示intent,隱式intent?
在一個(gè)Android應(yīng)用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通訊中,由Intent協(xié)助完成。
Intent傳遞過(guò)程中,要找到目標(biāo)消費(fèi)者(另一個(gè)Activity,IntentReceiver或Service),也就是Intent的響應(yīng)者,有兩種方法來(lái)匹配:
顯示intent:代碼簡(jiǎn)潔明了,執(zhí)行了函數(shù),就會(huì)馬上跳轉(zhuǎn)到指定的Activity中( Intent i = new Intent(Test.this, TestB.class);
this.startActivity(i);)。
隱式intent:隱式匹配,首先要匹配Intent的幾項(xiàng)值:Action(要執(zhí)行的動(dòng)作), Category(要執(zhí)行動(dòng)作的目標(biāo)所具有的特質(zhì)或行為歸類), Data/extras(即執(zhí)行動(dòng)作要操作的數(shù)據(jù)和傳遞到目的的附加信息),type(要執(zhí)行的目標(biāo)Activity所能處理的MIME數(shù)據(jù)類型)Component
如果填寫(xiě)了Componet就是上例中的Test.class)這就形成了顯示匹配。
14.內(nèi)存泄露遇見(jiàn)過(guò)哪些問(wèn)題,解決辦法,回收的算法
問(wèn)題:運(yùn)行兩次后的輸出結(jié)果,程序退出了,后臺(tái)仍然有兩個(gè)線程在跑,無(wú)法被釋放,如果是大程序,就會(huì)導(dǎo)致:一、耗電;二、內(nèi)存泄露。
解決方法:
在程序銷毀的時(shí)候,要通過(guò)Handler的removeCallbacks(Runnable r)方法來(lái)手動(dòng)釋放掉該線程,當(dāng)然要把Runnable單獨(dú)提出來(lái)寫(xiě)。使用完后,程序必須負(fù)責(zé)相應(yīng)的調(diào)用free或delete釋放該內(nèi)存塊,否則,這塊內(nèi)存就不能被再次使用,我們就說(shuō)這塊內(nèi)存泄漏了。??
回收算法:tracing算法(Tracing Collector),compacting算法(Compacting Collector),copying算法(Coping Collector),generation算法(Generational Collector),adaptive算法(Adaptive Collector)
15.接口和抽象類的區(qū)別?
abstract可以修飾抽象方法,而一個(gè)類只要有一個(gè)抽象方法,就必須用abstract定義該類,即抽象類。
用interface修飾的類,里面的方法都是抽象方法,因此在定義接口的時(shí)候,可以直接不加那些修飾,系統(tǒng)會(huì)默認(rèn)的添上去。接口里面的字段都是公有常量,即public static final修飾的字段。
16.string和stringbuffer和stringbuilder區(qū)別?
STRING的長(zhǎng)度是不可變的,STRINGBUFFER的長(zhǎng)度是可變的。如果你對(duì)字符串中的內(nèi)容經(jīng)常進(jìn)行操作,特別是內(nèi)容要修改時(shí),那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
stringbuilder類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因?yàn)樵诖蠖鄶?shù)實(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有兩大特點(diǎn):首先,強(qiáng)化了 Web 網(wǎng)頁(yè)的表現(xiàn)性能。其次,追加了本地?cái)?shù)據(jù)庫(kù)等 Web 應(yīng)用的功能。廣義論及HTML5時(shí),實(shí)際指的是包括HTML、CSS和JavaScript在內(nèi)的一套技術(shù)組合。它希望能夠減少瀏覽器對(duì)于需要插件的豐富性網(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)記語(yǔ)言。
18.自定義一個(gè)不帶系統(tǒng)邊框的Dialog?
首先定義樣式文件style.xml,邊框設(shè)計(jì)windowframe屬性為@null,將背景設(shè)置為自己想要的背景,將自定義dialog繼承Dialog,將布局文件載入,創(chuàng)建dialog,并將自己設(shè)置的樣式文件加載進(jìn)去,最終實(shí)現(xiàn)自定義的Dialog.
19.定義一個(gè)跑馬燈效果的textview?
顯示跑馬燈效果的前提條件就是你的文本內(nèi)容要比顯示文本的外部組件長(zhǎng),即外部組件無(wú)法完整的顯示。
內(nèi)部的文本內(nèi)容。
1、layout_width=””設(shè)置為成比文本內(nèi)容短的固定值,最好不要寫(xiě)成wrap_content或者fill_parent。
2,android:singleLine=”true” 表示使用單行文字
android:ellipsize=”marquee”
設(shè)置了文字過(guò)長(zhǎng)時(shí)如何切斷文字,可以有none,start,middle, end, 如果使用走馬燈效果則設(shè)為marquee。
android:focusableInTouchMode=”true”
android:focusable=”true”
android:marqueeRepeatLimit=”marquee_forever”
Android的缺省行為是在控件獲得 Focus時(shí)才會(huì)顯示走馬燈效果。
20.圖片的異步加載的方法?
1.利用軟引用來(lái)緩存圖片Bitmap,用圖片的URL作為緩存查找的Key;
2.設(shè)兩級(jí)緩存,一級(jí)是SoftReference,二級(jí)是本地SD卡;
3.如果兩級(jí)緩存都沒(méi)取到圖片,則從服務(wù)器獲取,并加入緩存;
4.加載完后通過(guò)回調(diào)接口通知UI更新;
21.瀑布流實(shí)現(xiàn)方式?
1)自定義scrollView,動(dòng)態(tài)代碼添加LinearLayout及ImageView
a.自定義scrollView,并且使用監(jiān)聽(tīng)器模式,對(duì)其滾動(dòng)到最頂部、及最底部進(jìn)行監(jiān)聽(tīng)操作。
b.在Activity里對(duì)scrollView的橫向的LinearLayout動(dòng)態(tài)添加列數(shù),每一列是一個(gè)豎向的linearLayout.
c.根據(jù)列數(shù)以及l(fā)ist.size()對(duì)每一列的linearLayout添加ImageView.
d.根據(jù)監(jiān)聽(tīng)器對(duì)其滾動(dòng)到頂部(不做操作)、滾到最底部(加載更多數(shù)據(jù))、正在滾動(dòng)進(jìn)行操作(滾動(dòng)超過(guò)兩屏,回收兩屏之前圖片回收及回滾到之前屏幕圖片重載)。
22.把一張?zhí)貏e大的圖片,分成幾十張小的圖片,在最短的時(shí)間內(nèi)給處理?
http://www.linuxidc.com/Linux/2012-11/73939p2.htm
方法1:如果你將return-data設(shè)置為“true”,你將會(huì)獲得一個(gè)與內(nèi)部數(shù)據(jù)關(guān)聯(lián)的Action,并且bitmap以此方式返回:(Bitmap)extras.getParcelable(“data”)。注意:如果你最終要獲取的圖片非常大,那么此方法會(huì)給你帶來(lái)麻煩,所以你要控制outputX和outputY保持在較小的尺寸。鑒于此原因,在我的代碼中沒(méi)有使用此方法((Bitmap)extras.getParcelable(“data”))。
方法2: 如果你將return-data設(shè)置為“false”,那么在onActivityResult的Intent數(shù)據(jù)中你將不會(huì)接收到任何Bitmap,相反,你需要將MediaStore.EXTRA_OUTPUT關(guān)聯(lián)到一個(gè)Uri,此Uri是用來(lái)存放Bitmap的。但是還有一些條件,首先你需要有一個(gè)短暫的與此Uri相關(guān)聯(lián)的文件地址,當(dāng)然這不是個(gè)大問(wèn)題(除非是那些沒(méi)有sdcard的設(shè)備)。
23.Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念?
DVM指dalivk的虛擬機(jī)。每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。而每一個(gè)DVM進(jìn)程都是在Linux系統(tǒng)中的一個(gè)進(jìn)程,所以可以認(rèn)為是同一個(gè)概念。
Dalvik和Java運(yùn)行環(huán)境的區(qū)別 [
1:Dalvik主要是完成對(duì)象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
2:Dalvik負(fù)責(zé)進(jìn)程隔離和線程管理,每一個(gè)Android應(yīng)用在底層都會(huì)對(duì)應(yīng)一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行。
3:不同于Java虛擬機(jī)運(yùn)行java字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行的是其專有的文件格式Dex 4:dex文件格式可以減少整體文件尺寸,提高I/o操作的類查找速度。
5:odex是為了在運(yùn)行過(guò)程中進(jìn)一步提高性能,對(duì)dex文件的進(jìn)一步優(yōu)化。
6:所有的Android應(yīng)用的線程都對(duì)應(yīng)一個(gè)Linux線程,虛擬機(jī)因而可以更多的依賴操作系統(tǒng)的線程調(diào)度和管理機(jī)制
7:有一個(gè)特殊的虛擬機(jī)進(jìn)程Zygote,他是虛擬機(jī)實(shí)例的孵化器。它在系統(tǒng)啟動(dòng)的時(shí)候就會(huì)產(chǎn)生,它會(huì)完成虛擬機(jī)的初始化,庫(kù)的加載,預(yù)制類庫(kù)和初始化的操作。如果系統(tǒng)需要一個(gè)新的虛擬機(jī)實(shí)例,它會(huì)迅速?gòu)?fù)制自身,以最快的數(shù)據(jù)提供給系統(tǒng)。對(duì)于一些只讀的系統(tǒng)庫(kù),所有虛擬機(jī)實(shí)例都和Zygote共享一塊內(nèi)存區(qū)域。
24.嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,各有何特性 ?
1、虛擬內(nèi)存管理機(jī)制: 有一些嵌入式處理器提供了MMU,在MMU具備內(nèi)存地址映射和尋址功能,它使操作系統(tǒng)的內(nèi)存管理更加方便。如果存在MMU ,操作系統(tǒng)會(huì)使用它完成從虛擬地址到物理地址的轉(zhuǎn)換, 所有的應(yīng)用程序只需要使用虛擬地址尋址數(shù)據(jù)。 這種使用虛擬地址尋址整個(gè)系統(tǒng)的主存和輔存的方式在現(xiàn)代操作系統(tǒng)中被稱為虛擬內(nèi)存。MMU 便是實(shí)現(xiàn)虛擬內(nèi)存的必要條件。 虛擬內(nèi)存的管理方法使系統(tǒng)既可以運(yùn)行體積比物理內(nèi)存還要大的應(yīng)用程序,也可以實(shí)現(xiàn)“按需調(diào)頁(yè)”策略,既滿足了程序的運(yùn)行速度,又節(jié)約了物理內(nèi)存空間。 在L inux系統(tǒng)中,虛擬內(nèi)存機(jī)制的實(shí)現(xiàn)實(shí)現(xiàn)為我們提供了一個(gè)典型的例子:在不同的體系結(jié)構(gòu)下, 使用了三級(jí)或者兩級(jí)頁(yè)式管理,利用MMU 完成從虛擬地址到物理地址之間的轉(zhuǎn)換?;谔摂M內(nèi)存管理的內(nèi)存最大好處是:由于不同進(jìn)程有自己?jiǎn)为?dú)的進(jìn)程空間,十分有效的提高了系統(tǒng)可靠性和安全性。 2、非虛擬內(nèi)存管理機(jī)制: 在實(shí)時(shí)性要求比較高的情況下,很多嵌入式系統(tǒng)并不需要虛擬內(nèi)存機(jī)制:因?yàn)樘摂M內(nèi)存機(jī)制會(huì)導(dǎo)致不確定性的 I/O阻塞時(shí)間, 使得程序運(yùn)行時(shí)間不可預(yù)期,這是實(shí)時(shí)嵌入式系統(tǒng)的致命缺陷;另外,從嵌入式處理器的成本考慮,大多采用不裝配MMU 的嵌入式微處理器。所以大多嵌入式系統(tǒng)采用的是實(shí)存儲(chǔ)器管理策略。因而對(duì)于內(nèi)存的訪問(wèn)是直接的,它對(duì)地址的訪問(wèn)不需要經(jīng)過(guò)MMU,而是直接送到地址線上輸出,所有程序中訪問(wèn)的地址都是實(shí)際的物理地址;而且,大多數(shù)嵌入式操作系統(tǒng)對(duì)內(nèi)存空間沒(méi)有保護(hù),各個(gè)進(jìn)程實(shí)際上共享一個(gè)運(yùn)行空間。一個(gè)進(jìn)程在執(zhí)行前,系統(tǒng)必須為它分配足夠的連續(xù)地址空間,然后全部載入主存儲(chǔ)器的連續(xù)空間。
25.什么是嵌入式實(shí)時(shí)操作系統(tǒng), Android 操作系統(tǒng)屬于實(shí)時(shí)操作系統(tǒng)嗎?
嵌入式實(shí)時(shí)操作系統(tǒng)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時(shí),能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時(shí)間之內(nèi)來(lái)控制生產(chǎn)過(guò)程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)。
嵌入式操作系統(tǒng)主要用于工業(yè)控制、軍事設(shè)備、航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時(shí)間有苛刻的要求,這就需要使用實(shí)時(shí)系統(tǒng)。又可分為軟實(shí)時(shí)和硬實(shí)時(shí)兩種,而 android 是基于 linux 內(nèi)核的,因此屬于軟實(shí)時(shí)。
26.一條最長(zhǎng)的短信息約占多少byte?
一條最長(zhǎng)的短信息約占140byte
27.android中的動(dòng)畫(huà)有哪幾類,它們的特點(diǎn)和區(qū)別是什么?
答:Android中動(dòng)畫(huà)可以分為兩大類:幀動(dòng)畫(huà)、補(bǔ)間動(dòng)畫(huà)
1)補(bǔ)間動(dòng)畫(huà):(你定義一個(gè)開(kāi)始和結(jié)束,中間的部分由程序運(yùn)算得到。就是對(duì)場(chǎng)景里的對(duì)象不斷的進(jìn)行圖像變化來(lái)產(chǎn)生動(dòng)畫(huà)效果(旋轉(zhuǎn)、平移、放縮和漸變))AlphaAnimation(漸變型動(dòng)畫(huà))、scaleAnimation(縮放型動(dòng)畫(huà))、 TranslateAnimation(平移型動(dòng)畫(huà))、 RotateAnimation(旋轉(zhuǎn)型動(dòng)畫(huà))、
2)逐幀動(dòng)畫(huà):Frame(把一連串的圖片進(jìn)行系列化連續(xù)播放,如同放電影的效果),它是通過(guò)播放一張一張圖片來(lái)達(dá)到動(dòng)畫(huà)的效果;
28.handler機(jī)制的原理,looper通過(guò)什么方法開(kāi)始的?
一個(gè)Handler允許你發(fā)送和處理Message和Runable對(duì)象,每個(gè)線程都有自己的Looper,每個(gè)Looper中封裝著MessageQueue。Looper負(fù)責(zé)不斷的從自己的消息隊(duì)列里取出隊(duì)頭的任務(wù)或消息執(zhí)行。每個(gè)handler也和線程關(guān)聯(lián),Handler負(fù)責(zé)把Message和Runable對(duì)象傳遞給MessageQueue(用到post ,sendMessage等方法),而且在這些對(duì)象離開(kāi)MessageQueue時(shí),Handler負(fù)責(zé)執(zhí)行他們(用到handleMessage方法)。
其中Message類就是定義了一個(gè)信息,這個(gè)信息中包含一個(gè)描述符和任意的數(shù)據(jù)對(duì)象,這個(gè)信息被用來(lái)傳遞給Handler.Message對(duì)象提供額外的兩個(gè)int域和一個(gè)Object域。
默認(rèn)情況下一個(gè)線程是不存在消息循環(huán)(message loop)的,需要調(diào)用Looper.prepare()來(lái)給線程創(chuàng)建一個(gè)消息循環(huán),調(diào)用Looper.loop()來(lái)使消息循環(huán)起作用,從消息隊(duì)列里取消息,處理消息。調(diào)用Looper.loop()之后循環(huán)已經(jīng)開(kāi)始,下一個(gè)由handler發(fā)的message將會(huì)被這個(gè)handler的handleMessage方法處理,這是一個(gè)—-循環(huán)。
Looper從MessageQueue中取出Message之后,交由Handler的handleMessage進(jìn)行處理。處理完成后,調(diào)用Message.recycle()將其放入Message Pool中。
29.說(shuō)說(shuō)mvc模式的原理,在android中的運(yùn)用?
答:mvc是model,view,controller的縮寫(xiě),mvc包含三個(gè)部分:
模型(model)對(duì)象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫(xiě)在該層。
視圖(view)對(duì)象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個(gè)mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。
控制器(control)對(duì)象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對(duì)象狀態(tài)的部分,控制器更重要的一種導(dǎo)航功能,響應(yīng)用戶出發(fā)的相關(guān)事件,交給m層處理。
android鼓勵(lì)弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:
1)視圖層(view):一般采用xml文件進(jìn)行界面的描述,使用的時(shí)候可以非常方便的引入,當(dāng)然,如果你對(duì)android了解的比較的多了話,就一定可以想到在android中也可以使用javascript+html等的方式作為view層,當(dāng)然這里需要進(jìn)行java和javascript之間的通信,幸運(yùn)的是,android提供了它們之間非常方便的通信實(shí)現(xiàn)。
2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫(xiě)代碼,要通過(guò)activity交割model業(yè)務(wù)邏輯層處理,這樣做的另外一個(gè)原因是android中的acitivity的響應(yīng)時(shí)間是5s,如果耗時(shí)的操作放在這里,程序就很容易被回收掉。
3)模型層(model):對(duì)數(shù)據(jù)庫(kù)的操作、對(duì)網(wǎng)絡(luò)等的操作都應(yīng)該在model里面處理,當(dāng)然對(duì)業(yè)務(wù)計(jì)算等操作也是必須放在的該層的。
30.如何讓Activity變成一個(gè)窗口?
答:在清單文件AndroidManifest.xml中相應(yīng)的標(biāo)簽內(nèi)設(shè)置屬性android:theme=”@android:style/Theme.Dialog”
31.后臺(tái)的Activity被系統(tǒng)回收怎么辦?
除了在棧頂?shù)腁ctivity,其他的Activity都有可能在內(nèi)存不足的時(shí)候被系統(tǒng)回收,一個(gè)Activity越處于棧底,被回收的可能性就越大。如果我們沒(méi)有覆寫(xiě)onSaveInstanceState()方法,此方法的默認(rèn)實(shí)現(xiàn)會(huì)自動(dòng)保存Activity中的某些狀態(tài)數(shù)據(jù),比如Activity中各種UI空間的狀態(tài)。Android應(yīng)用框架中定義的幾乎所有的UI控件都恰當(dāng)?shù)膶?shí)現(xiàn)了onSaveInstanceState()方法,因此當(dāng)Activity被摧毀和重建時(shí),這些UI控件會(huì)自動(dòng)保存和恢復(fù)狀態(tài)數(shù)據(jù)。比如EditText控件會(huì)自動(dòng)保存和恢復(fù)輸入的數(shù)據(jù),而CheckBox控件會(huì)自動(dòng)保存和恢復(fù)選中狀態(tài)。開(kāi)發(fā)者只需要為這些控件指定一個(gè)唯一的ID(通過(guò)設(shè)置android:id屬性即可),剩余的事情就可以自動(dòng)完成了。如果沒(méi)有為控件指定ID,則這個(gè)控件就不會(huì)進(jìn)行自動(dòng)的數(shù)據(jù)保存和恢復(fù)操作。
由上所述,如果我們需要覆寫(xiě)onSaveInstanceState()方法,一般會(huì)在第一行代碼中調(diào)用該方法的默認(rèn)實(shí)現(xiàn):super.onSaveInstanceState(outState)。
32.ListView優(yōu)化?
答:1)、對(duì)convetView進(jìn)行判空,是當(dāng)convertView不為空的時(shí)候直接重新使用convertView
從而減少了很多不必要的View的創(chuàng)建
2)定義一個(gè)ViewHolder,將convetView的tag設(shè)置為ViewHolder,不為空時(shí)重新使用即可
3)、當(dāng)ListView加載數(shù)據(jù)量較大時(shí)可以采用分頁(yè)加載和圖片異步加載
33.IPC及其原理?
1).Binder通信是如何實(shí)現(xiàn)的?
1.Binder通信是通過(guò)linux的binder driver來(lái)實(shí)現(xiàn)的,
2.Binder通信操作類似線程遷移(thread migration),兩個(gè)進(jìn)程間IPC看起來(lái)就象是一個(gè)進(jìn)程進(jìn)入另一個(gè)進(jìn)程執(zhí)行代碼然后帶著執(zhí)行的結(jié)果返回;
1)IPC(Inter-Process Communication,進(jìn)程間通信),
aidl是 Android Interface definition language的縮寫(xiě),它是一種android內(nèi)部進(jìn)程通信接口的描述語(yǔ)言,通過(guò)它我們可以定義進(jìn)程間的通信接口.編譯器可以通過(guò)擴(kuò)展名為aidl的文件生成一段代碼,通過(guò)預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程的目的.
BroadcastReceiver也可以實(shí)現(xiàn)進(jìn)程間通信
ContentProvider 提供進(jìn)程間數(shù)據(jù)共享
2).Android的 Service工作流程
1.Android虛擬機(jī)啟動(dòng)之前系統(tǒng)會(huì)先啟動(dòng)service Manager進(jìn)程;
2.service Manager打開(kāi)binder驅(qū)動(dòng),并通知binder kernel驅(qū)動(dòng)程序這個(gè)進(jìn)程將作為System Service Manager;
3.然后該進(jìn)程將進(jìn)入一個(gè)循環(huán),等待處理來(lái)自其他進(jìn)程的數(shù)據(jù)。
4.用戶創(chuàng)建一個(gè)System service后,通過(guò)defaultServiceManager得到一個(gè)遠(yuǎn)程ServiceManager的接口,通過(guò)這個(gè)接口我們可以調(diào)用addService函數(shù)將System service添加到Service Manager進(jìn)程中;
5.然后client可以通過(guò)getService獲取到需要連接的目的Service的IBinder對(duì)象,這個(gè)IBinder是Service的BBinder在binder kernel的一個(gè)參考,
6.所以service IBinder 在binder kernel中不會(huì)存在相同的兩個(gè)IBinder對(duì)象,每一個(gè)Client進(jìn)程同樣需要打開(kāi)Binder驅(qū)動(dòng)程序。對(duì)用戶程序而言,我們獲得這個(gè)對(duì)象就可以通過(guò)binder kernel訪問(wèn)service對(duì)象中的方法。
7.Client與Service在不同的進(jìn)程中,通過(guò)這種方式實(shí)現(xiàn)了類似線程間的遷移的通信方式,對(duì)用戶程序而言當(dāng)調(diào)用Service返回的IBinder接口后,訪問(wèn)Service中的方法就如同調(diào)用自己的函數(shù)。
34.View如何刷新?
安卓要更新界面不要在主線程中去做
如果是在線程thread中獲取到了新的數(shù)據(jù),需要配合使用hanlder進(jìn)行刷新.
在線程中刷新View用postinvalidate();
在UI線程中刷新View的方法是invalidate()函數(shù),
當(dāng)調(diào)用線程處于空閑狀態(tài)時(shí),調(diào)onDraw()刷新界面
如果是listView刷新數(shù)據(jù),用adapter.notifyDataSetInvalidated();
adapter.notifyDataSetChanged();
35.DDMS與TraceView的區(qū)別?
DDMS是一個(gè)程序執(zhí)行查看器,在里面可以看見(jiàn)線程和堆棧等信息,TraceView是程序性能分析器 。
36.在Java中如何引入C語(yǔ)言?
java中利用JNI引用本地語(yǔ)言 (java native interface java 本地接口)接口 。
1.在應(yīng)用程序中定義本地接口(native)編譯成.h頭文件,交由C程序員實(shí)現(xiàn),將.c實(shí)現(xiàn)通過(guò)NDk編譯成.so動(dòng)態(tài)鏈接庫(kù)(windows下是.dll, linux下是.so,導(dǎo)入項(xiàng)目中的libs/armeabi,代碼中調(diào)用本地接口,
應(yīng)用場(chǎng)景:音頻,拍攝車牌號(hào)
37.鏈表和數(shù)組的區(qū)別?
數(shù)組是將元素在內(nèi)存中連續(xù)存放,由于每個(gè)元素占用內(nèi)存相同,可以通過(guò)下標(biāo)迅速訪問(wèn)數(shù)組中任何元素。但是如果要在數(shù)組中增加一個(gè)元素,需要移動(dòng)大量元素,在內(nèi)存中空出一個(gè)元素的空間,然后將要增加的元素放在其中。同樣的道理,如果想刪除一個(gè)元素,同樣需要移動(dòng)大量元素去填掉被移動(dòng)的元素。如果應(yīng)用需要快速訪問(wèn)數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組。
鏈表恰好相反,鏈表中的元素在內(nèi)存中不是順序存儲(chǔ)的,而是通過(guò)存在元素中的指針聯(lián)系到一起。比如:上一個(gè)元素有個(gè)指針指到下一個(gè)元素,以此類推,直到最后一個(gè)元素。如果要訪問(wèn)鏈表中一個(gè)元素,需要從第一個(gè)元素開(kāi)始,一直找到需要的元素位置。但是增加和刪除一個(gè)元素對(duì)于鏈表數(shù)據(jù)結(jié)構(gòu)就非常簡(jiǎn)單了,只要修改元素中的指針就可以了。如果應(yīng)用需要經(jīng)常插入和刪除元素你就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了。
二者都屬于一種數(shù)據(jù)結(jié)構(gòu)
(1) 從邏輯結(jié)構(gòu)角度來(lái)看
a, 數(shù)組必須事先定義固定的長(zhǎng)度(元素個(gè)數(shù)),不能適應(yīng)數(shù)據(jù)動(dòng)態(tài)地增減的情況。當(dāng)數(shù)據(jù)增加時(shí),可能超出原先定義的元素個(gè)數(shù);當(dāng)數(shù)據(jù)減少時(shí),造成內(nèi)存浪費(fèi)。
b,鏈表動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配,可以適應(yīng)數(shù)據(jù)動(dòng)態(tài)地增減的情況,且可以方便地插入、刪除數(shù)據(jù)項(xiàng)。(數(shù)組中插入、刪除數(shù)據(jù)項(xiàng)時(shí),需要移動(dòng)其它數(shù)據(jù)項(xiàng))
(2)從內(nèi)存存儲(chǔ)角度來(lái)看
a,(靜態(tài))數(shù)組從棧中分配空間, 對(duì)于程序員方便快速,但自由度小。
b, 鏈表從堆中分配空間, 自由度大但申請(qǐng)管理比較麻煩.
39.Hash表是什么?有什么用?
散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)。也就是說(shuō),它通過(guò)把關(guān)鍵碼值映射到表中一個(gè)位置來(lái)訪問(wèn)記錄,以加快查找的速度。這個(gè)映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表。
給定表M,存在函數(shù)f(key),對(duì)任意給定的關(guān)鍵字值key,代入函數(shù)后若能得到包含該關(guān)鍵字的記錄在表中的地址,則稱表M為哈希(Hash)表,函數(shù)f(key)為哈希(Hash) 函數(shù)
作用:HASH表主要就是提供更快的查找速度,簡(jiǎn)單來(lái)說(shuō)就是分桶。
比如說(shuō)你們學(xué)校的一個(gè)年級(jí)有很多班是吧? 那么現(xiàn)在要查找一位同學(xué)。如果不看班級(jí)直接找,就需要每個(gè)班級(jí)一個(gè)一個(gè)的查找是不? 那現(xiàn)在因?yàn)榉至税嗉?jí),我們有一個(gè)函數(shù)可以通過(guò)名字產(chǎn)生它的班級(jí)號(hào)。比如說(shuō)王勇,二班。 那么現(xiàn)在我們直接hash( 王勇) = 2; 然后我們就直接從2班開(kāi)始找。 如果2班有50個(gè)學(xué)生,那么我們最多查找50次對(duì)嗎? 好。假設(shè)你們年級(jí)一共有10個(gè)班,如果沒(méi)有這個(gè)hash函數(shù),那么直接找,最壞可能要查找50*10=500次。!! 這個(gè)班級(jí)其實(shí)就是每個(gè)桶!! 這就是分桶。。。通過(guò)哈希函數(shù)產(chǎn)生哈希值,然后相同哈希值的元素放在相同的桶里邊。。。!
這樣可以通過(guò)hash這個(gè)間接作用減少查找的時(shí)間和次數(shù)!這就是它的意義!!
40.什么是鎖?有什么用?有哪些鎖?為什么需要鎖?
鎖是為了保證安全性,如程序運(yùn)行時(shí)保證另外的程序不能再對(duì)本程序所使用到的數(shù)據(jù)進(jìn)行某些操作,版本軟件的“不能合并”文件不能同時(shí)被兩人修改等。
鎖分為:線程鎖,數(shù)據(jù)庫(kù)鎖,SVN鎖等等
1、當(dāng)幾個(gè)線程都用到了某個(gè)量,但是這個(gè)量卻能影響程序的運(yùn)行時(shí)就需要線程鎖來(lái)控制一次只能由一個(gè)線程訪問(wèn)這個(gè)量。如果沒(méi)有使用線程鎖會(huì)出現(xiàn)爭(zhēng)用情況。
兩個(gè)或更多的線程或進(jìn)程讀或?qū)懸恍┕蚕頂?shù)據(jù),而最終結(jié)果取決于這些線程是如何被調(diào)度計(jì)時(shí)的。爭(zhēng)用情況可能會(huì)導(dǎo)致不可預(yù)見(jiàn)的結(jié)果和隱蔽的程序錯(cuò)誤。
2、數(shù)據(jù)庫(kù)鎖的作用是防止程序運(yùn)行的時(shí)候其他的程序不能再對(duì)該程序所使用到的數(shù)據(jù)進(jìn)行操作,保護(hù)數(shù)據(jù)的安全性。
3、SVN鎖的作用是防止版本軟件中的“不能合并”的文件(如:圖形文件)不能被多人同時(shí)更改的時(shí)候進(jìn)行鎖定,當(dāng)一個(gè)人對(duì)其進(jìn)行操作時(shí),其他人不能對(duì)這個(gè)文件再進(jìn)行操作,保證了文件的安全性。
41.MVC作用?
答: Android中界面部分也采用了當(dāng)前比較流行的MVC框架。
在Android中:
- 視圖層(View):一般采用XML文件進(jìn)行界面的描述,使用的時(shí)候可以非常方
便的引入。也可以使用JavaScript+HTML等的方式作為View層,通過(guò)WebView組
件加載,同時(shí)可以實(shí)現(xiàn)Java和JavaScript之間的通信。 - 控制層(Controller):這句話也就暗含了不要在Acitivity中寫(xiě)代碼,要通過(guò)Activity
交割Model業(yè)務(wù)邏輯層處理,這樣做的另外一個(gè)原因是Android中的Acitivity的響
應(yīng)時(shí)間是5s,如果耗時(shí)的操作放在這里,Android的控制層的重任通常落在了眾多
的Acitvity的肩上,程序就很容易被回收掉。
3)模型層(Model):對(duì)數(shù)據(jù)庫(kù)的操作、對(duì)網(wǎng)絡(luò)等的操作都應(yīng)該在Model里面處理,
當(dāng)然對(duì)業(yè)務(wù)計(jì)算等操作也是必須放在的該層的。
在Android SDK中的數(shù)據(jù)綁定,也都是采用了與MVC框架類似的方法來(lái)顯示數(shù)據(jù)。在控制層上將數(shù)據(jù)按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就可以直接在視圖模型上顯示了,從而實(shí)現(xiàn)了數(shù)據(jù)綁定。比如顯示Cursor中所有數(shù)據(jù)的ListActivity,其視圖層就是一個(gè)ListView,將數(shù)據(jù)封裝為L(zhǎng)istAdapter,并傳遞給ListView,數(shù)據(jù)就在ListView中顯示。
42.px,dp,sp區(qū)別?
px:
即像素,1px代表屏幕上一個(gè)物理的像素點(diǎn);
px單位不被建議使用,因?yàn)橥瑯?00px的圖片,在不同手機(jī)上顯示的實(shí)際大小可能不同
dp = dip : device independent pixels(設(shè)備獨(dú)立像素). 不同設(shè)備有不同的顯示效果,這個(gè)和設(shè)備硬件有關(guān),一般我們?yōu)榱酥С諻VGA、HVGA和QVGA 推薦使用這個(gè),不依賴像素。
sp:
與縮放無(wú)關(guān)的抽象像素(Scale-independent Pixel)。sp和dp很類似但唯一的區(qū)別是,Android系統(tǒng)允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當(dāng)文字尺寸是“正?!睍r(shí)1sp=1dp=0.00625英寸,而當(dāng)文字尺寸是“大”或“超大”時(shí),1sp>1dp=0.00625英寸。類似我們?cè)趙indows里調(diào)整字體尺寸以后的效果——窗口大小不變,只有文字大小改變。
43.android 系統(tǒng)架構(gòu),按順序?
答:1)應(yīng)用程序?qū)?java語(yǔ)言 應(yīng)用程序開(kāi)發(fā)
2)應(yīng)用程序框架層 java語(yǔ)言 OS定制 framework層開(kāi)發(fā)
3)系統(tǒng)運(yùn)行庫(kù)層 C C++ 實(shí)現(xiàn) so庫(kù)
4)Linux內(nèi)核層
44.android有幾種布局,有什么特點(diǎn)?
答:最常用的布局有以下這幾種:
第一種:幀布局(框架布局)FrameLayout,在這個(gè)布局中,所有的子元素統(tǒng)統(tǒng)放于這塊區(qū)域的左上角,并且后面的子元素直接覆蓋在前面的子元素之上,將前面的子元素部分和全部遮擋。
第二種:線性布局LinearLayout,最常用的一種布局方式,所有子控件的對(duì)齊方式,取決于如何定義 orientation的屬性:vertical 垂直方向 ,如果按照這種方向所有的子控件將按照垂直的方式分布在布局上,每行只允許有一個(gè)子元素,horizontal水平方向 ,這時(shí)子控件將會(huì)以水平的方向分布在布局中。
第三種:絕對(duì)布局AbsoluteLayout,又可以叫做坐標(biāo)布局,可以直接指定子元素的絕對(duì)位置,這種布局簡(jiǎn)單直接,直觀性強(qiáng),但是由于手機(jī)屏幕尺寸差別比較大,使用絕對(duì)定位的適應(yīng)性會(huì)比較差。
第四種:相對(duì)布局RelativeLayout,允許子元素指定它們相對(duì)于其父元素或兄弟元素的位置,這是實(shí)際布局中最常用的布局方式之一。它靈活性大很多,當(dāng)然屬性也多,操作難度也大,屬性之間產(chǎn)生沖突的的可能性也大,使用相對(duì)布局時(shí)要多做些測(cè)試。
第五種:表格布局TableLayout,表格布局TableLayout以行列的形式管理子元素,每一行是一個(gè)TableRow布局對(duì)象,當(dāng)然也可以是普通的View對(duì)象,TableRow里每放一個(gè)元素就是一列,總列數(shù)由列數(shù)最多的那一行決定。
第六種:網(wǎng)格布局 GridLayout,在Android 4.0中,新引入的GridLayout網(wǎng)格布局,GridLayout布局使用虛細(xì)線將布局劃分為行,列和單元格,也支持一個(gè)控件在行,列上都有交錯(cuò)排列。而GridLayout使用的其實(shí)是跟LinearLayout類似的API,只不過(guò)是修改了一下相關(guān)的標(biāo)簽而已,所以對(duì)于開(kāi)發(fā)者來(lái)說(shuō),掌握GridLayout還是很容易的事情。
(Android 4.0的SDK已經(jīng)發(fā)布,在眾多的新增特性中,其中對(duì)開(kāi)發(fā)者來(lái)說(shuō)比較重要的特性之一,是新增的兩種界面布局方式:Space和Gridlayout)
45.常用的設(shè)計(jì)模式?
答:單例模式;工廠模式;
觀察者模式:ContentObserver, 監(jiān)聽(tīng)ContentProvider ContentResolver;
適配器模式Adapter(SimpleAdapter BaseAdapter ArrayAdapter CursorAdapter)以及各種Adapter的數(shù)據(jù)源;
代理模式 AOP;
46.常用的排序法?
答: 冒泡排序 O(n^2) : 冒泡排序也是最簡(jiǎn)單最基本的排序方法之一。冒泡排序的思想很簡(jiǎn)單,就是以此比較相鄰的元素大小,將小的前移,大的后移,就像水中的氣泡一樣,最小的元 素經(jīng)過(guò)幾次移動(dòng),會(huì)最終浮到水面上。
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) :將新來(lái)的元素按順序放入一個(gè)已有的有序序列當(dāng)中。
選擇排序 O(n^2) :第i趟簡(jiǎn)單選擇排序是指通過(guò)n-i次關(guān)鍵字的比較,從n-i+1個(gè)記錄中選出關(guān)鍵字最小的記錄,并和第i個(gè)記錄進(jìn)行交換。共需進(jìn)行i-1趟比較,直到所有記錄排序完成為止。
47.寫(xiě)一個(gè)快速排序法?
快速排序(Quicksort)是對(duì)冒泡排序的一種改進(jìn)。它的基本思想是:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(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...}