正在嘗試分析SDK中的示例程序NotePad,發現仍然還欠缺不少知識。今天看到 API Guides 下有一部分應用程序基礎 Application Fundamentals,感受須要進一步學習。因而準備採用以前的策略,邊翻譯,邊學習。雖然這樣作,學起來很慢,可是,好在能夠慢慢理解,轉化爲本身的語言的同時也是一種加深記憶的過程。反正,我也只是業餘學習,不趕時間,呵呵。 html
整個API指南有不少個章節,下面先把章節的名字列一下,這樣知道還有多長的路要走。 android
API Guides (developer.android.com/guide/components/index.html) 數據庫
其中第一章 應用程序組件(App Components)就有多個子章節。各章節的名字以下: 編程
App Components 安全
下面正式進入第一小節 App Fundamentals 的學習。 網絡
Android應用程序使用JAVA語言編程。Android SDK工具編譯源代碼,並連同全部的數據文件和資源文件,打成一個Android包(以.apk爲後綴的存檔文件)。在一個.apk文件裏的全部代碼被認爲是一個應用程序。基於Android系統的設備(手機或者平板)經過這個文件來安裝應用程序。 框架
Android應用程序一旦被安裝到設備(手機或平板電腦)上,那麼它就只存活在屬於它本身的安全沙盒中。 異步
譯者注:現實中的沙盒,是一種兒童玩具,類如KFC中一個裝滿小球的容器,兒童能夠在隨意玩耍,起到保護兒童的做用。(也能夠理解爲一種安全環境)。一樣在網絡技術中也是一種按照安全策略限制程序行爲的執行環境。 ide
在這種方式中,Android系統實現了最小特權原則。也就是,默認狀況下,每一個應用程序只能訪問的它須要爲其工做的組件,而沒有更多權限。這創造了一個很是安全的環境,應用程序不能訪問它沒有得到權限的系統的一部分。 函數
不過,也有一些方法可使應用程序之間共享數據,或者讓應用程序訪問系統服務:
本文介紹關於Android應用程序如何在系統運行的基礎知識。本文檔的其他部分將向你介紹:
應用程序組件是應用程序的基本構建塊。每一個組件都是不一樣的切入點。經過它們,系統能夠進入你的應用程序。並不是全部的組件都是用戶的實際切入點,它們其中的某一些是相互依賴的。但每個組件都做爲本身實體存在並扮演一個特定的角色,都是用來幫助定義你的應用程序總體行爲的一個獨特的建築塊。
有四種不一樣類型的應用程序組件。每種類型服務於不一樣的目的,有不一樣的生命週期(定義瞭如何建立和銷燬)。
下面列舉了這四種不一樣類型的應用程序組件:
Activities
一個activity就是一個用戶界面。例如,一個電子郵件應用程序可能有一個activity,用於展現新電子郵件的列表,另外一個activity用於編寫電子郵件,還有一個用於讀取郵件的activity。雖然在電子郵件這個應用中,多個activity共同做用造成了一個總體的用戶體驗。可是,每個activity都是獨立的。所以,另一個應用程序能夠啓動這些activity中的任何一個(若是郵件應用程序容許的話)。例如,一個攝像頭的應用能夠經過啓動郵件應用程序中的activity來新建一封電子郵件,從而實現照片分享功能。
一個activity要做爲Activity的子類來實現,更多的信息能夠參考Activity的開發指南。
Services
服務是一個在後臺運行的組件,用來執行長時間操做或執行遠程操做。服務不提供用戶界面。例如,一個服務能夠在後臺播放音樂,而此時用戶在另一個不一樣的應用程序中。也能夠用來從網絡獲取數據,而同時不阻塞用戶與一個activity的交互。別的組件,如activity,能夠啓動一個服務,並讓它運行,或者與它綁定,並進行交互。
一個服務要做爲Service的子類來實現,更多的信息能夠參考Services的開發指南。
Content providers
內容提供者管理應用程序用來共享的數據集合。你能夠將數據存儲在文件系統,SQLite數據庫,互聯網,或者其它任何你的應用程序能夠訪問的持久化存儲位置。經過內容提供商,其餘應用程序能夠查詢甚至修改數據(若是內容提供者容許的話)。例如,Android系統提供一個內容提供者用於管理用戶的聯繫人信息。所以,任何擁有合適權限的應用程序能夠查詢內容提供者的某一部分(如ContactsContract.Data)來讀取和寫入一個特定聯繫人的信息。
內容提供者也能夠用於讀寫那些應用程序私有的沒有共享的數據。例如,記事本示例程序就使用內容提供者來保存記錄信息。
內容提供商做爲ContentProvider的一個子類來實現,而且必須實現了一套標準的API接口,方便其餘應用程序來調用執行。欲瞭解更多信息,請參閱Content Providers開發人員指南。
Broadcast receivers
廣播接收器是一個用於響應系統範圍內廣播公告的組件。許多廣播都是由系統所產生的。例如,一個廣播能夠報告屏幕已關閉,電量低,或者捕獲到了一個圖片。應用程序也能夠發起廣播——好比,讓其餘應用程序知道,有一些數據已經被下載到設備上,能夠被他們使用了。雖然廣播接收器不會有用戶UI界面的顯示,可是它們可能會建立一個狀態欄通知,來告知用戶有廣播事件發生。一般來講,廣播接收機只是一個到其它組件的「網關」,它要作的事情很是少。例如,它可能會啓動一個服務來執行一些基於這一事件的工做。
一個廣播接收機做爲BroadcastReceiver的一個子類來實現,每一個廣播是做爲一個Intent對象來交付的。更多的信息,請參見BroadcastReceiver類。
Android系統有一個不一樣尋常的特性,任何應用程序均可以啓動另一個應用程序的組件。例如,若是你但願用戶使用設備(手機或者平板電腦)的攝像頭去拍一張照片,這頗有多是另一個應用程序所實現的功能,而你的應用程序能夠直接去使用它。而不須要你本身開發一個activity去實現拍照的功能。你不須要合併或者連接相機應用程序的代碼。相反地,你只須要簡單地啓動相機應用程序中的一個activity來實現拍照的功能。當拍照完成以後,所拍的照片甚至會返回到你的應用程序,這樣你能夠直接使用它。對於用戶而言,照相機功能就好像是你的應用程序的一部分。
當系統啓動一個組件時,應用程序就開始運行了(若是這以前並無運行),而且實例化這個組件所須要的類。例如,若是你的應用程序啓動了相機應用程序中的activity來捕捉一張照片,那麼這個activity其實是運行在相機應用程序的處理進程中,而不是在你的應用程序的處理進程中。所以,與大多數其餘系統上的應用程序不一樣,Android應用程序沒有一個單一的入口點(例如,沒有main()函數)。
由於每一個應用程序運行在一個單獨的進程裏,其文件權限限制了其餘應用程序的訪問。因此,你的應用程序不能直接激活另一個應用程序中的組件。然而,Android系統能夠。因此,要想激活另一個應用程序中的組件,你必須給系統發一個消息,指定一個啓動特定組件的intent。而後,系統就幫你去激活該組件。
Activating Components
四個組件類型的三個:活動、服務、廣播接收器都是被一個稱爲intent的異步消息所激活的。Intent能夠在運行時,將組件與組件之間結合起來(你能夠把它們想象成信使,用於請求其餘組件的動做),而不論這個組件是不是屬於你的應用程序仍是別的應用程序。
經過建立一個Intent對象來建立intent。它定義一個消息,用來激活一個特定組件或者特定類型的組件。一個intent能夠是顯式的,也能夠是隱式的。
對於活動和服務,intent須要定義將要執行的操做(例如,「查看」或「發送」某些東西),同時也可能會給出操做時須要的數據的URI(或者組件開始工做時須要的其餘什麼東西)。例如,一個intent可能會請求一個活動來顯示一個圖像或打開一個網頁。在某些狀況下,你能夠開始一個活動來得到結果,在這種狀況下,該活動也會將結果放在Intent中返回(例如,能夠發出一個intent,讓用戶選擇一個聯繫人並返回給你,返回的intent包含一個指向所選定聯繫人的URI)。
對於廣播接收器,intent只是簡單地定義了要廣播的公告(例如,一個指示設備電量不足的廣播就只包含一個已知動做的字符串,以表示「電量不足」)。
其餘組件類型,內容提供商,則不是被intent激活的。相反,它是被ContentResolver的一個請求所激活的。內容解析器(ContentResolver)處理全部與內容供應商(Content Provider)的直接交易,這樣,執行事務的組件就不須要了,而是調用ContentResolver對象上的方法。這使得內容提供者和請求信息的組件之間有一個抽象層(爲了安全)。
每一個類型的組件都有單獨的激活方法:
經過傳遞一個Intent給startActivity()或者startActivityForResult()(當須要返回結果時),你能夠啓動一個活動(或者給它一些新的東西去作)。
經過傳遞一個Intent給startService(),你能夠啓動一個服務(或者將新的指令發給正在運行的服務)。或者經過傳遞一個Intent給bindService()來實現服務的綁定。
經過傳遞一個Intent給sendBroadcast(),sendStickyBroadcast()或者sendOrderedBroadcast(),你能夠發起一個廣播。
經過調用ContentResolver的query()方法,你能夠給內容提供者發起查詢請求。
對於如何使用intent的更多信息,請參見Intents and Intent Filters文件。更多有關於激活特定的組件的信息,也在下列文件中提供:Activities,Services,BroadcastReceiver,Content Providers。
未完待續……