Android是一種以Linux為基礎的開放原始碼作業系統,主要使用於便攜設備。目前尚未有統一中文名稱,中國大陸地區較多人使用「安卓」或「安致」。Android作業系統最初由Andy Rubin開發,最初主要支持手機。2005年由Google收購注資,並組建開放手機聯盟開發改良,逐漸擴展到平板電腦及其他領域上。Android的主要競爭對手是蘋果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。 2012年2月數據,Android佔據全球智慧型手機作業系統市場52.5%的份額,中國市場佔有率為68.4%。
名稱來源
Android一詞最早出現於法國作家利爾亞當(Auguste Villiers de l'Isle-Adam)在1886年發表的科幻小說《未來夏娃》(L'ève future)中。他將外表像人的機器起名為Android。
Android的Logo是由Ascender公司設計的。其中的文字使用了Ascender公司專門製作的稱之為「Droid 」 的字體。Android是一個全身綠色的機器人,綠色也是Android的標誌。顏色採用了PMS 376C和RGB中十六進位的#A4C639來繪製,這是Android作業系統的品牌象徵。有時候,它們還會使用純文字的Logo。
版本類型
Android在正式發行之前,最開始擁有兩個內部測試版本,並且以著名的機器人名稱來對其進行命名,它們分別是:阿童木(Android Beta),發條機器人(Android 1.0)。後來由於涉及到版權問題,谷歌將其命名規則變更為用甜點作為它們系統版本的代號的命名方法。甜點命名法開始於 Android 1.5 發布的時候。作為每個版本代表的甜點的尺寸越變越大,然後按照26個字母數序:紙杯蛋糕(Android 1.5),甜甜圈(Android 1.6),鬆餅(Android 2.0/2.1),凍酸奶(Android 2.2),薑餅(Android 2.3),蜂巢(Android 3.0),冰激凌三明治(Android 4.0),根據最新消息新一代Android版本將命名為果凍豆(Jelly Bean)。
Android1.1 2008年9月發布的Android第一版
Android 1.5 Cupcake(紙杯蛋糕)
2009年4月30日,官方1.5版本(Cupcake 紙杯蛋糕)的Android發布。主要的更新如下:
1、拍攝/播放影片,並支持上傳到Youtube
2、支持立體聲藍牙耳機,同時改善自動配對性能
3、最新的採用WebKit技術的瀏覽器,支持複製/貼上和頁面中搜索
4、GPS性能大大提高
5、提供屏幕虛擬鍵盤
6、主屏幕增加音樂播放器和相框widgets
7、應用程式自動隨著手機旋轉
8、簡訊、Gmail、日曆,瀏覽器的用戶接口大幅改進,如Gmail可以批量刪除郵件
9、相機啟動速度加快,拍攝圖片可以直接上傳到Picasa
10、來電照片顯示
Android 1.6Donut(甜甜圈)
2009年9月15日,1.6(Donut 甜甜圈)版本軟體開發工具包發布。
主要的更新如下:
1、重新設計的Android Market手勢
2、支持CDMA網絡
3、文字轉語音系統(Text-to-Speech)
4、快速搜索框
5、全新的拍照接口
6、查看應用程式耗電
7、支持虛擬私人網絡(VPN)
8、支持更多的屏幕解析度
9、支持OpenCore2媒體引擎
10、新增面向視覺或聽覺困難人群的易用性插件
Android2.0/2.0.1/2.1Eclair(鬆餅)
2009年10月26日,2.0(Eclair 鬆餅)版本軟體開發工具包發布。
主要的更新如下:
1、優化硬體速度
2、"Car Home"程序
3、支持更多的屏幕解析度
4、改良的用戶界面
5、新的瀏覽器的用戶接口和支持HTML5
6、新的聯繫人名單
7、更好的白色/黑色背景比率
8、改進Google Maps3.1.2
9、支持Microsoft Exchange
10、支持內置相機閃光燈
11、支持數碼變焦
12、改進的虛擬鍵盤
13、支持藍牙2.1
14、支持動態桌面的設計
Android 2.2/2.2.1Froyo(凍酸奶)
2010年5月20日,2.2(Froyo 凍酸奶)版本軟體開發工具包發布。主要的更新如下:
1、整體性能大幅度的提升 。
2、3G網絡共享功能。
3、Flash的支持。
4、App2sd功能。
5、全新的軟體商店。
6、更多的Web應用API接口的開發。
Android 2.3Gingerbread(薑餅)
2010年12月7日,2.3(Gingerbread 薑餅)版本軟體開發工具包發布。主要的更新如下:
1、增加了新的垃圾回收和優化處理事件
2、原生代碼可直接存取輸入和感應器事件、EGL/OpenGLES、OpenSL ES
3、新的管理窗口和生命周期的框架
4、支持VP8和WebM視頻格式,提供AAC和AMR寬頻編碼,提供了新的音頻效果器
5、支持前置攝像頭、SIP/VOIP和NFC(近場通訊)
6、簡化界面、速度提升
7、更快更直觀的文字輸入
8、一鍵文字選擇和複製/粘帖
9、改進的電源管理系統
10、新的應用管理方式
Android 3.0Honeycomb(蜂巢)
2011年2月2日,3.0(Honeycomb 蜂巢)版本主要更新如下:
1、優化針對平板
2、全新設計的UI增強網頁瀏覽功能
3、n-app purchases功能
Android 3.1Honeycomb(蜂巢)
2011年5月11日在Google I/O開發者大會宣布發布,版本主要更新如下:
Honeycomb蜂巢(改進3.0BUG)
1、經過優化的Gmail電子郵箱
2、全面支持GoogleMaps
3、將Android手機系統跟平板系統再次合併從而方便開發者
4、任務管理器可滾動,支持USB 輸入設備(鍵盤、滑鼠等)
5、支持Google TV.可以支持XBOX 360無線手柄
6、widget支持的變化,能更加容易的定製屏幕widget插件
Android 3.2Honeycomb(蜂巢)
2011年7月13日發布,版本更新如下:
1、支持7英寸設備
2、引入了應用顯示縮放功能
Android 4.0 Ice Cream Sandwich(冰激凌三明治)
2011年10月19日在香港發布,4.0(Ice Cream Sandwich 冰激凌三明治)版本主要更新如下:
1、全新的ui
2、全新的Chrome Lite瀏覽器,有離線閱讀,16標籤頁,隱身瀏覽模式等
3、截圖功能
4、更強大的圖片編輯功能
5、自帶照片應用堪比Instagram,可以加濾鏡、加相框,進行360度全景拍攝,照片還能根據地點來排序
6、Gmail加入手勢、離線搜索功能,UI更強大
7、新功能People:以聯繫人照片為核心,界面偏重滑動而非點擊,集成了Twitter、Linkedin、Google+等通訊工具。有望支持用戶自定義添加第三方服務
8、新增流量管理工具,可具體查看每個應用產生的流量
9、正在運行的程序可以像電腦一樣的互相切換
10、人臉識別功能,同時前置攝像頭可以進行面部解鎖
11、系統優化、速度更快
12、支持虛擬按鍵,手機可以不再擁有任何按鍵
13、更直觀的程序文件夾
14、平板電腦和智慧型手機通用
15、支持更大的解析度
16、專為雙核處理器編寫的優化驅動
17、全新的Linux內核
18、增強的複製粘貼功能
19、語音功能
20、全新通知欄
21、更加豐富的數據傳輸功能
22、更多的感應器支持
23、語音識別的鍵盤
24、全新的3D驅動,遊戲支持能力提升
25、全新的谷歌電子市場
26、增強的桌面插件自定義
Android 5.0Jelly Bean(果凍豆)
谷歌計劃與各大廠商合作在今年11月月底前推出最新安卓5.0 Jelly Bean(果凍豆)作業系統 繼「冰激凌三明治」之後的下一版Android系統。有消息稱三星Galaxy Nexus會成為第一個搭載Android 5.0果凍豆的手機。[1]
研發歷史
2005年
Google收購了成立僅22個月的高科技企業Android公司。
2007年
11月5日,谷歌公司正式向外界展示了這款名為Android的作業系統,並且在這天谷歌宣布建立一個全球性的聯盟組織,該組織由34家手機製造商、軟體開發商、電信運營商以及晶片製造商共同組成。這一聯盟將支持谷歌發布的手機作業系統以及應用軟體,將共同開發Android系統的開放原始碼。
2008年
5月28日,Patrick Brady於Google I/O大會上提出Android HAL架構圖。
8月18日,Android獲得美國聯邦通信委員會的批准。
9月22日,谷歌正式對外發布第一款Android手機——HTC G1。
9月23日,谷歌發布Android1.0。
9月24日,全球業界都表示不看好Android作業系統,並且聲稱最多1年,Android就會被Google關閉。
2009年
4月30日,Android1.5正式發布。
5月10日,HTC G1和HTC G2市場大賣,成為僅次於iPhone的熱門機型。
9月25日,Android1.6正式發布。
9月29日,HTC Hero G3廣受歡迎,成為全球最受歡迎的機型。
10月28日,Android 2.0 智慧型手機作業系統正式發布。
11月10日,由於Android的火熱,Android平臺出現第一個惡意間諜軟體:Mobile Spy。
2010年
1月7日,Google發布了旗下第一款自主品牌手機:Nexus one(HTC G5)。
1月,谷歌與Linux基金會就Linux內核的同步和維護意見不一致而產生了矛盾。
2月3日,Linux內核開發者Greg Kroah-Hartman將Android的驅動程序從Linux內核「狀態樹」上除去。
5月19日,Google正式對外發布Android2.2智能作業系統。
5月20日,Google對外正式展示了搭載Android系統的智能電視-Google TV,該電視為全球首臺智能電視。
7月1日,Google宣布正式與雅虎、亞馬遜合作,並且在Android上推出多項Kindle服務和雅虎服務。
7月9日,美國NDP集團調查顯示,Android系統已佔據了美國手機市場28%的份額,全球17%的市場份額。
8月12日,Android平臺出現第一個木馬病毒:Trojan-SMS.AndroidOS.FakePlayer.a。
9月,Android應用數量超過9萬個。
9月21日,Google對外公布數據,每日銷售的Android設備的新用戶數達到20萬。
10月26日,Google宣布Android達到第一個裡程碑:電子市場上Android應用數量達到10萬個。
12月7日,Google正式發布Android2.3作業系統。
2011年
1月,Google對外宣布Android Market上的應用數量超過20萬。
1月,Google對外公布數據,每日Android設備的新用戶數達到了30萬。
2月,美國移動用戶36%擁有智慧型手機。當中,48%的智慧型手機用戶選擇Android智慧型手機。約32.1%的智慧型手機用戶選擇了蘋果iPhone。黑莓及其它智慧型手機佔有11.6%的份額。
2月2日,Android3.0正式發布。
2月3日,谷歌發布了專用於平板電腦的Android 3.0蜂巢系統。
6月,Android在日本的智慧型手機作業系統市場佔有率達到57%。
7月,Android在歐洲的智慧型手機作業系統市場佔有率達到了22.3%
7月,Google對外公布數據,Android每天的新用戶達到55萬,Android設備用戶總數達1.35億。
8月,谷歌收購摩託羅拉移動。
8月,Google對外宣布Android Market上的應用數量超過30萬。
8月2日,Android手機已佔據全球智能機市場48%的份額,並在亞太地區市場佔據統治地位,終結了Symbian(塞班系統)的霸主地位,躍居全球第一。
8月,Android在韓國的智慧型手機作業系統市場佔有率達到了95%。
8月,Android系統在35個國家市場佔有率第一,平均市場佔有率達到48%。
8月,Android系統成為亞太地區第一大系統,市場佔有率為亞太地區第一大。
9月,Android在美國的智慧型手機作業系統市場佔有率達到43%。
10月19日,谷歌正式發布Android 4.0作業系統。
11月,Android Market上提交審核的應用程式數量達到50萬。
11月初,谷歌對Android Market上的應用程式進行了大清理,據統計,此次共清理了約18萬個應用程式,包括流氓應用、病毒軟體、侵犯版權、低質量和濫竽充數的各種程序,谷歌將這一系列應用刪除後,使得Android市場中的優質應用程式總數到31.5萬。
11月15日,Android在中國大陸的智慧型手機作業系統市場佔有率達到了58%。
11月20日,谷歌宣布啟動了Android Market應用審核、取締、清掃行為,定期對電子市場上存在的不合格、低質量、違法惡意的應用程式進行清理。
11月18日,美國NPD數據顯示,Android和iOS平臺上的遊戲佔有率都首度超過任天堂的DS掌機和索尼的PSP掌機,手機遊戲玩家也超過了掌機玩家,遊戲開發商更傾向於向Android和iOS手機上開發遊戲。
11月18日,谷歌報告顯示,通過谷歌伺服器激活的Android設備用戶總數已經超過2億,每天激活的新用戶數超過55萬,而這僅僅是通過谷歌伺服器激活的用戶設備數。
12月9日,Google對外宣布,Android Market的累計下載量已經突破100億次,平均每月的下載量為10億次。
12月18日,Google移動事業部副總裁Andy Rubin表示,每天激活的Android設備已達到70萬部。
12月26日,Andy Rubin通過Twitter宣布,聖誕節的前兩天24日和25日,共有370萬部Android設備被激活。
2012年
1月4日,數據顯示,Android Market上的應用程式數量突破40萬個,每4個月增加10萬個應用程式
1月5日,數據顯示,在谷歌電子市場上登記的Android開發者已經達到了10萬名。
1月20日,谷歌報告顯示,通過谷歌伺服器激活的Android設備用戶總數已經超過2.5億,距離去年11月的數量,在短短2個月時間內全球共賣出5000萬臺安卓設備,平均每秒鐘就賣出10臺安卓設備。
2月4日,comScore等數據市場研究機構的數據顯示,安卓在美國手機市場的佔有率達到了47.3%。
2月5日,美國聯邦政府宣布成立專門的Android實驗室進行適用於軍方的Android第三方ROM的定製工作。
2月15日,美國聯邦政府總務署宣布已經採購了2萬臺Android手機供政府人員使用。
2月22日,Android在中國大陸的智慧型手機作業系統市場佔有率達到了68.4%。
2月28日,谷歌正式宣布,Android設備每天激活量達到85萬臺,通過谷歌伺服器激活的Android設備用戶總數突破3億臺,距離2012年1月的數量,在短短1個月時間內全球共賣出5000萬臺安卓設備,平均每秒鐘就賣出15臺安卓設備。
2月28日,谷歌官方數據顯示,Android電子市場(Android Market)上的應用程式數量已經突破45萬個,一年內增加30萬個。
3月1日,Google對外宣布,Android Market的累計下載量已經突破130億次。
3月4日,Android在印度的智慧型手機作業系統市場佔有率達到了34%。
4月4日,Android在美國市場的佔有率增長到了50.1%。
5月1日,Android在東南亞各國的平均份額達到了49%。
系統架構
Android的系統架構和其它作業系統一樣,採用了分層的架構。android分為四個層,從高層到低層分別是應用程式層、應用程式框架層、系統運行庫層和linux核心層。
Android是以Linux為核心的手機操作平臺,作為一款開放式的作業系統,隨著Android的快速發展,如今已允許開發者使用多種程式語言來開發Android應用程式,而不再是以前只能使用Java開發Android應用程式的單一局面,因而受到眾多開發者的歡迎,成為真正意義上的開放式作業系統。
在Android中,開發者可以使用Java作為程式語言來開發應用程式,也可以通過NDK使用C/C++作為程式語言來開發應用程式,也可使用SL4A來使用其他各種腳本語言進行編程(如:python、lua、tcl、php等等),還有其他諸如:Qt(qt for android)、Mono(mono for android)等一些著名編程框架也開始支持Android編程,甚至通過MonoDroid,開發者還可以使用C#作為程式語言來開發應用程式。另外,谷歌還在2009年特別發布了針對初學者的Android Simple語言,該語言類似Basic語言。而在網頁程式語言方面,JavaScript,ajax,HTML5,jquery、sencha、dojo、mobl、PhoneGap等等都已經支持Android開發。
而在Android系統底層方面,Android使用C/C++作為開發語言。
應用程式(部分)
早期的Android應用程式開發,通常通過Android SDK(Android軟體開發包)下使用Java作為程式語言來開發應用程式,但通過不同的軟體開發包,則使用的程式語言也不同。
例如開發者可以通過Android NDK(Android Native開發包)使用C語言或者C++語言來作為程式語言開發應用程式。同時谷歌還推出了適合初學者編程使用的Simple語言,該語言類似微軟公司的Visual Basic語言。此外,谷歌公司還推出了Google App Inventor開發工具,該開發工具可以快速地構建應用程式,方便新手開發者。
Java開發方面
Android支持使用Java作為程式語言來開發應用程式,而Android的Java開發方面從接口到功能,都有層出不窮的變化。考慮到Java虛擬機的效率和資源佔用,谷歌重新設計了Android的Java,以便能提高效率和減少資源佔用,因而與J2ME等不同。其中Activity等同於J2ME的MIDlet,一個 Activity 類(Class)負責創建視窗(Windows),一個活動中的Activity就是在 foreground(前景)模式,背景運行的程序叫做Service。兩者之間通過由ServiceConnection和AIDL連結,達到複數程序同時運行效果。如果運行中的 Activity 全部畫面被其他 Activity 取代時,該 Activity 便被停止(Stopped),甚至被系統清除(Kill)。
View等同於J2ME的Displayable,程序人員可以通過 View 類與「XML layout」檔將UI放置在視窗上,Android 1.5的版本可以利用 View 打造出所謂的 Widgets,其實Widget只是View的一種,所以可以使用xml來設計layout,HTC的Android Hero手機即含有大量的widget。至於ViewGroup 是各種layout 的基礎抽象類(abstract class),ViewGroup之內還可以有ViewGroup。View的構造函數不需要再Activity中調用,但是Displayable的是必須的,在Activity 中,要通過findViewById()來從XML 中取得View,Android的View類的顯示很大程度上是從XML中讀取的。View 與事件(event)息息相關,兩者之間通過Listener 結合在一起,每一個View都可以註冊一個event listener,例如:當View要處理用戶觸碰(touch)的事件時,就要向Android框架註冊View.OnClickListener。另外還有BitMap等同於J2ME的Image。
C/C++開發方面
早期的Android開發只支持Java作為程式語言開發應用程式,因而使得其他語言開發者只能望而卻步。2010年4月,谷歌正式對開發者發布了Android NDK,NDK允許開發者使用C/C++作為程式語言來為Android開發應用程式,初版的NDK使得開發者看到了C/C++在Android開發中的希望。
但是,當前版本的NDK在功能上還有很多局限性:NDK並沒有提供對應用程式生命周期的維護;NDK也不提供對Android系統中大量系統事件的支持;對於作為應用程式交互接口的UI API,當前版本的NDK中也沒有提供。但是相對於初版的NDK,現在的NDK已經進行了許多重大的功能改進。
由此可見,NDK仍然需要完善和發展,相信未來隨著NDK的發展,NDK可以做得更多更好。
中介軟體
作業系統與應用程式的溝通橋梁,應用分為兩層:函數層(Library)和虛擬機(Virtual Machine)。 Bionic是 Android 改良libc的版本。Android 同時包含了Webkit,所謂的Webkit 就是Apple Safari 瀏覽器背後的引擎。Surface flinger 是就2D或3D的內容顯示到屏幕上。Android使用工具鏈(Toolchain)為Google自製的Bionic Libc。
Android採用OpenCORE作為基礎多媒體框架。OpenCORE可分7大塊:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。
Android 使用skia 為核心圖形引擎,搭配OpenGL/ES。skia與Linux Cairo功能相當,但相較於Linux Cairo, skia 功能還只是雛形的。2005年Skia公司被Google收購,2007年初,Skia GL源碼被公開,目前Skia 也是Google Chrome 的圖形引擎。
Android的多媒體資料庫採用SQLite資料庫系統。資料庫又分為共用資料庫及私用資料庫。用戶可通過ContentResolver類(Column)取得共用資料庫。
Android的中間層多以Java 實現,並且採用特殊的Dalvik 虛擬機(Dalvik Virtual Machine)。Dalvik虛擬機是一種「暫存器型態」(Register Based)的Java虛擬機,變量皆存放於暫存器中,虛擬機的指令相對減少。
Dalvik虛擬機可以有多個實例(instance), 每個Android應用程式都用一個自屬的Dalvik虛擬機來運行,讓系統在運行程序時可達到優化。Dalvik 虛擬機並非運行Java字節碼(Bytecode),而是運行一種稱為.dex格式的文件。
硬體抽像層
Android 的 HAL(硬體抽像層)是能以封閉源碼形式提供硬體驅動模塊。HAL 的目的是為了把 Android framework 與 Linux kernel 隔開,讓 Android 不至過度依賴 Linux kernel,以達成 kernel independent 的概念,也讓 Android framework 的開發能在不考量驅動程序實現的前提下進行發展。
HAL stub 是一種代理人(proxy)的概念,stub 是以 *.so 檔的形式存在。Stub 向 HAL「提供」操作函數(operations),並由 Android runtime 向 HAL 取得 stub 的 operations,再 callback 這些操作函數。HAL 裡包含了許多的 stub(代理人)。Runtime 只要說明「類型」,即 module ID,就可以取得操作函數。
系統內核
Android 是運行於 Linux kernel之上,但並不是GNU/Linux。因為在一般GNU/Linux 裡支持的功能,Android 大都沒有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic 取代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。Android 為了達到商業應用,必須移除被GNU GPL授權證所約束的部份,例如Android將驅動程序移到 userspace,使得Linux driver 與 Linux kernel徹底分開。bionic/libc/kernel/ 並非標準的kernel header files。Android 的 kernel header 是利用工具由 Linux kernel header 所產生的,這樣做是為了保留常數、數據結構與宏。
目前Android 的 Linux kernel控制包括安全(Security),存儲器管理(Memory Management),程序管理(Process Management),網絡堆棧(Network Stack),驅動程序模型(Driver Model)等。下載Android源碼之前,先要安裝其構建工具 Repo來初始化源碼。Repo 是 Android 用來輔助Git工作的一個工具。
安全權限機制
Android本身是一個權限分立的作業系統。在這類作業系統中,每個應用都以唯一的一個系統識別身份運行(Linux用戶ID與群組ID)。系統的各部分也分別使用各自獨立的識別方式。Linux就是這樣將應用與應用,應用與系統隔離開。
系統更多的安全功能通過權限機制提供。權限可以限制某個特定進程的特定操作,也可以限制每個URI權限對特定數據段的訪問。
Android安全架構的核心設計思想是,在默認設置下,所有應用都沒有權限對其他應用、系統或用戶進行較大影響的操作。這其中包括讀寫用戶隱私數據(聯繫人或電子郵件),讀寫其他應用文件,訪問網絡或阻止設備待機等。
安裝應用時,在檢查程序籤名提及的權限,且經過用戶確認後,軟體包安裝器會給予應用權限。從用戶角度看,一款Android應用通常會要求如下的權限:
撥打電話、發送簡訊或彩信、修改/刪除SD卡上的內容、讀取聯繫人的信息、讀取日程信的息,寫入日程數據、讀取電話狀態或識別碼、精確的(基於GPS)地理位置、模糊的(基於網絡獲取)地理位置、創建藍牙連接、對網際網路的完全訪問、查看網絡狀態,查看WiFi狀態、避免手機待機、修改系統全局設置、讀取同步設定、開機自啟動、重啟其他應用、終止運行中的應用、設定偏好應用、震動控制、拍攝圖片等。
一款應用應該根據自身提供的功能,要求合理的權限。用戶也可以分析一款應用所需權限,從而簡單判定這款應用是否安全。如一款應用是不帶廣告的單機版,也沒有任何附加的內容需要下載,那麼它要求訪問網絡的權限就比較可疑。
系統組件
Android開發四大組件分別是:活動(Activity): 用於表現功能。服務(Service): 後臺運行服務,不提供界面呈現。廣播接收器(BroadcastReceiver):用於接收廣播。內容提供商(Content Provider): 支持在多個應用中存儲和讀取數據,相當於資料庫。
1、 Activity
Android 中,Activity 是所有程序的根本,所有程序的流程都運行在Activity 之中,Activity可以算是開發者遇到的最頻繁,也是Android 當中最基本的模塊之一。在Android的程序當中,Activity 一般代表手機屏幕的一屏。如果把手機比作一個瀏覽器,那麼Activity就相當於一個網頁。在Activity 當中可以添加一些Button、Check box 等控制項。可以看到Activity 概念和網頁的概念相當類似。
一般一個Android 應用是由多個Activity 組成的。這多個Activity 之間可以進行相互跳轉,例如,按下一個Button 按鈕後,可能會跳轉到其他的Activity。和網頁跳轉稍微有些不一樣的是,Activity 之間的跳轉有可能返回值,例如,從Activity A 跳轉到Activity B,那麼當Activity B 運行結束的時候,有可能會給Activity A 一個返回值。這樣做在很多時候是相當方便的。
當打開一個新的屏幕時,之前一個屏幕會被置為暫停狀態,並且壓入歷史堆棧中。用戶可以通過回退操作返回到以前打開過的屏幕。我們可以選擇性的移除一些沒有必要保留的屏幕,應為Android會把每個應用的開始到當前的每個屏幕保存在堆棧中。
2 、Service
Service 是android 系統中的一種組件,它跟Activity 的級別差不多,但是他不能自己運行,只能後臺運行,並且可以和其他組件進行交互。Service 是沒有界面的長生命周期的代碼。Service 是一種程序,它可以運行很長時間,但是它卻沒有用戶界面。這麼說有點枯燥,來看個例子。打開一個音樂播放器的程序,這個時候若想上網了,那麼,我們打開Android 瀏覽器,這個時候雖然我們已經進入了瀏覽器這個程序,但是,歌曲播放並沒有停止,而是在後臺繼續一首接著一首的播放。其實這個播放就是由播放音樂的Service進行控制。當然這個播放音樂的Service也可以停止,例如,當播放列表裡邊的歌曲都結束,或者用戶按下了停止音樂播放的快捷鍵等。service 可以在和多場合的應用中使用,比如播放多媒體的時候用戶啟動了其他Activity這個時候程序要在後臺繼續播放,比如檢測SD 卡上文件的變化,再或者在後臺記錄你地理信息位置的改變等等,總之服務嘛,總是藏在後頭的。
開啟service有兩種方式:
(1) Context.startService():Service會經歷onCreate -> onStart(如果Service還沒有運行,則android先調用onCreate()然後調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次 );stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後臺運行。該Service的調用者再啟動起來後可以通過stopService關閉Service。 注意,多次調用Context.startservice()不會嵌套(即使會有相應的onStart()方法被調用),所以無論同一個服務被啟動了多少次,一旦調用Context.stopService()或者stopSelf(),他都會被停止。補充說明:傳遞給startService()的Intent對象會傳遞給onStart()方法。調用順序為:onCreate --> onStart(可多次調用) --> onDestroy。
(2) Context.bindService():Service會經歷onCreate() -> onBind(),onBind將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service運行的狀態或其他操作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind -> onDestroyed相應退出,所謂綁定在一起就共存亡了 。
3、 BroadcastReceiver
在Android 中,Broadcast 是一種廣泛運用的在應用程式之間傳輸信息的機制。而BroadcastReceiver 是對發送出來的Broadcast進行過濾接受並響應的一類組件。可以使用BroadcastReceiver 來讓應用對一個外部的事件做出響應。這是非常有意思的,例如,當電話呼入這個外部事件到來的時候,可以利用BroadcastReceiver 進行處理。例如,當下載一個程序成功完成的時候,仍然可以利用BroadcastReceiver 進行處理。BroadcastReceiver不能生成UI,也就是說對於用戶來說不是透明的,用戶是看不到的。BroadcastReceiver通過NotificationManager 來通知用戶這些事情發生了。BroadcastReceiver 既可以在AndroidManifest.xml 中註冊,也可以在運行時的代碼中使用Context.registerReceiver()進行註冊。只要是註冊了,當事件來臨的時候,即使程序沒有啟動,系統也在需要的時候啟動程序。各種應用還可以通過使用Context.sendBroadcast () 將它們自己的intent broadcasts廣播給其他應用程式。
註冊BroadcastReceiver有兩種方式:
(1)在AndroidManifest.xml進行註冊。這種方法有一個特點即使你的應用程式已經關閉了,但這個BroadcastReceiver依然會接受廣播出來的對象,也就是說無論你這個應用程式時開還是關都屬於活動狀態都可以接受到廣播的事件;
(2)在代碼中註冊廣播。
第一種俗稱靜態註冊,第二種俗稱動態註冊,這兩種註冊BroadcastReceiver的區別:
動態註冊較靜態註冊靈活。實驗證明:當靜態註冊一個BroadcastReceiver時,不論應用程式是啟動與否。都可以接受對應的廣播。
動態註冊的時候,如果不執行unregisterReceiver();方法取消註冊,跟靜態是一樣的。但是如果執行該方法,當執行過以後,就不能接受廣播了。
4、 Content Provider
Content Provider 是Android提供的第三方應用數據的訪問方案。
在Android中,對數據的保護是很嚴密的,除了放在SD卡中的數據,一個應用所持有的資料庫、文件、等等內容,都是不允許其他直接訪問的。Andorid當然不會真的把每個應用都做成一座孤島,它為所有應用都準備了一扇窗,這就是Content Provider。應用想對外提供的數據,可以通過派生ContentProvider類, 封裝成一枚Content Provider,每個Content Provider都用一個uri作為獨立的標識,形如:content://com.xxxxx。所有東西看著像REST的樣子,但實際上,它比REST 更為靈活。和REST類似,uri也可以有兩種類型,一種是帶id的,另一種是列表的,但實現者不需要按照這個模式來做,給你id的uri你也可以返回列表類型的數據,只要調用者明白,就無妨,不用苛求所謂的REST。
另外,Content Provider不和REST一樣只有uri可用,還可以接受Projection,Selection,OrderBy等參數,這樣,就可以像資料庫那樣進行投影,選擇和排序。查詢到的結果,以Cursor(參見:reference/android/database/Cursor.html )的形式進行返回,調用者可以移動Cursor來訪問各列的數據。
Content Provider屏蔽了內部數據的存儲細節,向外提供了上述統一的接口模型,這樣的抽象層次,大大簡化了上層應用的書寫,也對數據的整合提供了更方便的途徑。Content Provider內部,常用資料庫來實現,Android提供了強大的Sqlite支持,但很多時候,你也可以封裝文件或其他混合的數據。
在Android中,ContentResolver是用來發起Content Provider的定位和訪問的。不過它僅提供了同步訪問的Content Provider的接口。但通常,Content Provider需要訪問的可能是資料庫等大數據源,效率上不足夠快,會導致調用線程的擁塞。因此Android提供了一個AsyncQueryHandler(參見:reference/android/content/AsyncQueryHandler.html),幫助進行異步訪問Content Provider。
在各大組件中,Service和Content Provider都是那種需要持續訪問的。Service如果是一個耗時的場景,往往會提供異步訪問的接口,而Content Provider不論效率如何,都提供的是約定的同步訪問接口。
(責任編輯:馮虎)