android介紹

Android(安卓)是一種以 Linux 為基礎的開放源碼操作系統,主要使用于便攜設備。2005 年由 Google 收購注資,并拉攏多家制造商組成開放手機聯盟開發(fā)改良,逐漸擴展到到平板電腦及其他領域上。

簡介

  Android一詞的本義指“機器人”,同時也是Google于2007年11月5日宣布的基于Linux平臺的開源手機操作系統的名稱,該平臺由操作系統、中間件、用戶界面和應用軟件組成?!?br>

  系統架構

  android的系統架構和其操作系統一樣,采用了分層的架構。從架構圖看,android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和linux核心層。

  應用程序

  Android會同一系列核心應用程序包一起發(fā)布,該應用程序包包括客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。所有的應用程序都是使用JAVA語言編寫的。

  應用程序框架

  開發(fā)人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序都可以發(fā)布它的功能塊并且任何其它的應用程序都可以使用其所發(fā)布的功能塊(不過得遵循框架的安全性)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。

  隱藏在每個應用后面的是一系列的服務和系統, 其中包括;

  豐富而又可擴展的視圖(Views),可以用來構建應用程序, 它包括列表(lists),網格(grids),文本框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。

  內容提供器(Content Providers)使得應用程序可以訪問另一個應用程序的數據(如聯系人數據庫), 或者共享它們自己的數據

  資源管理器(Resource Manager)提供 非代碼資源的訪問,如本地字符串,圖形,和布局文件( layout files )。

  通知管理器 (Notification Manager) 使得應用程序可以在狀態(tài)欄中顯示自定義的提示信息。

  活動管理器( Activity Manager) 用來管理應用程序生命周期并提供常用的導航回退功能。

  有關更多的細節(jié)和怎樣從頭寫一個應用程序,請參考 如何編寫一個 Android 應用程序。

  系統運行庫

  Android 包含一些C/C++庫,這些庫能被Android系統中不同的組件使用。它們通過 Android 應用程序框架為開發(fā)者提供服務。以下是一些核心庫:

  * 系統 C 庫 - 一個從BSD繼承來的標準 C 系統函數庫( libc ), 它是專門為基于 embedded linux的設備定制的。

  * 媒體庫 - 基于PacketVideo OpenCORE;該庫支持多種常用的音頻、視頻格式回放和錄制,同時支持靜態(tài)圖像文件。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

  * Surface Manager - 對顯示子系統的管理,并且為多個應用程序提 供了2D和3D圖層的無縫融合。

  * LibWebCore - 一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。

  應用程序組件

  Android開發(fā)四大組件分別是:活動(Activity): 用于表現功能。服務(Service): 后臺運行服務,不提供界面呈現。廣播接收器(BroadcastReceiver):用于接收廣播。內容提供商(Content Provider): 支持在多個應用中存儲和讀取數據,相當于數據庫。

  活動

  Android 中,Activity 是所有程序的根本,所有程序的流程都運行在Activity 之中,Activity可以算是開發(fā)者遇到的最頻繁,也是Android 當中最基本的模塊之一。在Android的程序當中,Activity 一般代表手機屏幕的一屏。如果把手機比作一個瀏覽器,那么Activity就相當于一個網頁。在Activity 當中可以添加一些Button、Check box 等控件。可以看到Activity 概念和網頁的概念相當類似。

  一般一個Android 應用是由多個Activity 組成的。這多個Activity 之間可以進行相互跳轉,例如,按下一個Button 按鈕后,可能會跳轉到其他的Activity。和網頁跳轉稍微有些不一樣的是,Activity 之間的跳轉有可能返回值,例如,從Activity A 跳轉到Activity B,那么當Activity B 運行結束的時候,有可能會給Activity A 一個返回值。這樣做在很多時候是相當方便的。

  當打開一個新的屏幕時,之前一個屏幕會被置為暫停狀態(tài),并且壓入歷史堆棧中。用戶可以通過回退操作返回到以前打開過的屏幕。我們可以選擇性的移除一些沒有必要保留的屏幕,因為Android會把每個應用的開始到當前的每個屏幕保存在堆棧中。

  服務

  Service 是android 系統中的一種組件,它跟Activity 的級別差不多,但是他不能自己運行,只能后臺運行,并且可以和其他組件進行交互。Service 是沒有界面的長生命周期的代碼。Service 是一種程序,它可以運行很長時間,但是它卻沒有用戶界面。這么說有點枯燥,來看個例子。打開一個音樂播放器的程序,這個時候若想上網了,那么,我們打開Android 瀏覽器,這個時候雖然我們已經進入了瀏覽器這個程序,但是,歌曲播放并沒有停止,而是在后臺繼續(xù)一首接著一首的播放。其實這個播放就是由播放音樂的Service進行控制。當然這個播放音樂的Service也可以停止,例如,當播放列表里邊的歌曲都結束,或者用戶按下了停止音樂播放的快捷鍵等。service 可以在和多場合的應用中使用,比如播放多媒體的時候用戶啟動了其他Activity這個時候程序要在后臺繼續(xù)播放,比如檢測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運行的狀態(tài)或其他操作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind --> onDestroyed相應退出,所謂綁定在一起就共存亡了。[20]

  廣播接收器

  在Android 中,Broadcast 是一種廣泛運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver 是對發(fā)送出來的Broadcast進行過濾接受并響應的一類組件??梢允褂肂roadcastReceiver 來讓應用對一個外部的事件做出響應。這是非常有意思的,例如,當電話呼入這個外部事件到來的時候,可以利用BroadcastReceiver 進行處理。例如,當下載一個程序成功完成的時候,仍然可以利用BroadcastReceiver 進行處理。BroadcastReceiver不能生成UI,也就是說對于用戶來說不是透明的,用戶是看不到的。BroadcastReceiver通過NotificationManager 來通知用戶這些事情發(fā)生了。BroadcastReceiver 既可以在AndroidManifest.xml 中注冊,也可以在運行時的代碼中使用Context.registerReceiver()進行注冊。只要是注冊了,當事件來臨的時候,即使程序沒有啟動,系統也在需要的時候啟動程序。各種應用還可以通過使用Context.sendBroadcast () 將它們自己的intent broadcasts廣播給其他應用程序。

  注冊BroadcastReceiver有兩種方式:

  (1)在AndroidManifest.xml進行注冊。這種方法有一個特點即使你的應用程序已經關閉了,但這個BroadcastReceiver依然會接受廣播出來的對象,也就是說無論你這個應用程序時開還是關都屬于活動狀態(tài)都可以接受到廣播的事件;

  (2)在代碼中注冊廣播。

  第一種俗稱靜態(tài)注冊,第二種俗稱動態(tài)注冊,這兩種注冊Broadcast Receiver的區(qū)別:

  動態(tài)注冊較靜態(tài)注冊靈活。實驗證明:當靜態(tài)注冊一個Broadcast Receiver時,不論應用程序是啟動與否。都可以接受對應的廣播。

  動態(tài)注冊的時候,如果不執(zhí)行unregister Receiver();方法取消注冊,跟靜態(tài)是一樣的。但是如果執(zhí)行該方法,當執(zhí)行過以后,就不能接受廣播了。

  內容提供

  Content Provider 是Android提供的第三方應用數據的訪問方案。

  在Android中,對數據的保護是很嚴密的,除了放在SD卡中的數據,一個應用所持有的數據庫、文件等內容,都是不允許其他直接訪問的。Andorid當然不會真的把每個應用都做成一座孤島,它為所有應用都準備了一扇窗,這就是Content Provider。應用想對外提供的數據,可以通過派生Content Provider類, 封裝成一枚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屏蔽了內部數據的存儲細節(jié),向外提供了上述統一的接口模型,這樣的抽象層次,大大簡化了上層應用的書寫,也對數據的整合提供了更方便的途徑。Content Provider內部,常用數據庫來實現,Android提供了強大的Sqlite支持,但很多時候,你也可以封裝文件或其他混合的數據。

  在Android中,Content Resolver是用來發(fā)起Content Provider的定位和訪問的。不過它僅提供了同步訪問的Content Provider的接口。但通常,Content Provider需要訪問的可能是數據庫等大數據源,效率上不足夠快,會導致調用線程的擁塞。因此Android提供了一個AsyncQueryHandler(參見:reference/android/content/AsyncQueryHandler.html),幫助進行異步訪問Content Provider。

  在各大組件中,Service和Content Provider都是那種需要持續(xù)訪問的。Service如果是一個耗時的場景,往往會提供異步訪問的接口,而Content Provider不論效率如何,都提供的是約定的同步訪問接口。

軟件開發(fā)

  Java方面

  Android支持使用Java作為編程語言來開發(fā)應用程序,而Android的Java開發(fā)方面從接口到功能,都有層出不窮的變化??紤]到Java虛擬機的效率和資源占用,谷歌重新設計了Android的Java,以便能提高效率和減少資源占用,因而與J2ME等不同。其中Activity等同于J2ME的MIDlet,一個 Activity 類(Class)負責創(chuàng)建視窗(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。   

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容