1. 程式人生 > >"淺談Android"第一篇:Android系統簡介

"淺談Android"第一篇:Android系統簡介

 近來,看了一本書,名字叫做《第一行程式碼》,是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.1、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主要有什麼特色呢,有以下幾個方面來體現:

  • 四大元件
  • 豐富的系統控制元件
  • 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程式結構

  有圖有真相:

  

 從圖中看是不是一目瞭然,那麼接下來就一一講解吧。

   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工具

  有圖有真相:

  

    日誌在任何專案的開發過程中都會起到非常重要的作用,在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 常量的值小於或等於對應日誌級別值的時候,才會將日誌打印出來。

    這樣就把一個自定義的日誌工具建立好了,之後在專案裡我們可以像使用普通的日誌工具一樣使用 LogUtil,     比如列印一行 DEBUG 級別的日 志就可以這樣寫:LogUtil.d("TAG", "debug log");     列印一行 WARN 級別的日誌就可以這樣寫:LogUtil. w("TAG", "warn log");     然後我們只需要修改 LEVEL 常量的值,就可以自由地控制日誌的列印行為了。比如讓LEVEL 等於 VERBOSE 就可以把所有的日誌都打印出來,讓 LEVEL 等於 WARN 就可以只打印警告以上級別的日誌,讓 LEVEL 等於 NOTHING 就可以把所有日誌都遮蔽掉。使用了這種方法之後,剛才所說的那個問題就不復存在了,你只需要在開發階段將LEVEL 指定成 VERBOSE,當專案正式上線的時候將 LEVEL 指定成 NOTHING 就可以了。