編輯:關於Android編程
Android應用程序是用Java編程語言編寫的。Android SDK工具把應用程序的代碼、數據和資源文件一起編譯到一個Android程序包中(這個程序包是以.apk為後綴的歸檔文件),一個Android應用程序就是一個單獨.apk文件中的所有內容,並且Android設備使用這個文件來安裝應用程序。
安裝在設備上的每個Android應用程序都生活在它們自己的安全沙箱中:
1. Android操作系統一個多用戶的Linux系統,在這個系統中每個應用程序都是一個不同的用戶。
2. 默認情況下,系統給每個應用程序分配一個唯一的Linux用戶ID(這個ID只能被系統使用,並且對於應用程序是未知的)。系統給應用程序中的所有文件設置權限,以便只有跟用戶ID匹配的應用程序能夠訪問他們。
3. 每個進程都有它們自己的虛擬機,因此應用程序的運行是彼此隔離。
4. 默認情況下,每個應用程序運行在它們自己的Linux進程中,當任何應用程序需要被執行時,Android啟動這個進程,在不再需要的時候或系統必須為其他應用程序恢復內存時這個進程被關閉。
Android系統實現了最小特權原則,也就是說,默認情況下,每個應用程序只能訪問支持它工作的必須的組件。這樣就創建了一個安全的環境,在這個環境中應用程序不能訪問系統沒有給它授權的部分。
但是,還有一些應用程序間共享數據和應用程序訪問系統服務的方法:
1. 兩個應用程序共享相同的Linux用戶ID是可能的,這樣它們就能夠訪問彼此的文件。為了節省系統資源,擁有相同用戶ID的應用程序也可以運行在相同的Linux進程中,並且共享相同的虛擬機(應用程序必有擁有相同的數字簽名)
2. 應用程序能夠請求訪問設備數據的權限(如用戶的通訊錄、短信、可安裝的存儲設備、照相機、藍牙等等),所有的應用程序的權限都必須在按照時被用戶授予。
在這篇文章的剩余部分會介紹Android應用程序是如何存在與系統中的基礎知識:
1. 定義應用程序的核心框架組件;
2. 在manifest文件中為應用程序聲明組件、請求設備功能;
3. 把應用程序的代碼與資源分離,並且允許應用程序使用各種設備配置優化它們的行為。
應用程序組件
應用程序組件是Android應用程序的重要基石,每個組件都是系統進入應用程序的不同入口,對於用戶來說,不是所有的組件都是實際的入口,並且有一些是彼此依賴的,但是每一個組件都存在它們自己的實體,並且扮演著特殊的角色---它們都是幫助定義應用程序整體行為的唯一的模塊。
應用程序有四種不同類型的組件,每種類型服務一個不同的目的,並且有一個定義組件如何創建和摧毀不同的生命周期。
以下是應用程序組件的四種類型:
Activites
一個Activity代表一個和用戶接口的單獨屏幕。例如,一個email應用程序可以有一個顯示新郵件列表的Activity,一個寫郵件的Activity和一個讀郵件的Activity。在郵件應用程序中雖然這些Activity一起工作,從而形成統一的用戶體驗,但是它們是彼此獨立的。這樣,一個不同的應用程序能夠啟動這些Activity中的任何一個(如果郵件應用程序允許)。例如,一個相機應用程序為了給用戶共享一張圖片,可以啟動郵件程序中編寫新郵件的Activity。
一個活動是作為一個Activity子類實現的,可以在Activities開發者指南中學到更多的內容。
Services
Service是一個運行在後台的組件,用於執行長時操作或執行遠程處理工作。Service不提供用戶接口。例如,一個Service可能在後台播放音樂而用戶卻在使用另一個不同的應用程序,也可以是一個不帶有Activity用戶接口的從網絡上獲取數據的Service。
Content providers
Content provider管理一個共享的應用程序數據集,可以在文件系統(一個SQLite數據庫、在網絡上、或者其他的應用程序能夠訪問的本地的持久化的存儲介質)中保存數據,通過content provider,其他的應用程序能夠查詢或編輯(如果content provider允許)數據。例如,Android系統提供了一個管理用戶通訊錄的content provider。這樣,任何帶有適當授權的應用程序都能夠查詢由content provider讀/寫的數據。
Content provider也可用於讀寫應用程序的私有數據而不是共享,例如Note Pad程序就是用一個content provider來保存注釋。
Content provider是做為ContentProvider的一個子類來實現的,並且必須實現一組標准的使其他應用程序能夠執行事務的API。
Broadcast receivers(廣播接收器)
Broadcast receivers是一個響應全系統廣播通知的組件。系統有很多廣播源,例如屏幕關閉的一個廣播通知、電池電量不足通知、抓圖通知等。應用程序也能啟動廣播,例如讓其他的應用程序知道某些數據已經下載到設備上,並且應用可以有效使用。雖然Broadcast receivers不顯示用戶接口,但是他們可以創建狀態欄通知,提醒用戶廣播事件發生了。更常見的是,Broadcast receivers只是作為其他組件的一個網關,並且做很少的工作。例如,它可以啟動一個執行某些基於事件來工作的服務。
Broadcast receiver是做為BroadcastReceiver的一個子類來實現的,並且每個廣播作為一個Intent對象來分發。
Android系統設計獨特一面是任何應用程序都能夠啟動另外應用程序的組件。例如,如果想要用戶使用相機設備拍照,就有可能在一個應用程序中拍照而在另外一個應用程序中使用照片,而不需要在自己的應用程序中開發一個用於拍照的Activity。你不需要合並或事件聯接來自相機應用的代碼,而是簡單啟動照相機應用中用於拍照的Activity。當拍照完成,這個事件就返回到你的應用程序以便你能夠使用照片。對於用戶來說,照相機應用程序就好像你的應用的一部分。
系統啟動一個組件時,它會啟動那個應用的進程(如果應用未運行),並且初始化組件需要的類。例如,如果你的應用程序啟動照相機應用中用於拍照的Activity,這個Activity運行在屬於照相機應用的進程中,而不是你自己的進程中。因此,跟大多數其他系統不一樣,Android應用程序沒有一個單獨的進入點(例如,沒有main()方法)。
由於系統在一個獨立的限制訪問其他應用文件的進程中運行每個應用程序,所以應用程序不能直接激活來自其他應用程序的組件。但是,Android系統可以做到,因此要激活另一個應用程序中的一個組件,就必須發一個消息給系統,指定打算啟動的特定的組件,然後系統為你激活這個組件。
激活組件
四種類型組件中的三種(Activities、Services、Broadcast receivers)是通過被叫做Intent的異步消息激活的。Intents在運行時綁定彼此獨立的組件(可以把它想象成一個來自其他組件的請求一個動作信使),而不關注組件是屬於應用自己還是其他的應用程序。
一個Intent就是一個Intent對象,它定義了一個消息,既可以激活指定的組件也可以激活指定的組件類型,一個Intent既可以是明確的也可以是隱含的。
對於Activities和Services,一個Intent定義了要執行的動作(例如:浏覽或發送等事情),並且可以指定數據位置(對於正在啟動的組件可能需要了解這些信息)。例如,一個Intent可能傳達一個請求,要一個Activity顯示一張圖片或打開一個Web網頁。在某些場合,還可以啟動一個Activity來接收一個結果,這個Activity也返回Intent中的結果(例如:你可以發出一個Intent,讓用戶選擇一個個人的聯系方式,並且要它返回給你,返回的Intent包括一個指向選擇的聯系方式的位置。)。
對於廣播接收器,Intent簡單的定義了廣播的通知(例如,一個指示設備電量不足的廣播,只包含了一個已知行為的字符串:電池電量不足.)。
另一個組件類型—Content Provider不是用Intents來激活的,它是在來自一個ContentResolver對象請求目標時被激活。內容解析器使用Content Provider處理所有的直接事務,以便組件不必在用Content Provider來執行事務,而是調用ContentResolver對象上的方法。這樣就在內容提供者和組件請求信息之間形成了一個抽象層。
每種類型組件都有獨立的方法來進行激活:
1. 通過傳遞一個Intent給startActivity()或startActivityForResult()(需要Activity返回一個結果時調用這個方法)方法能夠啟動一個Activity(或者讓這個Activity做一些新的事情。)
2. 通過傳遞一個Intent給startService()方法來啟動一個Service(或者給一個運行的Service發送新的指令),也可以通過傳遞一個Intent給bindService()方法綁定Service
3. 通過傳遞一個Intent給sendBroadcast()、sendOrderedBroadcast()、sendStickyBroadcast()這樣的方法可以啟動一個廣播;
4. 通過調用ContentResolver上的query()方法,可以執行一個對Content Provider的查詢。
關於使用Intents的更多信息,可以看目的和目的過濾器(Intents and Intent Filters)。關於激活特定組件的更多信息在下列文檔中也提供了:Activities、Services、BroadcastReceiver和Content Providers。
清單文件
Android系統在啟動一個應用程序組件之前,必須通過閱讀應用程序的AndroidManifest.xml文件來了解組件的存在情況。應用程序必須在這個文件中聲明所有的它用到的組件,這個文件必須在應用項目目錄根目錄。
清單文件除了聲明應用程序組件之外,還做了許多其他的事情,如:
1. 標識應用程序需要的用戶權限,如:互聯網訪問或讀取用戶聯系人的權限等;
2. 聲明應用程序需要的最小API級別,也就是要說明應用程序使用的是基於那個級別的Android API;
3. 聲明應用程序使用或需要的硬件和軟件的功能,例如照相機、藍牙服務、或多點觸摸;
4. 應用程序需要的API庫鏈接(Android框架API除外),如Google地圖類庫。
聲明組件
清單(Manifest)的主要任務是通知系統應用程序的組件構成,例如,清單文件能夠像下例那樣聲明一個Activity:
android:label="@string/example_label" ... >
...
在元素中,android:icon屬性指明了標識應用程序的一個圖標。
在元素中,android:name屬性指定了Activity子類的完整類名,android:label屬性給Activity指定了一個用於顯示給用戶的字符串標簽。
必須使用以下方法聲明所有的應用程序組件:
1. 元素用於聲明Activities
2.
3.
4.
在源代碼中包含的Activities、Services、和Content Providers沒有在清單文件中聲明,對系統就是不可見的,所以就不能運行。但是Broadcast Receivers既可以在清單文件中聲明也可以在代碼中動態的創建(如BroadcastReceiver對象),然後通過調用registerReceiver()方法在系統中注冊。
關於應用程序的清單文件結構的更多內容,可以查看The AndroidManifest.xml File文檔。
聲明組件的能力
像Activating Components一節中討論的那樣,可以使用一個Intent來啟動Activities、Services和Broadcast Receivers。通過明確的指定在Intent中的目標組件的名字(使用組件的類名)就可以做這件事。但是Intent的實際能力在於Intent行為的概念。使用Intent行為,可以簡單的描述想要執行的行為的類型(並且可選擇型的描述在希望執行行為之上需要的數據),並且允許系統在設備中查找能夠執行行為的組件並啟動它,如果有多個能夠執行被Intent描述的行為的組件,那麼用戶可以選擇使用其中之一。
系統通過比較設備上其他應用程序的清單文件中提供的Intent過濾器收到的Intent來識別組件能夠響應的一個Intent。
在應用程序清單中聲明一個組件時,能夠選擇性的包含具有聲明組件能力的Intent過濾器,以便能夠響應來自其他的應用程序的Intent。通過在組件的聲明元素中添加一個
例如,用一個Activity來寫信郵件的郵件應用程序,可能在它的清單中聲明一個Intent過濾器,以便進入響應“發送“的Intents(為了發送郵件),然後,應用程序中的一個Activity能夠創建一個帶有“發送”行為的Intent,在你用startActivity()方法調用Intent是,系統會匹配郵件應用程序的“發送”Activity,並且加載它。
關於創建Intent過濾器的更多信息,可查看Intents and Intent Filters文檔。
聲明應用成的要求。
Android支持很多設備,並且所有這些設備所提供的功能都不盡相同。為了防止應用程序被安裝在那些缺少應用程序所需要的功能的硬件設備上,可以在應用的清單文件中聲明設備和軟件要求,以便清晰的定義一個應用程序所支持的設備類型的簡介。這些聲明的大多數都只是信息式的,系統不會讀取它們,但是另外的服務(如Android Market)為了給用戶提供過濾服務,會在用戶的設備上搜索這些信息。
例如,如果應用程序需要使用照相機和Android2.1中APIs(API Level 7),就應該在應用程序的清單文件中聲明這些需求,這樣,沒有照相機並且Android版本低於2.1的設備就不會動Android Market上安裝這個應用程序。
雖然你可以聲明你的應用程序使用了照相機,但這不是必須的,如果沒有聲明,你的應用程序就必須在運行時執行一些檢查,判斷設備是否有照相機功能,如果照相機功能無效,那麼應用程序中一些相關功能就需要禁用。
一下是在設計和開發應用程序時應該重點考慮的一些設備特征:
屏幕大小和分辨率
為了通過屏幕類型區分設備,Android為每個設備定義了兩個特征:屏幕大小(屏幕的物理尺寸)和屏幕分辨率(在屏幕上點的物理密度,或dpi---每英寸的點數)。為了簡化所有的不同屏幕類型的配置,Android系統把它們歸納到更容易定位的選擇組。
屏幕的大小是:小、普通、大、超大;
屏幕的分辨率是:低分辨率、中分辨率、高分辨率和超高分辨率。
默認情況,應用程序會兼容所有的屏幕大小和分辨率,因為Android系統會對你的UI布局和圖片資源進行相應的調整。但是,對於確定的屏幕尺寸,你應該創建特定的布局,並且對於確定的分辨率要提供特定的圖片,也可以使用布局資源,並且在應用程序的清單中使用
更多信息,請看Supporting Multiple Screens文檔。
輸入配置
很多設備提供了不同的用戶輸入機制,如鍵盤、軌跡球、或五向導航板。如果你的應用程序需要特殊的輸入硬件類型,那麼就應該在清單的
設備功能
在給定的Android設備上有許多硬件和軟件功能存在或不存在,如照相機、亮度傳感器、藍牙、OpenGL的某個版本、或觸屏的精度等。你不應該假設某個功能在所有的Android設備上都是有效的(標准的Android類庫除外),因此你應該用
平台版本
不同的Android設備經常運行著不同的Android平台的版本,如Android1.6或Android2.3.每個後續的版本經常會包括以前版本中額外的無效的APIs。為了指明APIs集合的有效性,每個平台版本都指定了一個API級別(例如,Android1.0的API級別是1,Android2.3的API級別是9)。如果你使用任何在1.0版本以後添加的APIs,你應該使用
為你的應用程序聲明所有這些要求是至關重要的,當你把應用程序發布到Android Market時,Market使用這些聲明來過濾在每個設備上有效的應用程序。正因如此,你的應用程序應用只對所有的滿足你的應用程序要求的設備有效。
關於Android Market基於這些要求過濾應用程序的更多信息,請看Market Filters文檔。
應用程序資源
一個Android應用程序只是由代碼組成的,它需要獨立與代碼之外的資源,如圖片、音頻文件、以及任何有關應用程序的視覺表現部分等等。例如,你應該使用XML文件來定義用戶界面的動畫、菜單、樣式、顏色、以及Activity的布局等。使用應用程序資源使更新應用程序的各種功能更加容易,而不必編輯代碼,通過提高可選的資源集。能夠使你針對各種設備配置優化應用程序(例如不同的語言和屏幕尺寸)。
對於在你Android項目中包含的每種資源,SDK編譯工具都給定義了一個唯一的數字ID,你能夠使用XML文件中定義的這個ID在應用程序的代碼或其他的資源中引用這個資源。如,如果應用程序中包含了一個名叫logo.png的圖片文件(保存在res/drawable/目錄中),SDK工具就會生成一個叫做R.drawable.logo的資源ID,你能夠通過這個ID來引用這個圖片,並把它插入到用戶界面中。
把資源與代碼分離的重要原因之一是給不同的設備配置提供可選資源的能力。例如,通過在XML文件中定義UI字符串,你能夠把這些字符串翻譯成其他的語言,並且把它們保存到一個獨立的文件中,然後基於一個語言預選器(你追加的資源目錄名,如res/values-fr/目錄中保存法語字符串)和用戶的語言設置,Android系統就會在UI中使用適當的語言字符串。
Android支持很多不同選擇資源的預選器,預選器是一個包含在資源目錄名中的簡短的字符串,以便定義設備配置應該使用哪些資源。如,根據設備屏幕的取向和尺寸,針對Activity應該創建不同的布局,當設備屏幕縱向高的時候,你可能想要按鈕垂直布局,而當屏幕橫向寬的時候,你可能想要按鈕水平布局。要改名依賴取向的布局,你可以定義兩個不同的布局並且用每個布局的目錄名作為相應的預選器,然後系統就會根據當前屏幕的取向,自動的使用相應的布局了。
關於應用程序中能夠包含的資源種類以及如何為不同設備配置創建可選資源,請看Application Resource開發指南。
官網:https://developer.android.com/intl/zh-tw/training/material/shadows-clipping.html
自定義View一直是自己的短板,趁著公司項目不緊張的時候,多加強這方面的練習。這一系列文章主要記錄自己在自定義View的學習過程中的心得與體會。刷微博的時候,發現微博運動
一、導入*.jar包1.直接copy①復制*.jar包,粘貼到主工程目錄的libs下邊②右鍵,將此jar包設置成自己的library③然後在工程右鍵的選擇項目單擊Open
Paint與Canvas下面先說下Paint的基本設置函數:paint.setAntiAlias(true);//抗鋸齒功能paint.setColor(Color.RE