常見(jiàn)安卓面試題2018(能夠幫助到你很欣慰)


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

  1. 瀑布流實(shí)現(xiàn)方式? 8
  2. 把一張?zhí)貏e大的圖片,分成幾十張小的圖片,在最短的時(shí)間內(nèi)給處理? 8
  3. Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念? 8
  4. 嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,各有何特性 ? 9
  5. 什么是嵌入式實(shí)時(shí)操作系統(tǒng), Android 操作系統(tǒng)屬于實(shí)時(shí)操作系統(tǒng)嗎? 9
    26.一條最長(zhǎng)的短信息約占多少byte? 9
  6. 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
  7. Hash表是什么?有什么用? 12
  8. 什么是鎖?有什么用?有哪些鎖?為什么需要鎖? 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
  9. 高并發(fā)業(yè)務(wù)請(qǐng)求處理方法 23
    75.Android中如何設(shè)置兩個(gè)應(yīng)用程序?yàn)橥粋€(gè)進(jìn)程? 23
    76.手機(jī)適配怎么做? 24
  10. 手機(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
  11. ListView異步加載圖片實(shí)現(xiàn)思路(優(yōu)化篇) 32
  12. android下大文件分割上傳 39
  13. 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ù)的泄密和被竄改

  1. 一般意義上的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)有什么意義了.
  2. 少許對(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中:

  1. 視圖層(View):一般采用XML文件進(jìn)行界面的描述,使用的時(shí)候可以非常方
    便的引入。也可以使用JavaScript+HTML等的方式作為View層,通過(guò)WebView組
    件加載,同時(shí)可以實(shí)現(xiàn)Java和JavaScript之間的通信。
  2. 控制層(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...}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容