安卓應用開發基礎:android Dev Guide的Application Fundamentals中文翻譯

來源:互聯網
上載者:User
  註:我最近加入了Android中文翻譯組,旨在為大家帶來更好的翻譯。該章節已完成初稿並提交審核校正。以下內容為不完整版本,已不推薦閱讀。最終版之後會由Android中文小組發布,請大家見諒。安卓應用基礎

第一次翻譯,翻譯的不對或是不準確的地方還請大家指正,英文原文地址:http://developer.android.com/guide/topics/fundamentals.html

Android應用是用Java程式設計語言寫的。Android SDK工具將代碼同其他的資料、資源檔一起編譯成一個尾碼為.apk的壓縮檔(即Android package)。一個apk檔案就是一個Android應用,使用Android的裝置就是用apk檔案來安裝Android應用的。

一旦在裝置上安裝,每個Android應用都運行在自己的安全“沙箱”中:

  ●  Android作業系統是一個多使用者的Linux系統,每個應用都是一個不同的使用者。(PS:因為沒學過Linux,這裡不太理解)

  ●  預設情況下,系統將為每個應用程式指派一個獨一無二的Linux使用者ID(這個ID僅被系統使用,應用本身是不知道它的)。應用中的所有檔案訪問許可都被系統設定了此 ID,因此,只有被分配了該使用者ID的應用可以訪問這些檔案。

  ●  每個進程都有自己的虛擬機器,所以一個應用的代碼執行是和別的應用分割開來的。

  ●  預設情況下,每個應用都運行在自己的Linux進程中。當應用的某個或某些組件需要執行時,Android將啟動此應用的進程;當應用不再需要執行或者系統必須為了其 他應用恢複記憶體時,進程被停止。

Android系統通過這種方式實現最低許可權原則(the principle of least privilege).也就是說,每個應用在只需要完成自己的功能而不需要其他服務的時候,預設只對自己的組件有存取權限。這創造了一個非常安全的環境,因為應用在沒有獲許的情況下是不能訪問系統的其他部分的。

然而,應用也是有辦法和別的應用共用資料甚至訪問系統服務的:

  ●  使兩個應用共用同一個Linux使用者ID是有可能的,這樣的話他們就能互相訪問彼此的檔案了。為了節省系統資源,使用同一個ID的應用也能運行在一個進程中並且共 享虛擬機器(這些應用必須使用相同的認證)。

  ●  應用可以申請擷取裝置資料(如使用者的連絡人、短訊息、SD卡、網路攝影機、藍芽等)的許可。所有的應用許可都必須在應用安裝的時候獲得使用者的准許。

上面介紹了關於Android應用程式在系統中執行的基礎知識。這篇文檔的剩餘部分將向您介紹:

  ●  定義應用的核心架構組件。

  ●  manifest檔案,該檔案為應用聲明組件和需要的裝置特性。

  ●  與應用代碼分離的資源,它能讓你的應用通過各種裝置配置優雅的最佳化其行為。

應用組件

應用組件是Android應用所必需的構建塊。每個組件都是系統進入你應用的一個不同的入口。儘管不是所有的組件都是使用者的實際進入點,它們彼此間還存在著一些相互依賴,但是每個組件都擁有自己的實體,並且扮演著獨特的角色——每一個都是定義你應用總體行為的獨一無二的構建塊。

應用組件有4種不同的類型。每個類型都有不同的設計目標,並且定義了如何建立和銷毀的不同生命週期。

下面是這4種應用組件:

Activities(活動)

activity代表有使用者介面的一個單一的螢幕。比如:一個email應用可能有一個activity來顯示新郵件的列表,另一個activity來撰寫電子郵件,另一個activity來閱讀郵件。雖然在一個email應用中,這些activity一起形成了一個有凝聚力的使用者體驗(cohesive user experience,翻譯得很彆扭),但是每個activity都是獨立於其他activity的。舉個例子,一個攝像應用可以啟動email應用中撰寫郵件的activity來分享一副圖片。

通過繼承Activity類來實現一個activity,閱讀activities開發指導你能瞭解到更多。

Services(服務)

service是在後台運行長時間操作或者執行遠程進程工作群組件。service不提供使用者介面。比如,一個service可以在使用者執行另一個應用時在背景播放音樂,或者不阻塞使用者與activity互動,通過網路抓取資料。另一個組件,比如activity,能夠通過開啟、運行或綁定service來與之互動。

一個service是Service類的子類,閱讀Services開發指導你能瞭解到更多。

Content providers(內容提供者)

Content providers管理應用的共用資料。你能將資料存放區在檔案系統、SQLite資料庫、web或者任何你的應用能訪問到的永久儲存地點。通過content provider,其他應用能查詢或修改這些資料(如果content provider允許)。比如,Android系統提供了系統管理使用者連絡人資訊的content provider。因此,得到許可的任何應用都能查詢content provider(比如ContactsContract.Data)的一部分來讀寫某一連絡人的資訊。

Content providers對應用的私人和不共用資料的讀寫也是同樣有協助的。比如,Note Pad樣本使用了一個content provider來儲存筆記。

一個content provider通過繼承ContentProvider抽象類別並且實現允許其他應用執行事務的一組標準API來實現。想要更多資訊,見Content Providers的開發指導。

Broadcast receivers(廣播接受者)

一個broadcast receiver是響應全系統廣播通知的一個組件。許多廣播由系統發起——比如,宣布螢幕已關閉,電量不足,或者照片被捕獲的廣播通知。應用也能夠初始化廣播——比如,一個告訴其他應用資料已經被下載到裝置上,可以被他們使用的廣播。儘管broadcast receivers並不顯示使用者介面,它們可能建立一個狀態列通知來告知使用者廣播何時發生。但是,更常見的情況是,broadcast receiver只作為其他組件的“出入口”(gateway),其本身做的工作非常少。舉個例子,它可能初始化一個服務來根據具體事件執行一些工作。

一個broadcast receiver通過繼承BroadcastReceiver類來實現,每個broadcast被作為一個Intent對象發布。想要更多的資訊,見BroadcastReceiver類。

  

Android系統設計的一個獨特之處在於,任何一個應用都能啟動其他應用的組件。比如,如果你想要使用者使用相機擷取一張照片,這個功能另一個應用能實現,你的應用就可以使用它,而不必由你自己再開發一個捕捉照片的activity。你不必協同甚至連上照相應用的代碼。取而代之,你只需簡單地啟動照相應用捕捉照片的activity就行了。當調用完成時,照片被傳入你的應用,然後你就可以用它了。對使用者來說,照相機好像就是你應用的一部分。

當系統啟動你的組件,它就會啟動這個應用的進程(如果不在啟動並執行話)並且初始化這個組件需要的類。比如,如果你的應用啟動了照相應用拍照的activity,這個activity就在屬於照相應用的進程中運行,而不在你應用的進程中。因此,與大多數其他系統不同,Android應用沒有一個單一的入口(比如說,沒有main()函數)。

由於系統將應用運行在一個有檔案許可權的獨立進程中,限制了對其他應用的訪問,因此你的應用不能直接啟用其他應用的組件。然而,Android系統是可以的。因此,為了啟用其他應用的組件,你必須向系統發訊息說你意圖(intent)啟動一個特殊的組件。然後系統為你啟用該組件。

組件啟用

上述四種組件類型中,activities、services和broadcast receivers這三種是被一個叫做intent的非同步訊息啟用的。Intents在運行時將獨立的組件聯絡起來(你可以把它們想象成向其他組件請求動作的訊息),不管這個組件屬於你的應用還是別的。

一個intent被建立為一個Intent對象,它定義了啟用指定組件或組件類型的訊息——intent可以是顯示的,也可以是隱式的。

針對activities和services,intent定義了要執行的動作(比如,要“看”或者“發送”一些東西)並且可能指定要操作的資料URI(除了其他事項外,將要執行的組件可能需要知道它)。例如,一個intent可能向一個activity傳達訊息說要顯示一幅圖片或者開啟一個網頁。有些情況下,你能啟動一個activity來接受結果,即activity也能通過intent來返回結果(比如,你發出一個intent讓使用者選擇一個連絡人並將他返回給你——這個返回的intent包括了指向所選連絡人的URI)。

針對broadcast receivers,intent簡單定義了要廣播的公告(比如,一個指示裝置電量不足的廣播只包括了一個已知動作的字串,暗示"電量不足")。

剩下一種組件類型,content provider,不被intent所啟用。它被一個來自ContentResolver的目標請求所啟用。內容解譯器(content resolver)直接處理content provider的所有直接事務,因此執行這些事務的組件不需要和content provider打交道,取而代之的是調用ContentResolver的方法。這留下了content provider和組件請求資訊之間的抽象層(出於安全)。

以下這些分離的方法用於啟用每一種組件類型:

  ●  你能通過向startActivity()或者startActivityForResult()(當你想要讓activity返回結果)方法傳遞一個Intent來開始一個activity(或者讓它做一些新的事)。

  ●  你能通過向startService()方法傳遞一個Intent來開始一個service(或給一個正在執行的service新的指令)。或者你能通過向bindService()方法傳遞一個Intent來 綁定一個service。

  ●  你能通過向sendBroadcast(),sendOrderedBroadcast()或者sendStickyBroadcast()這樣的方法傳遞一個Intent來初始化一個broadcast。

  ●  你能通過調用ContentResolver的query()方法執行一次查詢。

要得到更多關於使用intent的資訊,見Intents and Intent Filters文檔。關於啟用指定組件的更多資訊也請參考下列文檔:Activities,Services,BroadcastReceiver和Content Providers。

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.