Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 常見安卓面試題

常見安卓面試題

編輯:關於Android編程

目錄
1.怎麼實現通知欄到聊天界面的跳轉 3
2.聊天界面左右分隔怎麼實現,怎麼實現優化使其不出現錯位 3
3.視頻,音頻的上傳 3
4.http協議和soap協議的區別 3
5.http和https的區別 4
6.listview的逐行顯示 5
7.edittext中文字的下劃線效果 5
8.activity以及service的生命周期 5
9.安卓系統的理解,優缺點 5
10.sim卡EF文件是什麼 6
11.四大組件哪些能動態注冊 6
12.安卓文件存儲方式 6
13.intent的功能,如何定義顯示intent,隱式intent? 6
14.內存洩露遇見過哪些問題,解決辦法,回收的算法 7
15.接口和抽象類的區別? 7
16.string和stringbuffer和stringbuilder區別? 7
17.html5? 7
18.自定義一個不帶系統邊框的Dialog? 7
19.定義一個跑馬燈效果的textview? 7
20.圖片的異步加載的方法? 8
21. 瀑布流實現方式? 8
22. 把一張特別大的圖片,分成幾十張小的圖片,在最短的時間內給處理? 8
23. Android dvm的進程和Linux的進程, 應用程序的進程是否為同一個概念? 8
24. 嵌入式操作系統內存管理有哪幾種,各有何特性 ? 9
25. 什麼是嵌入式實時操作系統, Android 操作系統屬於實時操作系統嗎? 9
26.一條最長的短信息約占多少byte? 9
27. android中的動畫有哪幾類,它們的特點和區別是什麼? 9
28.handler機制的原理,looper通過什麼方法開始的? 9
29.說說mvc模式的原理,在android中的運用? 10
30.如何讓Activity變成一個窗口? 10
31.後台的Activity被系統回收怎麼辦? 10
32.ListView優化? 10
33.IPC及其原理? 10
34.View如何刷新? 11
35.DDMS與TraceView的區別? 11
36.在Java中如何引入C語言? 11
37.鏈表和數組的區別? 11
39. Hash表是什麼?有什麼用? 12
40. 什麼是鎖?有什麼用?有哪些鎖?為什麼需要鎖? 12
41.MVC作用? 12
42.px,dp,sp區別? 13
43.android 系統架構,按順序? 13
44.android有幾種布局,有什麼特點? 13
45.常用的設計模式? 14
46.常用的排序法? 14
47.寫一個快速排序法? 14
48.synchronized 是什麼?有什麼用? 15
49.線程的狀態? 16
50.onSaveInstanceState() 和 onRestoreInstanceState(); 16
51.了解版本控制的工具嗎? 16
52.github git都是啥? 16
53.git svn 區別? 16
54.舉個簡單的socket編程 16
55.怎樣用數據庫語句實現分頁 18
56.怎樣實現自定義View 18
57.json的上限是多少(大小) 18
58.afinal框架和xUtils框架的區別 18
59.listView上拉加載監聽 18
60.JSON/XML的區別 19
61.JNI怎樣用 19
62.廣播的兩種注冊方式 19
63.android中Serializable和Parcelable的聯系? 19
64.一個應用中有多少個Context? 20
65.AsyncTask與使用線程處理耗時操作的優劣是? 20
66.談談你對Android事件分發機制的理解? 20
67.談談你對ZYGOTE進程的理解和認識? 20
68.第三方注冊及登陸怎麼實現的? 21
69.Fragment怎麼實現的? 22
70.緩存怎麼實現的? 22
71.解析XML PULL解析? 22
72.分享用的什麼平台? 22
73.橫豎屏切換 22
74. 高並發業務請求處理方法 23
75.Android中如何設置兩個應用程序為同一個進程? 23
76.手機適配怎麼做? 24
77. 手機測試包括哪些? 24
78.Http中get和post的區別? 25
79.側滑怎麼實現的? 25
80.UDP和TCP的區別? 25
81.雙緩存怎麼實現的? 25
82.垃圾收集算法的核心思想 26
83.觸發主GC(Garbage Collector)的條件 26
84.減少GC開銷的措施 26
85.gc與finalize方法 26
86.ViewPager如何實現? 26
87.請說出使用equal和==比較對象時的區別? 26
88.什麼是Java序列化和反序列話,如何實現Java序列化? 27
89.請解釋下android程序運行時權限與文件系統權限的區別? 27
90.講一講overload和override的區別,overloaded的方法是否可以改變返回值的類型? 27
91.如何使用socket實現TCP點對點通信? 27
92.請簡述service可能被kill的場景,kill之後如何自啟? 27
93.請使用遞歸方式來遍歷盤下的所有文件,並計算出所有圖片文件的數量? 27
94.現有兩個單向鏈表,我想知道這兩個鏈表的相交情況。(可以不寫實現,但思路必須寫清)? 28
95.使用javac/c++寫一段程序,找出數組中出現次數最多數字,並輸出出現次數,請標明算法的時間復雜值? 29
96.什麼是OAuth,Oauth,的角色,Qauth驗證流程? 30
97.使用javac/c++寫一段程序,找出數組中第K大小的數,輸出數所在的位置,請標明算法的時間復雜度? 30
98.進程通信和線程同步的方法? 31
99.面向對象的特征有哪些方面? 31
100.Context裡面主要包括什麼具體的東西? 32
101.簡述條形碼的掃描設計思路? 32
102. ListView異步加載圖片實現思路(優化篇) 32
103. android下大文件分割上傳 39
104. android listview 異步加載圖片並防止錯位 42

1.怎麼實現通知欄到聊天界面的跳轉
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然後用上述方法即可實現跳轉。

2.聊天界面左右分隔怎麼實現,怎麼實現優化使其不出現錯位
我們可以在adapter裡對消息的發放者進行判斷,如果不是本人發送的那就設置靠左,否則設置靠右,具體實現如下:
封裝消息實體類時,將消息的發送者類型作為Boolean類型存入。在適配數據時,准備兩種item_layout布局文件,一種用於別人的信息展示,另一種用於自己的信息。getView方法加載布局文件之前對消息的發放者進行判斷,如果是本人發送,則加載靠右的布局,否則則使用靠左的布局文件,從而實現動態的位置改變

3.視頻,音頻的上傳
Android的視頻音頻上傳主要就是通過java的socket來進行與服務器的交流,socket通信可以指定一個服務器的地址,然後可以通過io流實現視頻音頻的上傳。

4.http協議和soap協議的區別
HTTP(超文本傳輸協議)是利用TCP在兩台電腦(通常是Web服務器和客戶端)之間傳輸信息的協議。客戶端使用Web浏覽器發起HTTP請求給Web服務器,Web服務器發送被請求的信息給客戶端。

SOAP(Simple Object Access Protocal,簡單對象訪問協議) 技術有助於實現大量異構程序和平台之間的互操作性,根據我有限的了解,SOAP是把成熟的基於HTTP的WEB技術與XML的靈活性和可擴展性組合在了一起。比如我們.NET中的WEB服務,就是基於SOAP。

簡單對象訪問協議(SOAP)是W3C組織的一個Note, 它描述了一種在分散的或分布式的環境中如何交換信息的輕量級協議。SOAP是一個基於XML的協議,它包括三個部分:SOAP封裝(Envelop),封裝定義了一個描述消息中的內容是什麼,是誰發送的,誰應當接受並處理它以及如何處理它們的框架;SOAP編碼規則(Encoding Rules),用於表示應用程序需要使用的數據類型的實例;SOAP RPC表示(RPC Representation),表示遠程過程調用和應答的協定;SOAP可以和多種傳輸協議綁定(Binding),使用底層協議交換信息。在這個文檔中,目前只定義了SOAP如何和HTTP以及HTTP擴展進行綁定的框架。

SOAP是個通信協議, SOAP在HTTP協議的基礎上,把編寫成XML的REQUEST參數, 放在HTTP BODY上提交個WEB SERVICE服務器(SERVLET,ASP什麼的) 處理完成後,結果也寫成XML作為RESPONSE送回用戶端, 為了使用戶端和WEB SERVICE可以相互對應,可以使用WSDL作為這種通信方式的描述文件,利用WSDL工具可以自動生成WS和用戶端的框架文件,SOAP具備把復雜對象序列化捆綁到XML裡去的能力。

SOAP的前身是RPC, 就是遠程呼叫處理的協議,這個協議安全性不是很好,多數防火牆都會阻擋RPC的通信包,而SOAP則使用HTTP協議作為基本的協議,使用端口80使得SOAP可以透過防火牆,完成RPC的功能。

SOAP協議和HTTP協議一樣,都是底層的通信協議,只是請求包的格式不同而已,SOAP包是XML格式的,現在我們編寫WEB SERVICE不需要深入理解SOAP也沒關系。如果SERVICE和CLIENT在同樣的環境下使用SOAP,由於一般情況下都有自動生成SOAP程序框架的工具,因此不知道細節也沒關系. 可是, 如果CLIENT和SERVICE的環境不同,比如說JAVA的Client和.NET的SERVICE進行通信,或者是VB CLIENT和TOMCAT下的JAVA SERVICE通信,還是要知道一點細節為好. 特別是, WSDL或者UDDI都不是標准,如果不讓用就只好手工配制SOAP MESSAGE啦。

5.http和https的區別
在URL前加https://前綴表明是用SSL加密的。你的電腦與服務器之間收發的信息傳輸將更加安全。 Web服務器啟用SSL需要獲得一個服務器證書並將該證書與要使用SSL的服務器綁定。 http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議
要比http協議安全

HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議
它是一個安全通信通道,它基於HTTP開發,用於在客戶計算機和服務器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。
它是由Netscape開發並內置於其浏覽器中,用於對數據進行壓縮和解壓操作,並返回網絡上傳送回的結果。HTTPS實際上應用了Netscape的安全全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用端口443,而不是象HTTP那樣使用端口80來和TCP/IP進行通信。)SSL使用40 位關鍵字作為RC4流加密算法,這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰。
HTTPS和HTTP的區別:
https協議需要到ca申請證書,一般免費證書很少,需要交費。
http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議
http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,後者是443。
http的連接很簡單,是無狀態的
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議 要比http協議安全
HTTPS解決的問題:
1 . 信任主機的問題. 采用https 的server 必須從CA 申請一個用於證明服務器用途類型的證書. 改證書只有用於對應的server 的時候,客戶度才信任次主機. 所以目前所有的銀行系統網站,關鍵部分應用都是https 的. 客戶通過信任該證書,從而信任了該主機. 其實這樣做效率很低,但是銀行更側重安全. 這一點對我們沒有任何意義,我們的server ,采用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server.
2 . 通訊過程中的數據的洩密和被竄改
1. 一般意義上的https, 就是 server 有一個證書.
a) 主要目的是保證server 就是他聲稱的server. 這個跟第一點一樣.
b) 服務端和客戶端之間的所有通訊,都是加密的.
i. 具體講,是客戶端產生一個對稱的密鑰,通過server 的證書來交換密鑰. 一般意義上的握手過程.
ii. 加下來所有的信息往來就都是加密的. 第三方即使截獲,也沒有任何意義.因為他沒有密鑰. 當然竄改也就沒有什麼意義了.
2. 少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書.
a) 這裡客戶端證書,其實就類似表示個人信息的時候,除了用戶名/密碼, 還有一個CA 認證過的身份. 應為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認自己的身份.
b) 目前少數個人銀行的專業版是這種做法,具體證書可能是拿U盤作為一個備份的載體.
HTTPS 一定是繁瑣的.
a) 本來簡單的http協議,一個get一個response. 由於https 要還密鑰和確認加密算法的需要.單握手就需要6/7 個往返.
i. 任何應用中,過多的round trip 肯定影響性能.
b) 接下來才是具體的http協議,每一次響應或者請求, 都要求客戶端和服務端對會話的內容做加密/解密.
i. 盡管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 芯片. 如果CPU 信能比較低的話,肯定會降低性能,從而不能serve 更多的請求.
ii. 加密後數據量的影響. 所以,才會出現那麼多的安全認證提示

6.listview的逐行顯示
可以將每一條數據先加載到list集合中,然後通過適配器將每一條數據加載到listview中實現listview對數據的逐行顯示。

7.edittext中文字的下劃線效果
自定義一個·EditText的派生類,LineEditText,在LineEditText類的OnDraw函數中實現畫一條下劃線的功能

8.activity以及service的生命周期
activity
onCreate(Bundle savedInstanceState) 第一次創建時調用
onStart() 被用戶可見時調用
onRestart() 當Activity處於stop狀態又被重新啟動時調用
onResume() 當獲得焦點即可與用戶交互時調用
onPause() 當失去焦點時調用
onStop() 當不可見時調用
onDestroy() 當銷毀時調用

service
startService:onCreate()- >onStartCommand()->startService()->onDestroy()
BindService:onCreate()->onBind()->onUnbind()->onDestroy()

9.安卓系統的理解,優缺點
Android一詞的本義指“機器人”,同時也是Google於2007年11月5日 宣布的基於Linux平台的開源手機操作系統的名稱,該平台由操作系統、中間件
、用戶界面和應用軟件組成。

版本:每個版本代表的甜點的尺寸越變越大,然後按照26個字母數序:紙杯蛋糕(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分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和Linux內核層。

Android開發四大組件分別是:活動(Activity): 用於表現功能。服務(Service): 後台運行服務,不提供界面呈現。廣播接收器(BroadcastReceiver):用於接收廣播。內容提供商(Content Provider): 支持在多個應用中存儲和讀取數據,相當於數據庫。
優點:開放性,掙脫束縛,豐富硬件,Google應用
缺點:版本過多,升級過快
用戶體驗不一致
10.sim卡EF文件是什麼
SIM卡裡的所有文件按樹來組織:
1>主文件MF(Master File)——每一塊SIM卡只有一個唯一的主文件, 其他所有文件都是它的子孫, 主文件只有文件頭,裡面存放著整個SIM卡的控制和管理信息
2>專用文件DF(Dedicated File)——也是只有一個文件頭, 裡面存放著整個目錄的管理控制信息, 專用文件相當於一個目錄的根.
3>基本文件EF(Elementary File)——既有文件頭,也有文件體, 文件頭存放該文件的位置和控制信息, 文件體存放真正的數據, 整個SIM卡中只有基本文件有文件體, 也只有基本文件才用來存放數據.

11.四大組件哪些能動態注冊
廣播

12.安卓文件存儲方式
文件的操作模式:
Context.MODE_PRIVATE 為默認的操作模式,代表該文件私有,只能被應用本身使用,覆蓋源文件
  Context.APPEND 為追加模式,私有的。存在就往文件追加內容
  Context.MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取
  Context.MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入
  如果希望文件被其他應用讀和寫,可以傳入:
  openFileOutput(“zhgang.txt”,Context.MODE_WORLD_READABLE+
  Context.MODE_WORLD_WRITEABLE);
  android有一套自己的安全模型,當應用程序(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如文件的時候
  就需要userid匹配。默認情況下,任何應用創建文件,sharedprefernces,數據庫都應該是私有的(位於/data/data//files),
  其他程序無法訪問,除非在創建時指定了Context.MODE_WORLD_READABLE,Context.MODE_WORLD_WRITEABLE,只有這樣其他程序才能正確訪問

13.intent的功能,如何定義顯示intent,隱式intent?
在一個Android應用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通訊中,由Intent協助完成。
Intent傳遞過程中,要找到目標消費者(另一個Activity,IntentReceiver或Service),也就是Intent的響應者,有兩種方法來匹配:
顯示intent:代碼簡潔明了,執行了函數,就會馬上跳轉到指定的Activity中(Intent i = new Intent(Test.this,TestB.class);
this.startActivity(i);)。
隱式intent:隱式匹配,首先要匹配Intent的幾項值:Action(要執行的動作), Category(要執行動作的目標所具有的特質或行為歸類), Data/extras(即執行動作要操作的數據和傳遞到目的的附加信息),type(要執行的目標Activity所能處理的MIME數據類型)Component
如果填寫了Componet就是上例中的Test.class)這就形成了顯示匹配。

14.內存洩露遇見過哪些問題,解決辦法,回收的算法
問題:運行兩次後的輸出結果,程序退出了,後台仍然有兩個線程在跑,無法被釋放,如果是大程序,就會導致:一、耗電;二、內存洩露。
解決方法:
在程序銷毀的時候,要通過Handler的removeCallbacks(Runnable r)方法來手動釋放掉該線程,當然要把Runnable單獨提出來寫。使用完後,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存洩漏了。??

回收算法:tracing算法(Tracing Collector),compacting算法(Compacting Collector),copying算法(Coping Collector),generation算法(Generational Collector),adaptive算法(Adaptive Collector)

15.接口和抽象類的區別?
abstract可以修飾抽象方法,而一個類只要有一個抽象方法,就必須用abstract定義該類,即抽象類。
用interface修飾的類,裡面的方法都是抽象方法,因此在定義接口的時候,可以直接不加那些修飾,系統會默認的添上去。接口裡面的字段都是公有常量,即public static final修飾的字段。

16.string和stringbuffer和stringbuilder區別?
STRING的長度是不可變的,STRINGBUFFER的長度是可變的。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法。
stringbuilder類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。

17.html5?
HTML5是用於取代1999年所制定的 HTML 4.01 和 XHTML 1.0 標准的 HTML [1](標准通用標記語言下的一個應用)標准版本;現在仍處於發展階段,但大部分浏覽器已經支持某些 HTML5 技術。HTML 5有兩大特點:首先,強化了 Web 網頁的表現性能。其次,追加了本地數據庫等 Web 應用的功能。廣義論及HTML5時,實際指的是包括HTML、CSS和JavaScript在內的一套技術組合。它希望能夠減少浏覽器對於需要插件的豐富性網絡應用服務(plug-in-based rich internet application,RIA),如Adobe Flash、Microsoft Silverlight,與Oracle JavaFX的需求,並且提供更多能有效增強網絡應用的標准集。
是一種標記語言。

18.自定義一個不帶系統邊框的Dialog?
首先定義樣式文件style.xml,邊框設計windowframe屬性為@null,將背景設置為自己想要的背景,將自定義dialog繼承Dialog,將布局文件載入,創建dialog,並將自己設置的樣式文件加載進去,最終實現自定義的Dialog.

19.定義一個跑馬燈效果的textview?
顯示跑馬燈效果的前提條件就是你的文本內容要比顯示文本的外部組件長,即外部組件無法完整的顯示。
內部的文本內容。
1、layout_width=””設置為成比文本內容短的固定值,最好不要寫成wrap_content或者fill_parent。
2,android:singleLine=”true” 表示使用單行文字
android:ellipsize=”marquee”
設置了文字過長時如何切斷文字,可以有none,start,middle, end, 如果使用走馬燈效果則設為marquee。
android:focusableInTouchMode=”true”
android:focusable=”true”
android:marqueeRepeatLimit=”marquee_forever”
Android的缺省行為是在控件獲得 Focus時才會顯示走馬燈效果。

20.圖片的異步加載的方法?
1.利用軟引用來緩存圖片Bitmap,用圖片的URL作為緩存查找的Key;
2.設兩級緩存,一級是SoftReference,二級是本地SD卡;
3.如果兩級緩存都沒取到圖片,則從服務器獲取,並加入緩存;
4.加載完後通過回調接口通知UI更新;

21.瀑布流實現方式?
1)自定義scrollView,動態代碼添加LinearLayout及ImageView
a.自定義scrollView,並且使用監聽器模式,對其滾動到最頂部、及最底部進行監聽操作。
b.在Activity裡對scrollView的橫向的LinearLayout動態添加列數,每一列是一個豎向的linearLayout.
c.根據列數以及list.size()對每一列的linearLayout添加ImageView.
d.根據監聽器對其滾動到頂部(不做操作)、滾到最底部(加載更多數據)、正在滾動進行操作(滾動超過兩屏,回收兩屏之前圖片回收及回滾到之前屏幕圖片重載)。

22.把一張特別大的圖片,分成幾十張小的圖片,在最短的時間內給處理?
http://www.linuxidc.com/Linux/2012-11/73939p2.htm
方法1:如果你將return-data設置為“true”,你將會獲得一個與內部數據關聯的Action,並且bitmap以此方式返回:(Bitmap)extras.getParcelable(“data”)。注意:如果你最終要獲取的圖片非常大,那麼此方法會給你帶來麻煩,所以你要控制outputX和outputY保持在較小的尺寸。鑒於此原因,在我的代碼中沒有使用此方法((Bitmap)extras.getParcelable(“data”))。
方法2: 如果你將return-data設置為“false”,那麼在onActivityResult的Intent數據中你將不會接收到任何Bitmap,相反,你需要將MediaStore.EXTRA_OUTPUT關聯到一個Uri,此Uri是用來存放Bitmap的。但是還有一些條件,首先你需要有一個短暫的與此Uri相關聯的文件地址,當然這不是個大問題(除非是那些沒有sdcard的設備)。
23.Android dvm的進程和Linux的進程, 應用程序的進程是否為同一個概念?
DVM指dalivk的虛擬機。每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM進程都是在Linux系統中的一個進程,所以可以認為是同一個概念。
Dalvik和Java運行環境的區別  [
1:Dalvik主要是完成對象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。   
2:Dalvik負責進程隔離和線程管理,每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。   
3:不同於Java虛擬機運行java字節碼,Dalvik虛擬機運行的是其專有的文件格式Dex    4:dex文件格式可以減少整體文件尺寸,提高I/o操作的類查找速度。   
5:odex是為了在運行過程中進一步提高性能,對dex文件的進一步優化。   
6:所有的Android應用的線程都對應一個Linux線程,虛擬機因而可以更多的依賴操作系統的線程調度和管理機制   
7:有一個特殊的虛擬機進程Zygote,他是虛擬機實例的孵化器。它在系統啟動的時候就會產生,它會完成虛擬機的初始化,庫的加載,預制類庫和初始化的操作。如果系統需要一個新的虛擬機實例,它會迅速復制自身,以最快的數據提供給系統。對於一些只讀的系統庫,所有虛擬機實例都和Zygote共享一塊內存區域。
24.嵌入式操作系統內存管理有哪幾種,各有何特性 ?
1、虛擬內存管理機制: 有一些嵌入式處理器提供了MMU,在MMU具備內存地址映射和尋址功能,它使操作系統的內存管理更加方便。如果存在MMU ,操作系統會使用它完成從虛擬地址到物理地址的轉換, 所有的應用程序只需要使用虛擬地址尋址數據。 這種使用虛擬地址尋址整個系統的主存和輔存的方式在現代操作系統中被稱為虛擬內存。MMU 便是實現虛擬內存的必要條件。 虛擬內存的管理方法使系統既可以運行體積比物理內存還要大的應用程序,也可以實現“按需調頁”策略,既滿足了程序的運行速度,又節約了物理內存空間。 在L inux系統中,虛擬內存機制的實現實現為我們提供了一個典型的例子:在不同的體系結構下, 使用了三級或者兩級頁式管理,利用MMU 完成從虛擬地址到物理地址之間的轉換。基於虛擬內存管理的內存最大好處是:由於不同進程有自己單獨的進程空間,十分有效的提高了系統可靠性和安全性。 2、非虛擬內存管理機制: 在實時性要求比較高的情況下,很多嵌入式系統並不需要虛擬內存機制:因為虛擬內存機制會導致不確定性的 I/O阻塞時間, 使得程序運行時間不可預期,這是實時嵌入式系統的致命缺陷;另外,從嵌入式處理器的成本考慮,大多采用不裝配MMU 的嵌入式微處理器。所以大多嵌入式系統采用的是實存儲器管理策略。因而對於內存的訪問是直接的,它對地址的訪問不需要經過MMU,而是直接送到地址線上輸出,所有程序中訪問的地址都是實際的物理地址;而且,大多數嵌入式操作系統對內存空間沒有保護,各個進程實際上共享一個運行空間。一個進程在執行前,系統必須為它分配足夠的連續地址空間,然後全部載入主存儲器的連續空間。

25.什麼是嵌入式實時操作系統, Android 操作系統屬於實時操作系統嗎?
嵌入式實時操作系統是指當外界事件或數據產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致運行的嵌入式操作系統。
嵌入式操作系統主要用於工業控制、軍事設備、航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而 android 是基於 linux 內核的,因此屬於軟實時。
26.一條最長的短信息約占多少byte?
一條最長的短信息約占140byte

27.android中的動畫有哪幾類,它們的特點和區別是什麼?
答:Android中動畫可以分為兩大類:幀動畫、補間動畫
1)補間動畫:(你定義一個開始和結束,中間的部分由程序運算得到。就是對場景裡的對象不斷的進行圖像變化來產生動畫效果(旋轉、平移、放縮和漸變))AlphaAnimation(漸變型動畫)、scaleAnimation(縮放型動畫)、 TranslateAnimation(平移型動畫)、 RotateAnimation(旋轉型動畫)、
2)逐幀動畫:Frame(把一連串的圖片進行系列化連續播放,如同放電影的效果),它是通過播放一張一張圖片來達到動畫的效果;
28.handler機制的原理,looper通過什麼方法開始的?
一個Handler允許你發送和處理Message和Runable對象,每個線程都有自己的Looper,每個Looper中封裝著MessageQueue。Looper負責不斷的從自己的消息隊列裡取出隊頭的任務或消息執行。每個handler也和線程關聯,Handler負責把Message和Runable對象傳遞給MessageQueue(用到post ,sendMessage等方法),而且在這些對象離開MessageQueue時,Handler負責執行他們(用到handleMessage方法)。
其中Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域。
默認情況下一個線程是不存在消息循環(message loop)的,需要調用Looper.prepare()來給線程創建一個消息循環,調用Looper.loop()來使消息循環起作用,從消息隊列裡取消息,處理消息。調用Looper.loop()之後循環已經開始,下一個由handler發的message將會被這個handler的handleMessage方法處理,這是一個—-循環。
Looper從MessageQueue中取出Message之後,交由Handler的handleMessage進行處理。處理完成後,調用Message.recycle()將其放入Message Pool中。
29.說說mvc模式的原理,在android中的運用?
答:mvc是model,view,controller的縮寫,mvc包含三個部分:
  模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。
  視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
  控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給m層處理。
  android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:
  1)視圖層(view):一般采用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如果你對android了解的比較的多了話,就一定可以想到在android中也可以使用javascript+html等的方式作為view層,當然這裡需要進行java和javascript之間的通信,幸運的是,android提供了它們之間非常方便的通信實現。
  2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業務邏輯層處理,這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這裡,程序就很容易被回收掉。
  3)模型層(model):對數據庫的操作、對網絡等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。

30.如何讓Activity變成一個窗口?
答:在清單文件AndroidManifest.xml中相應的標簽內設置屬性android:theme=”@android:style/Theme.Dialog”

31.後台的Activity被系統回收怎麼辦?
除了在棧頂的Activity,其他的Activity都有可能在內存不足的時候被系統回收,一個Activity越處於棧底,被回收的可能性就越大。如果我們沒有覆寫onSaveInstanceState()方法,此方法的默認實現會自動保存Activity中的某些狀態數據,比如Activity中各種UI空間的狀態。Android應用框架中定義的幾乎所有的UI控件都恰當的實現了onSaveInstanceState()方法,因此當Activity被摧毀和重建時,這些UI控件會自動保存和恢復狀態數據。比如EditText控件會自動保存和恢復輸入的數據,而CheckBox控件會自動保存和恢復選中狀態。開發者只需要為這些控件指定一個唯一的ID(通過設置android:id屬性即可),剩余的事情就可以自動完成了。如果沒有為控件指定ID,則這個控件就不會進行自動的數據保存和恢復操作。
由上所述,如果我們需要覆寫onSaveInstanceState()方法,一般會在第一行代碼中調用該方法的默認實現:super.onSaveInstanceState(outState)。
32.ListView優化?
答:1)、對convetView進行判空,是當convertView不為空的時候直接重新使用convertView
從而減少了很多不必要的View的創建
2)定義一個ViewHolder,將convetView的tag設置為ViewHolder,不為空時重新使用即可
3)、當ListView加載數據量較大時可以采用分頁加載和圖片異步加載

33.IPC及其原理?

1).Binder通信是如何實現的?
1.Binder通信是通過linux的binder driver來實現的,
2.Binder通信操作類似線程遷移(thread migration),兩個進程間IPC看起來就象是一個進程進入另一個進程執行代碼然後帶著執行的結果返回;
1)IPC(Inter-Process Communication,進程間通信),
aidl是 Android Interface definition language的縮寫,它是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口.編譯器可以通過擴展名為aidl的文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程的目的.
BroadcastReceiver也可以實現進程間通信
ContentProvider 提供進程間數據共享
2).Android的 Service工作流程
1.Android虛擬機啟動之前系統會先啟動service Manager進程;
2.service Manager打開binder驅動,並通知binder kernel驅動程序這個進程將作為System Service Manager;
3.然後該進程將進入一個循環,等待處理來自其他進程的數據。
4.用戶創建一個System service後,通過defaultServiceManager得到一個遠程ServiceManager的接口,通過這個接口我們可以調用addService函數將System service添加到Service Manager進程中;
5.然後client可以通過getService獲取到需要連接的目的Service的IBinder對象,這個IBinder是Service的BBinder在binder kernel的一個參考,
6.所以service IBinder 在binder kernel中不會存在相同的兩個IBinder對象,每一個Client進程同樣需要打開Binder驅動程序。對用戶程序而言,我們獲得這個對象就可以通過binder kernel訪問service對象中的方法。
7.Client與Service在不同的進程中,通過這種方式實現了類似線程間的遷移的通信方式,對用戶程序而言當調用Service返回的IBinder接口後,訪問Service中的方法就如同調用自己的函數。
34.View如何刷新?
安卓要更新界面不要在主線程中去做
如果是在線程thread中獲取到了新的數據,需要配合使用hanlder進行刷新.
在線程中刷新View用postinvalidate();
在UI線程中刷新View的方法是invalidate()函數,
當調用線程處於空閒狀態時,調onDraw()刷新界面

如果是listView刷新數據,用adapter.notifyDataSetInvalidated();
adapter.notifyDataSetChanged();
35.DDMS與TraceView的區別?
DDMS是一個程序執行查看器,在裡面可以看見線程和堆棧等信息,TraceView是程序性能分析器 。
36.在Java中如何引入C語言?

java中利用JNI引用本地語言 (java native interface java 本地接口)接口 。
1.在應用程序中定義本地接口(native)編譯成.h頭文件,交由C程序員實現,將.c實現通過NDk編譯成.so動態鏈接庫(windows下是.dll, linux下是.so,導入項目中的libs/armeabi,代碼中調用本地接口,
應用場景:音頻,拍攝車牌號
37.鏈表和數組的區別?
數組是將元素在內存中連續存放,由於每個元素占用內存相同,可以通過下標迅速訪問數組中任何元素。但是如果要在數組中增加一個元素,需要移動大量元素,在內存中空出一個元素的空間,然後將要增加的元素放在其中。同樣的道理,如果想刪除一個元素,同樣需要移動大量元素去填掉被移動的元素。如果應用需要快速訪問數據,很少或不插入和刪除元素,就應該用數組。
鏈表恰好相反,鏈表中的元素在內存中不是順序存儲的,而是通過存在元素中的指針聯系到一起。比如:上一個元素有個指針指到下一個元素,以此類推,直到最後一個元素。如果要訪問鏈表中一個元素,需要從第一個元素開始,一直找到需要的元素位置。但是增加和刪除一個元素對於鏈表數據結構就非常簡單了,只要修改元素中的指針就可以了。如果應用需要經常插入和刪除元素你就需要用鏈表數據結構了。
二者都屬於一種數據結構
  (1) 從邏輯結構角度來看
   a, 數組必須事先定義固定的長度(元素個數),不能適應數據動態地增減的情況。當數據增加時,可能超出原先定義的元素個數;當數據減少時,造成內存浪費。
   b,鏈表動態地進行存儲分配,可以適應數據動態地增減的情況,且可以方便地插入、刪除數據項。(數組中插入、刪除數據項時,需要移動其它數據項)
  (2)從內存存儲角度來看
   a,(靜態)數組從棧中分配空間, 對於程序員方便快速,但自由度小。
   b, 鏈表從堆中分配空間, 自由度大但申請管理比較麻煩.
39.Hash表是什麼?有什麼用?
散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。
給定表M,存在函數f(key),對任意給定的關鍵字值key,代入函數後若能得到包含該關鍵字的記錄在表中的地址,則稱表M為哈希(Hash)表,函數f(key)為哈希(Hash) 函數
作用:HASH表主要就是提供更快的查找速度,簡單來說就是分桶。
比如說你們學校的一個年級有很多班是吧? 那麼現在要查找一位同學。如果不看班級直接找,就需要每個班級一個一個的查找是不? 那現在因為分了班級,我們有一個函數可以通過名字產生它的班級號。比如說王勇,二班。 那麼現在我們直接hash( 王勇) = 2; 然後我們就直接從2班開始找。 如果2班有50個學生,那麼我們最多查找50次對嗎? 好。假設你們年級一共有10個班,如果沒有這個hash函數,那麼直接找,最壞可能要查找50*10=500次。!! 這個班級其實就是每個桶!! 這就是分桶。。。通過哈希函數產生哈希值,然後相同哈希值的元素放在相同的桶裡邊。。。!
這樣可以通過hash這個間接作用減少查找的時間和次數!這就是它的意義!!
40.什麼是鎖?有什麼用?有哪些鎖?為什麼需要鎖?
鎖是為了保證安全性,如程序運行時保證另外的程序不能再對本程序所使用到的數據進行某些操作,版本軟件的“不能合並”文件不能同時被兩人修改等。
鎖分為:線程鎖,數據庫鎖,SVN鎖等等
1、當幾個線程都用到了某個量,但是這個量卻能影響程序的運行時就需要線程鎖來控制一次只能由一個線程訪問這個量。如果沒有使用線程鎖會出現爭用情況。
兩個或更多的線程或進程讀或寫一些共享數據,而最終結果取決於這些線程是如何被調度計時的。爭用情況可能會導致不可預見的結果和隱蔽的程序錯誤。
2、數據庫鎖的作用是防止程序運行的時候其他的程序不能再對該程序所使用到的數據進行操作,保護數據的安全性。
3、SVN鎖的作用是防止版本軟件中的“不能合並”的文件(如:圖形文件)不能被多人同時更改的時候進行鎖定,當一個人對其進行操作時,其他人不能對這個文件再進行操作,保證了文件的安全性。
41.MVC作用?
答: Android中界面部分也采用了當前比較流行的MVC框架。
在Android中:
1) 視圖層(View):一般采用XML文件進行界面的描述,使用的時候可以非常方
便的引入。也可以使用JavaScript+HTML等的方式作為View層,通過WebView組
件加載,同時可以實現Java和JavaScript之間的通信。
2) 控制層(Controller):這句話也就暗含了不要在Acitivity中寫代碼,要通過Activity
交割Model業務邏輯層處理,這樣做的另外一個原因是Android中的Acitivity的響
應時間是5s,如果耗時的操作放在這裡,Android的控制層的重任通常落在了眾多
的Acitvity的肩上,程序就很容易被回收掉。
3)模型層(Model):對數據庫的操作、對網絡等的操作都應該在Model裡面處理,
當然對業務計算等操作也是必須放在的該層的。
在Android SDK中的數據綁定,也都是采用了與MVC框架類似的方法來顯示數據。在控制層上將數據按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就可以直接在視圖模型上顯示了,從而實現了數據綁定。比如顯示Cursor中所有數據的ListActivity,其視圖層就是一個ListView,將數據封裝為ListAdapter,並傳遞給ListView,數據就在ListView中顯示。

42.px,dp,sp區別?
px:
即像素,1px代表屏幕上一個物理的像素點;
px單位不被建議使用,因為同樣100px的圖片,在不同手機上顯示的實際大小可能不同
dp = dip : device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
sp:
與縮放無關的抽象像素(Scale-independent Pixel)。sp和dp很類似但唯一的區別是,Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是“正常”時1sp=1dp=0.00625英寸,而當文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸。類似我們在windows裡調整字體尺寸以後的效果——窗口大小不變,只有文字大小改變。
43.android 系統架構,按順序?
答:1)應用程序層 java語言 應用程序開發
2)應用程序框架層 java語言 OS定制 framework層開發
3)系統運行庫層 C C++ 實現 so庫
4)Linux內核層

44.android有幾種布局,有什麼特點?
答:最常用的布局有以下這幾種:
第一種:幀布局(框架布局)FrameLayout,在這個布局中,所有的子元素統統放於這塊區域的左上角,並且後面的子元素直接覆蓋在前面的子元素之上,將前面的子元素部分和全部遮擋。
第二種:線性布局LinearLayout,最常用的一種布局方式,所有子控件的對齊方式,取決於如何定義 orientation的屬性:vertical 垂直方向 ,如果按照這種方向所有的子控件將按照垂直的方式分布在布局上,每行只允許有一個子元素,horizontal水平方向 ,這時子控件將會以水平的方向分布在布局中。
第三種:絕對布局AbsoluteLayout,又可以叫做坐標布局,可以直接指定子元素的絕對位置,這種布局簡單直接,直觀性強,但是由於手機屏幕尺寸差別比較大,使用絕對定位的適應性會比較差。
第四種:相對布局RelativeLayout,允許子元素指定它們相對於其父元素或兄弟元素的位置,這是實際布局中最常用的布局方式之一。它靈活性大很多,當然屬性也多,操作難度也大,屬性之間產生沖突的的可能性也大,使用相對布局時要多做些測試。
第五種:表格布局TableLayout,表格布局TableLayout以行列的形式管理子元素,每一行是一個TableRow布局對象,當然也可以是普通的View對象,TableRow裡每放一個元素就是一列,總列數由列數最多的那一行決定。
第六種:網格布局 GridLayout,在Android 4.0中,新引入的GridLayout網格布局,GridLayout布局使用虛細線將布局劃分為行,列和單元格,也支持一個控件在行,列上都有交錯排列。而GridLayout使用的其實是跟LinearLayout類似的API,只不過是修改了一下相關的標簽而已,所以對於開發者來說,掌握GridLayout還是很容易的事情。

(Android 4.0的SDK已經發布,在眾多的新增特性中,其中對開發者來說比較重要的特性之一,是新增的兩種界面布局方式:Space和Gridlayout)

45.常用的設計模式?
答:單例模式;工廠模式;
觀察者模式:ContentObserver, 監聽ContentProvider ContentResolver;
適配器模式Adapter(SimpleAdapter BaseAdapter ArrayAdapter CursorAdapter)以及各種Adapter的數據源;
代理模式 AOP;
46.常用的排序法?
答: 冒泡排序 O(n^2) : 冒泡排序也是最簡單最基本的排序方法之一。冒泡排序的思想很簡單,就是以此比較相鄰的元素大小,將小的前移,大的後移,就像水中的氣泡一樣,最小的元 素經過幾次移動,會最終浮到水面上。
for (int i = 0; i < num.length; i++) {
// 內循環控制比較後移位
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) : 快速排序采用的思想是分治思想。快速排序算法的核心算法是分區操作,即如何調整基准的位置以及調整返回基准的最終位置以便分治遞歸。
插入排序 O(n^2) :將新來的元素按順序放入一個已有的有序序列當中。
選擇排序 O(n^2) :第i趟簡單選擇排序是指通過n-i次關鍵字的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i個記錄進行交換。共需進行i-1趟比較,直到所有記錄排序完成為止。

47.寫一個快速排序法?
快速排序(Quicksort)是對冒泡排序的一種改進。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved