1. 程式人生 > >Android之應用開發基礎

Android之應用開發基礎

程序包 兼容 能夠 tick 狀態欄通知 lib 系統應用 java 指定

Android應用開發基礎

英文地址:http://developer.android.com/guide/components/fundamentals.html 本人英語水平不高,如有翻譯不當請指正。

文檔文件夾

  1. 1 應用組件
    1. 1.1 Activating組件
  2. 2 清單文件
    1. 2.1 聲明組件
    2. 2.2 申明組件的能力
    3. 2.3 聲明應用必須須要的設備功能
  3. 3 應用資源

Android 應用是基於Java程序語言的。Android SDK 工具編譯你的代碼以及不論什麽數據和資源文件到一個APK(全稱“an Android package”)。那是一個.apk後綴的歸檔文件。

一個APK 文件包括Android應用所需的全部內容 。apk文件是Android設備的應用程序的安裝文件。

一旦安裝在設備上,每一個Android應用程序都存在於它自己的安全沙箱:

  • 操作系統是一個多用戶Linux系統,系統中的每一個應用程序是一個不同的用戶。
  • 默認情況下,系統分配給每一個應用程序的一個唯一的Linux用戶ID(ID是系統唯一而且系統也不知道這個ID屬於這個應用)。系統給一個應用程序中的全部文件設置權限,僅僅有與用戶ID同樣的應用程序能夠訪問它們。
  • 每一個進程都有自己的虛擬機(VM),所以應用程序的代碼執行在與其它應用程序相隔離的進程中。
  • 默認情況下。每一個應用程序執行在它自己的Linux進程中。Android應用啟動過程中。不論什麽應用程序的組件都須要被執行。應用程序長時間沒有響應或者系統須要收回內存的時候,應用程序會被關閉。

這樣,Android系統實現了最細粒度的權限原則。

在默認情況下。每一個應用程序僅僅能使用自己能訪問的組件來做它須要做的工作。這將創建一個很安全的環境。應用程序不能訪問它沒有權限的系統部分。

然而,應用程序與其它應用程序之間以及一個應用程序與系統服務之間,能夠有這種數據共享方式:

  • 讓兩個應用程序共享同樣的Linux用戶ID。這是可能的,在這樣的情況下,他們能夠訪問彼此的文件。為了節約系統資源,具有同樣用戶ID的應用程序也能夠執行在同樣的Linux進程共享同樣的虛擬機(應用程序也必須使用同樣的證書簽名)。

  • 一個應用程序能夠請求對系統數據的訪問權限,如用戶的聯系人。短信。可插拔的存儲設備(SD卡),攝像頭。藍牙,等等。全部的應用程序權限必須由用戶在安裝時授予,也就是在清單文件AndroidManifest.xml上要列舉該應用須要哪些權限。

本文檔主要介紹一個Android應用程序的基礎知識。文檔其它部分會介紹:

  • 定義你的應用程序中的核心框架組件。
  • 在你的應用程序清單文件裏聲明組件和所需設備功能。
  • 資源是獨立於應用程序代碼的。這能讓你的程序為各種設備配置資源進行優化。

1 應用組件


應用程序組件是一個Android應用程序的基本構造塊。每個組件都是一個不同的點,通過這個點能夠從系統進入你的應用程序。不是全部的組件都是一個實際的切入點。但每個存在的實體。扮演著特定的角色,每個都是獨特的構建塊。能讓你規定你的應用程序的總體行為。

有四種不同類型的應用程序組件。

每一個類型都有不同的目的,有不同的生命周期,有不同的創建和銷毀規則。

這裏有四種類型的應用程序組件:

Activities
一個Activity代表了一個用戶界面。比如,一個電子郵件應用程序可能有一個Activity顯示新郵件列表,一個Activity撰寫郵件,一個Activity來讀取郵件。

盡管Activity一起形成了電子郵件應用程序。一個完整的用戶界面,但每個Activity都是獨立的。因此,不同的應用程序能夠啟動這些Activity的不論什麽一個(假設郵件應用程序同意的話)。比如。一個攝像頭的應用程序為了讓用戶分享圖片,能夠調用電子郵件應用程序中的編寫新郵件的Activity。

每個Activity都是實現 Activity 的子類,你能夠學習很多其它關於Activities的開發指南。

Services
Service組件執行在後臺執行長時間執行的操作或執行遠程操作。

Service不提供用戶界面。比如。一個Service能夠在後臺播放音樂,當用戶切換不同的應用程序時。也能夠從網絡上獲取數據,而不堵塞用戶界面和活動。還有一個組件,如Activity,能夠啟動Service,並讓它執行或綁定到它,與它進行交互。

每個Service都是實現 Service 的子類,你能夠學習很多其它關於Services的開發指南。

Content Providers
ContentProvider管理應用程序的共享數據集。

你能夠將數據存儲在文件系統中,一個SQLite數據庫上,互聯網上。或不論什麽其它應用程序能夠訪問持久存儲的位置。通過ContentProvider。其它應用程序能夠查詢或改動數據(假設ContentProvider同意)。

比如,Android系統提供一個ContentProvider管理用戶的聯系人信息。因此,不論什麽擁有適當權限的應用程序能夠查詢ContentProvider的某一部分(如 ContactsContract.Data)來讀取和寫入一個特定的聯系人信息。

ContentProvider也可用於讀取和寫入你自己應用程序私有而不是共享的數據。

比如,記事本演示樣例應用程序使用ContentProvider保存筆記。

每個ContentProvider都是實現 ContentProvider 的子類。你能夠學習很多其它關於 Content Providers 的開發指南。

Broadcast Receivers
BroadcastReceivers是一個響應系統廣播通告的組件。很多廣播起源於系統,比如。廣播通知屏幕已經關閉,電池低,或圖片拍攝。應用程序也能夠進行廣播。比方,讓其它應用程序知道某些數據已經下載到設備。其它應用能夠開始使用。盡管BroadcastReceivers不顯示用戶界面,但他們能夠創建狀態欄通知用來提醒用戶一個廣播事件的發生。更常見的是,BroadcastReceivers是一個“入口式”的進入其它組件。僅僅做一點點工作。比如,它可能會啟動一個服務來運行基於事件的一些工作。

每個BroadcastReceivers都是實現BroadcastReceiver的子類,每個廣播作為一個Intent 對象傳遞的實現。很多其它信息參見BroadcastReceiver類。

Android系統的一個獨特的方面是不論什麽應用程序能夠啟動還有一個應用程序的組件。比如。假設你想讓用戶用照相機拍一張照片。可能有還有一個應用程序須要使用它,取代應用程序自己開發一個Activity用來拍攝照片。你不須要包括或者連接到相機的應用程序代碼。

相反。你能夠簡單的啟動一個Activity,在相機拍攝照片的活動完畢時能夠獲得照片,照片會返回到你的應用程序,所以你能夠使用它。對用戶來說,相機就好像是你的應用程序的一部分。

當系統啟動一個組件,它會首先啟動應用進程(假設它不是已經在執行)和實例化該組件所須要的類。比如,假設你的應用程序啟動相機應用程序拍攝照片的Activity,這些Activity是屬於攝像頭應用程序的程序,而不是在你的應用程序的程序。

因此,不像非常多其它系統上的應用程序,Android應用程序沒有一個單一的入口點(沒有main()函數)。

由於系統執行每一個應用程序在一個單獨的進程,並限制其它應用程序訪問該應用程序的文件,你的應用程序不能直接激活還有一個應用程序的組件。

只是在Android系統中,假設你的應用程序要激活還有一個應用程序的組件,你必須向系統發送一條消息。指定你的Intent來啟動某個組件,然後系統為你激活那個應用程序的組件。

1.1 Activating 組件

三四種類型的組件如Activity,Service。和BroadcastReceivers是由一個叫做Intent的異步消息激活。

在執行時,Intent能把相互獨立的組件聯結在一起(你能夠把它們作為使者,請求一個動作從其它組件),不用管這個被聯結的組件是屬於你的應用程序還是還有一個應用程序。

一個Intent是一個創建了的 Intent 對象,它定義了一個消息來啟動某個組件。Intent啟動組件的方式能夠是顯式或隱式的。

關於Activity和Service。一個Intent定義要運行的操作(比如。“展示”或“發送”東西),能夠指定操作數據的URI(將要啟動的組件在其它事情上或許須要知道)。比如。一個Intent或許會用一個Activity來顯示圖像或請求打開一個網頁。

在某些情況下。您能夠啟動一個Activity來接受結果,在這樣的情況下。這個Activity也返回這個Intent返回的結果(比如。你能夠發起一個Intent,讓用戶選擇一個聯系人並返回給你。這個返回的Intent則包含一個URI指向選定的聯系人)。

關於BroadcastReceivers。Intent僅僅定義了通知廣播(比如,廣播指示設備電池電量低時僅僅包含一個已知的行為字符串表示“電池電量低”)。

其它的組件類型。ContentProvider,它沒有激活的Intent。

相反,它被激活時,有針對性的從一個ContentResolver發出請求。ContentResolver處理全部直接事務與ContentProvider。使組件不須要運行事務和ContentProvider。而是調用ContentResolver對象的方法。這就留下一個內容提供者和組件請求信息之間的抽象(安全)層。

這是分別激活每種組件的方法:

  • 你能夠啟動一個Activity(或給新的事情讓它做)通過一個Intent來startActivity()或者startActivityForResult() (當你想要Activity返回結果)。

  • 你能夠啟動一個服務(或給予一個正在執行的服務新的指示)通過傳遞一個Intent來startService()。或者你能夠綁定到服務通過傳遞一個Intent來 bindService()
  • 你能夠通過傳遞一個Intent去用法 sendBroadcast(),sendOrderedBroadcast(), or sendStickyBroadcast()發起廣播。
  • 你能夠使用 ContentResolverquery() 去查詢ContentProvider提供的數據查詢。

Activities, Services,BroadcastReceiver 和 Content Providers.關於使用Intent的很多其它信息。請參見 Intents 和 Intent Filters 文檔。

關於激活特定組件的很多其它信息也被提供在下面文檔: Activities, Services,BroadcastReceiver 和 Content Providers。

2 清單文件


在Android系統啟動一個應用程序組件之前,系統必須通過閱讀程序的AndroidManifest.xml文件知道組件的存在。

你的應用程序必須在這個文件裏聲明的全部組件。它必須在應用程序項目的根文件夾。

清單除了聲明應用程序的組件,還做一些其它的事情。如:

  • 向用戶標明該應用須要哪些權限,如連接互聯網和訪問用戶的通訊錄。

  • 聲明應用程序所需的最低API版本號,基於哪個API版本號的應用程序能夠使用。

  • 聲明須要使用設備中軟硬件的哪些功能,如照相機,藍牙服務,或者是多點觸控屏幕。

  • 應用程序須要鏈接哪些API庫(除了Android框架API之外)。如 Google Maps 庫。
  • 其它

2.1 聲明組件

清單的首要任務是告訴系統應用程序中有哪些組件。比如。清單文件能夠聲明一個Activity。例如以下:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
        <activity android:name="com.example.project.ExampleActivity"
                  android:label="@string/example_label" ... >
        </activity>
        ...
    </application>
</manifest>

<application> 元素中,這個 android:icon 屬性是一個標識應用程序的資源圖標。

<activity> 元素中, android:name 屬性指定這個Activity的類名,和 android:label 屬性指定一個字符串作為Activity的用戶可見的標簽。

你必須用這樣的方式聲明應用程序中用到的全部組件:

  • <activity> 元素用來聲明Activity
  • <service> 元素用來聲明Service
  • <receiver> 元素用來聲明BroadcastReceiver
  • <provider> 元素用來聲明ContentProvider

Activity,Service和ContentProvider包含在你的源碼中。但假設你不聲明在清單上,系統是看不到這些組件的,因此,應用程序也就不能執行。

然而,BroadcastReceiver既能夠在清單文件裏定義也能夠通過代碼動態創建(如BroadcastReceiver對象)和註冊的系統調用 registerReceiver()

很多其它關於怎樣構建你的應用程序清單文件。查看 AndroidManifest.xml 文檔。

2.2 申明組件的能力

如上所述,在 Activating組件 中,你能夠用一個Intent來啟動Activity。Service和BroadcastRecaiver。

你能夠使用顯式地指定目標組件(使用組件類的名稱)的Intent。然而。Intent真正牛逼的地方在於隱式的Intent。一個隱式Intent簡單描敘動作類型並運行(而且你能夠運行隨意你想要的動作),隱式的Intent同意系統在設備上查找相匹配的組件並啟動它。假設匹配到多個組件能夠運行Intent所描寫敘述的動作。那麽就會讓用戶選擇使用哪一個。

這樣的系統能識別可響應Intent的組件,是通過比較Intent在其它應用程序的清單文件提供的Intent過濾器來獲得的。

當你聲明一個Activity在你的應用程序清單中,你能夠包括Intent過濾器來申明Activity的能力。所以它能夠響應來自其它應用程序的Intent。你能夠通過為組件加入一個 <intent-filter>元素,作為組件聲明元素的子元素,用來定義一個Intent過濾器。

比如。假設你有一個在寫新郵件的Activity須要調用一個電子郵件應用程序,你能夠定義一個Intent過濾器來響應“發送”的Intent(為了發送新郵件)像這樣:

<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

然後。假設還有一個應用程序創建 ACTION_SEND Intent而且通過它 startActivity(),那麽系統能夠啟動你的Activity。用戶能夠起草和發送電子郵件。

很多其它關於創造Intent過濾器,請參考 Intents and Intent Filters 文檔。

2.3 申明應用必須須要的設備功能

有各種各樣的機器設備。他們不能提供全部功能和能力。

為了防止你的應用程序被安裝在一個“缺少你必須須要的功能”的設備上,重要步驟是你必須在清單文件裏明白定義一些配置來表明哪些類型的設備才幹支持你應用。大多數的這些聲明只不過信息,系統不讀它們,但外部服務如Google Play(谷歌應用商店)在排序和過濾用戶搜索時。會在他們的設備上閱讀應用程序的這些申明。

比如,假設你的應用須要一個攝像頭和使用Android2.1的API(API Level 7),你應該在你的清單文件裏聲明這些要求這樣:

<manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
                  android:required="true" />
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
    ...
</manifest>

如今,沒有一個相機和一個Android版本號低於2.1的設備無法從Google Play(谷歌應用商店)安裝你的應用程序。

然而,你也能夠聲明你的應用程序使用相機,但不是必須須要它。在這樣的情況下,你的應用程序必須設置須要的屬性 required"false" 。並在執行時設備是否有一個攝像頭和禁用不論什麽相機的時候適當的檢查。

很多其它的信息關於怎樣管理應用程序在不同設備的兼容性請參考Device Compatibility 文檔。

3 應用資源


一個Android應用程序不不過代碼組成的,它須要與源碼分離的資源,如圖像,音頻文件,以及不論什麽與該應用程序的視覺呈現。比如,你應該定義動畫,菜單,款式。顏色。以及用戶界面的布局XML文件。使用應用程序資源,能夠非常easy地更新你的應用程序的各種特性,而無需改動代碼,通過提供替代資源集使您能夠為不同的設備配置優化你的應用程序(如不同的語言和屏幕大小)。

對於你Android項目中的每個資源,SDK構建工具都會自己主動為這個資源定義一個唯一的ID。你能夠在你的應用程序代碼或XML文件裏,使用資源ID去引用你定義的資源。

比如,假設你的應用程序包括一個名為 logo.png 的圖片文件(保存在 res/drawable/ 文件夾)。SDK工具生成一個名為 R.drawable.logo資源ID,您能夠引用圖像插入你的用戶界面。

一個提供資源從源碼中分離的最重要的方面是你為不同的設備配置提供替代資源的能力。比如,通過在XML中定義UI字符串,你能夠把字符串翻譯成其它語言並保存在不同的字符串文件裏。

然後,基於一個“language qualifier”你能夠追加資源文件夾的名稱(比如 res/values-fr/ 表示法國字符串值)用來配置不同的用戶語言,Android系統會應用合適的語言字符串UI。

Android系統能夠支持非常多不同的資源限定符。

限定符是一個短字符串,包括你的資源名稱和文件夾名稱,在有序的定義配置下。設備會選擇使用某一個資源。還有一個樣例,你應該常常為你的Activity創建不同的布局,依據設備的屏幕方向和大小。比如。當設備屏幕是縱向的(高),你可能會想要一個有button的布局是垂直的,但當屏幕是橫向的(寬),button應水平對齊。

依據方向改變布局,你能夠定義兩個不同的布局和應用適當的限定詞在布局的文件夾名。然後。系統自己主動使用適當的布局會取決於當前設備的方向。

很多其它關於不同種類的資源,你能夠在你的應用程序以及怎樣為不同的設備配置,創造替代資源,請閱讀 Providing Resources。

繼續閱讀:

Intents and Intent Filters
有關怎樣使用 IntentAPI激活應用程序的組件,如活動和服務,以及怎樣使你的應用程序的組件可用於其它應用程序。

Activities
有關怎樣創建Activity類的一個實例,並提供一個用戶界面應用程序的不同的屏幕。
Providing Resources
關於Android應用程序的結構。將資源從應用程序代碼中的信息。包含你能夠為特定的設備配置提供替代資源。


Android之應用開發基礎