近來,看了一本書,名字叫作《第一行代碼》,是CSDN一名博主寫的,一本Android入門級的書,比較適合新手。看了書以後,有感而發,想來進行Android開發已經有一年多了,但欠缺系統化的學習,知識雜亂無章,沒有條理和總結。所以,想一想我是否能夠嘗試的寫些文章,來對本身以前學過的知識和工做經驗進行概括和整理,整理出本身的知識體系呢。因此,就有這篇文章的誕生,若是其中理解不到位的地方,望園裏的兄弟姐妹給予指出錯誤,咱們共同討論,一塊兒進步。我一直相信一句話,好東西要分享,不斷地分享,直至溫暖整個世界。
目前安排是一週一篇文章,由於從前期每篇文章主題的思考,素材收集,代碼驗證,思惟導圖設計,是很耗時間的,若是碰到問題沒解決的話,就順延到下一週,寧願速度慢點,但要保證寫出來的東西是原創的,對人有幫助才行。
這篇的主題是」什麼是Android「,關於Android的內容,從如下幾點來介紹:
- Android系統架構
- Andorid已發佈的版本
- Android應用特點
- Android開發環境
- Android程序結構
- Logcat工具
- Hello World
1,Android系統架構
有圖有真相:
這是Android系統架構圖,夠一目瞭然了吧,Android大體能夠分爲四層架構,五塊區域。
- Linux內核層(Linux Kernel)
- 系統運行層
- 應用框架層(Application Framework)
- 應用層(Applications)
1.1,Linux內核層
Android系統是基於Linux 2.6內核的,這一層爲Android設備的各類硬件提供了底層的驅動,如顯示驅動、音頻驅動、照相機驅動、藍牙驅動、WiFi驅動、電源管理等。
1.2,系統運行層
這一層經過一些C/C++庫來爲Android系統提供了主要的特性支持,好比SQLite庫提供了數據庫的支持,OpenGL|ES庫提供了3D繪圖的支持,Webkit庫提供瀏覽器內核的支持等。同時,在這一層還有Android運行時庫,它提供了一些核心庫,能容許開發者使用Java來編寫Android應用。其中,關鍵是Dalvik虛擬機,它使得咱們每個Android應用都能運行在獨立的進程當中,而且擁有一個本身的Dalvik虛擬機實例,相比Java虛擬機(JVM),Dalvik是專門爲移動設備定製的,它對手機內存、CPU性能有限等狀況作了優化處理。
1.3,應用框架層
這一層主要提供了構建應用時可能用到的API,Android自帶的一些核心應用程序就是使用這些API完成的,開發者能夠經過使用這些API構建本身的應用程序。好比有活動管理器、View系統。內容提供器、通知管理器等。
1.4,應用層
全部安裝在手機上的應用程序都是屬於這一層的,好比系統自帶的聯繫人、短信等程序,或者咱們從Google Play上下載的程序,包括咱們本身開發的應用程序。
2,Android已發佈的版本
有圖有真相:
從圖中咱們能看到,Android最新版已經5.0了,名叫Android 5.0 Lollipop,中文簡稱爲」棒棒糖「。自從2008年9月,谷歌正式發佈了Android 1.0系統,這也是Android系統最先的版本,隨後的幾年,谷歌以驚人的速度不斷更新發布Android系統,2.一、2.二、2.3系統推出使Android佔據了大量的市場。2011年2月,谷歌發佈了Android 3.0系統,這個系統版本是專門爲平板電腦設計的,但也是Android爲數很少比較失敗的版本,推出以後一直不見什麼轉機,市場份額也少的可憐。不過很快,在同年10月,谷歌又發佈了Android 4.0系統,這個系統版本再也不對手機和平板進行差別化區分,既能夠應用在手機上也能夠應用在平板上,除此以外,還引入了很多特性。
那麼Android目前市場使用狀況如何呢?如圖所示:
圖片來源自維基百科
自2009年12月起的Android用戶版本分析。直至2014年5月,Android的Jelly Bean爲最被普遍使用的版本,在全部用戶中佔了61%。
3,Android應用特點
Android主要有什麼特點呢,有如下幾個方面來體現:html
- 四大組件
- 豐富的系統控件
- SQLite數據庫等持久化技術
- 地理位置定位
- 強大的多媒體
- 傳感器
3.1,四大組件
什麼是四大組件?分別是活動(Activity)、服務(Service)、廣播接收器(BroadCast Receiver)和內容提供器(Content Provider)。其中活動(Activity)就是Android應用程序中看得東西,也是用戶打開一個應用程序的門面,而且與用戶交互的界面,比較高調。服務(Service),則比較低調了,一直在後臺默默的付出,即便用戶退出了,服務仍然是能夠繼續運行的。廣播接收器(BroadCast Receiver),則容許你的應用接收來自各處的廣播消息,好比電話、短信等,能夠根據廣播名稱不一樣,作相應的操做處理,固然了, 除了能夠接受別人發來的廣播消息,自身也能夠向外發出廣播消息,自產自銷。內容提供器(Content Provider),則爲應用程序之間共享數據提供了可能,好比你想要讀取系統電話本中的聯繫人,就須要經過內容提供器來實現。
3.2,豐富的系統控件
Android系統爲開發者提供了豐富的系統控件,咱們能夠編寫漂亮的界面,也能夠經過擴展系統控件,自定義控件來知足自個人需求,常見控件有:TextView、Buttion、EditText、一些佈局控件等。
3.3,持久化技術
Android系統還自帶了SQLite數據庫,SQLite數據庫是一種輕量級、運算速度極快的嵌入式關係型數據庫。它不只支持標準的SQL語法,還能夠經過Android封裝好的API進行操做,讓存儲和讀取數據變得很是方便。
3.4,地理位置定位
移動設備和PC相比,地理位置定位是一大亮點,如今基本Android手機都內置了GPS,咱們能夠經過GPS,結合咱們的創意,打造一款基於LBS的產品,是否是很酷的事情啊,再說,目前火熱的LBS應用也不是空穴來風的,不過在天朝,由於可惡的GFW,只能用些本土化的地圖API,好比百度地圖、高德地圖。要是哪天能用上大谷歌的地圖,那纔是高大上啊。
3.5,強大的多媒體
Android系統提供了豐富的多媒體服務,好比音樂、視頻、錄音、拍照、鬧鈴等,這一切均可以在程序中經過代碼來進行控制,讓你的應用變得更加豐富多彩。
3.6,傳感器
Android手機中內置了多種傳感器,好比加速傳感器、方向傳感器,這是移動設備的一大特色,咱們能夠靈活地使用這些傳感器,能夠作出不少在PC上沒法實現的應用。好比「微信搖一搖"_你懂得,「搜歌搖一搖」等功能。
4,Android開發環境
開發環境搭建所須要的軟件,配置等攻略,相信你們網上搜一搜,這類文章太多了。這裏只強調重要幾個工具:Android SDK、Eclipse、ADT。數據庫
4.1,Android SDK
Android SDK谷歌提供的Android開發工具包,在開發Android程序時,咱們須要引用該工具包,裏面包含了開發Android應用程序的API。
4.2,Eclipse
開發Java應用程序的神器,最好用IDE工具之一,特色是開源、超強的插件功能、可支持多種語言開發。固然除此以外,谷歌也推出了Android Studio,專門針對Android程序定製的,但由於Android Studio纔剛推出不久,不太穩定,畢竟新工具問題仍是比較多的,Eclipse被應用已經很成熟了,網上各類關於Eclipse疑難雜症的解決方案不少,相比Android Studio就比較少了。
4.3,ADT
ADT全稱叫作"Android Development Tools",是谷歌提供的一個Eclipse插件,用於在Eclipse提供一個強大的、集成的Android開發環境。
5,Android程序結構
有圖有真相:瀏覽器
![](http://static.javashuo.com/static/loading.gif)
從圖中看是否是一目瞭然,那麼接下來就一一講解吧。性能優化
5.1,src
毫無疑問,src目錄是放置咱們全部Java代碼的地方,它在這裏的含義和普通Java項目下的src目錄是徹底同樣的。
5.2,gen
這個目錄裏的內容都是自動生成的,主要有一個R.Java文件,你在項目中添加任何資源都會在其中生成一個相應的資源ID,這個文件永遠不要手動去修改它。
5.3,assets
這個目錄裏主要能夠存放一些隨程序打包的文件,在你的程序運行時能夠動態讀取到這些文件的內容。另外,若是你的程序中使用到了WebView加載本地網頁的功能,全部網頁相關的文件也都存放在這個目錄下。
5.4,bin
這個目錄頁不須要過多的關注,它主要包含了一些在編譯時自動產生的文件。固然,會包括一個編譯好的安裝包,後綴爲.apk的文件。
5.5,libs
若是你的項目中使用到了第三方的jar包,就須要把這些jar包放在libs目錄下,放在這個目錄下的jar包都會被自動添加到構建路徑裏去。
5.6,res
這個目錄下的內容就有點多了,簡單點說,就是你在項目中使用到的全部圖片、佈局、字符串等資源都要存放在這個目錄下,前面提到的R.Java中的內容也是根據這個目錄下的文件自動生成的。固然這個目錄下還有不少子目錄,圖片放在drawable目錄下,佈局放在layout目錄下,字符串放在values目錄下。
5.7,AndroidManifest.xml
這是你整個Android項目的配置文件,你在程序中定義的全部四大組件都須要在這個文件中註冊。另外還能夠在這個文件給應用程序添加權限聲明,也能夠從新指定你建立項目時指定的程序最低兼容版本和目標版本。
5.8,proguard-project.txt
在發佈你的程序時候,有些apk文件容易被人反編譯,因此此時這個文件就發揮做用了,用來混淆你的程序代碼,讓別人不那麼容易看到源代碼。
5.9,project.properties
指定了編譯程序時候所用的SDK版本
6,Logcat工具
有圖有真相:微信
![](http://static.javashuo.com/static/loading.gif)
日誌在任何項目的開發過程當中都會起到很是重要的做用,在Android項目中若是你想要查看日誌則必需要使用Logcat工具。
Android提供了一個日誌工具類是Log,總共有個等級,級級遞增。
6.1,Log.v()
這個方法用於打印那些最爲瑣碎的,意義最小的日誌信息。對應級別 verbose,是Android 日誌裏面級別最低的一種。架構
6.2,Log.d()
這個方法用於打印一些調試信息,這些信息對你調試程序和分析問題應該是有幫助的。對應級別 debug,比 verbose 高一級。
6.3,Log.i()
這個方法用於打印一些比較重要的數據,這些數據應該是你很是想看到的,能夠幫你分析用戶行爲的那種。對應級別 info,比 debug 高一級。
6.4,Log.w()
這個方法用於打印一些警告信息,提示程序在這個地方可能會有潛在的風險,最好去修復一下這些出現警告的地方。對應級別 warn,比 info 高一級。
6.5,Log.e()
這個方法用於打印程序中的錯誤信息,好比程序進入到了 catch 語句當中。當有錯誤信息打印出來的時候,通常都表明你的程序出現嚴重問題了,必須儘快修復。對應級別 error,比 warn 高一級。
小提醒:定製本身的日誌工具
好比,你正在編寫一個比較龐大的項目,期間爲了方便調試,在代碼的不少地方都打印了大量的日誌。最近項目已經基本完成了,可是卻有一個很是讓人頭疼的問題,以前用於調試的那些日誌,在項目正式上線以後仍然會照常打印,這樣不只會下降程序的運行效率,還有可能將一些機密性的數據泄露出去。
那該怎麼辦呢,難道要一行一行把全部打印日誌的代碼都刪掉?顯然這不是什麼好點子,不只費時費力,並且之後你繼續維護這個項目的時候可能還會須要這些日誌。所以,最理想的狀況是可以自由地控制日誌的打印,當程序處於開發階段就讓日誌打印出來,當程序上線了以後就把日誌屏蔽掉。框架
那麼咱們能夠自定義一個日誌工具類,對Android原生的工具類封裝下。
public class LogUtil {
public static final int VERBOSE=1;
public static final int DEBUG=2;
public static final int INFO=3;
public static final int WARN=4;
public static final int ERROR=5;
public static final int NOTHING=6;
public static final int LEVEL=VERBOSE; //發佈新版本時候 等級爲6
public static void v(String tag,String msg){
if(LEVEL <=VERBOSE){
Log.v(tag, msg);
}
}
public static void d(String tag,String msg){
if(LEVEL <=DEBUG){
Log.d(tag, msg);
}
}
public static void i(String tag,String msg){
if(LEVEL <=INFO){
Log.i(tag, msg);
}
}
public static void w(String tag,String msg){
if(LEVEL <=WARN){
Log.w(tag, msg);
}
}
public static void e(String tag,String msg){
if(LEVEL <=ERROR){
Log.e(tag, msg);
}
}
}
能夠看到,咱們在 LogUtil 中先是定義了 VERBOSE、 DEBUG、 INFO、 WARN、 ERROR、NOTHING 這六個整型常量,而且它們對應的值都是遞增的。而後又定義了一個 LEVEL 常
量,能夠將它的值指定爲上面六個常量中的任意一個。接下來咱們提供了 v()、 d()、 i()、 w()、 e()這五個自定義的日誌方法,在其內部分別調用了 Log.v()、 Log.d()、 Log.i()、 Log.w()、 Log.e()這五個方法來打印日誌,只不過在這些自定義的方法中咱們都加入了一個 if判斷,只有當 LEVEL 常量的值小於或等於對應日誌級別值的時候,纔會將日誌打印出來。ide
這樣就把一個自定義的日誌工具建立好了,以後在項目裏咱們能夠像使用普通的日誌工具同樣使用 LogUtil,
好比打印一行 DEBUG 級別的日 志就能夠這樣寫:LogUtil.d("TAG", "debug log");
打印一行 WARN 級別的日誌就能夠這樣寫:LogUtil. w("TAG", "warn log");
而後咱們只須要修改 LEVEL 常量的值,就能夠自由地控制日誌的打印行爲了。好比讓LEVEL 等於 VERBOSE 就能夠把全部的日誌都打印出來,讓 LEVEL 等於 WARN 就能夠只打印警告以上級別的日誌,讓 LEVEL 等於 NOTHING 就能夠把全部日誌都屏蔽掉。使用了這種方法以後,剛纔所說的那個問題就不復存在了,你只須要在開發階段將LEVEL 指定成 VERBOSE,當項目正式上線的時候將 LEVEL 指定成 NOTHING 就能夠了。
7,Hello World
好了,說了這麼多,這些只是一些理論的東西,要想更深刻的理解,必需要本身動手作Demo,咱們能夠去建立一個Hello World程序試試,用Eclipse+ADT幫咱們建立的默認項目就是Hello World.
閱讀擴展
源於對掌握的Android開發基礎點進行整理,羅列下已經總結的文章,從中能夠看到技術積累的過程。
1,Android系統簡介