標籤:
我們知道,android自第一代發布以來,它的版本更新迭代的速度可以說是非常快的,但是android又是一個移動作業系統,是面對所有的使用者的,並不是一個行業專用的系統,這就是要求這個系統在頻繁的更新中,必須使得已經存在啟動並執行大規模的系統能夠被新的版本相容。要做到這一點主要就是要做好API的相容問題,老的介面被廢棄了,但是在新的系統版本上必須還能使用;新的介面老版本上沒有,但是提供了極好的特性,開發人員想在老的系統平台上使用;這些問題都是android發展中的問題,那麼這些問題怎麼解決呢?Google引入了Support Library這個玩意兒。本文就本人的開發經驗來聊一聊Support Library,旨在向新手介紹一下這個東西。本文寫作的時候,借鑒了google官方關於Support Library的介紹,並且加入了一些自己的理解,若有偏差,在所難免,希望大家即使指正。
Google Support Library的介紹地址:
https://developer.android.com/topic/libraries/support-library/index.html
中文版的(熱心網友翻譯):
http://blog.csdn.net/crazybigfish/article/details/18363351
另外,如果你下載了android的sdk之後Support Library的jar和源碼存放的路徑是:
<YOUR SDK DIR>/extras/android/support/
內容大概像這樣:
概述
Android Support Library提供了很多沒有編譯進framework的特性,這些庫提供了很多向後相容的新特性,提供了在framework中沒有的很有用的UI元素,還提供了很多app可以使用的工具。在很多情況下,一些特性對有很多app的開發人員而言是很有價值的,但是這些特性如果包含在framework中就不是很合適。比如說,某個app可能需要一個針對某個特定的使用情境下的特性,並不是一個通用的情境特性,這個時候如果把它放到framework中去的話,就會使得framework變得越來越臃腫,並且可能導致API混亂,這些對於一個作業系統來說都是致命的。
但是這些需求,android不能不管不問,所以android提供了一系列的支援包來支援這些需求,這些支援包的呈現形式是一個jar包,app開發人員只要把這個jar包添加到app工程中去就可以使用其中的特性和API了。Support Library提供了以下基本特性:
1. 版本向後相容:保證新版的特性在老版本上依然可以運行
2. 實現了android配置模式的UI元素
3. 支援不同形式的元素
4. 多種多樣的工具方法函數
Android Support Library提供了這麼多的特性,所以google建議所有的app開發人員應該使用Support Library進行開發。下面我們逐個梳理下這些特性:
向後相容
Support Library允許app在老舊的android版本上使用新的android版本上才能使用的特性。舉個例子來說,假如你開發了一個app,這個app使用了android 5.0的材料設計,整個app的介面風格都是材料設計的風格,看起來很漂亮!這個app在5.0,6.0上運行一點問題都沒有,但是一旦到4.4之前的系統上啟動並執行話,所有的材料設計風格全部沒有了,而且看來很醜。。。。。怎麼辦?根本的原因就是4.4之前的版本就不支援材料設計這個玩意兒!!!但是Support Library的appcompat library就可以解決,只要你的app包含了這個庫,並且聲明使用他裡面的材料設計主題就可以在很老的android版本上使用材料設計了!是不是很簡單,是的!之所以簡單的原因是google把複雜的事情替你做完了,你只要使用就可以了。這樣一來,你的app就可以在很多的android版本中保持使用者體驗的一致性了!
在某些情況下,Support Library的行為還是會受制於具體android平台的,因為它最終還是需要使用系統的介面的。這些情況下,如果一個app調用了Support Library的一個方法,那麼這個方法的行為就會取決於app啟動並執行平台版本。如果framework提供了此方法必要的方法,那麼Support Library就會調用這個方法來完成工作;如果app是運行在老舊的版本上的話,並且framework沒有提供必要的介面的話,那麼Support Library就會嘗試調用自己內部的介面來完成這個工作或者最糟糕的就是壓根調用就沒有反應。但是絕對不會導致app崩潰或者出現很奇怪的BUG!這個時候Support Library表現的出來的行為就是不可預期的,保證最差的結果就是沒有結果,絕對不會給出一個錯誤的結果。同時app不應該自己去判斷系統平台的版本,這個工作應該由Support Library自己來完成,凡是類名以Compat結尾的都會自動做這樣的判斷,比如ActivityCompat這個類。這部分介面在使用的時候,需要仔細查看相關的api文檔說明。
另外,比較重要的就是,Support Library也會提供一些完整的,完全獨立的介面類,這些類和系統平台的framework沒有任何關係,在任何平台上的表現都是一樣的。這部分的介面可以放心地使用!
再次說明一下,在以上兩種情況下app都不應該主動去檢查系統平台的版本,這部分的工作應該由Support Library內部完成的。
支援通用配置模式
Support Library提供了不被android framework影響的UI元素,舉個例子來說,android Support Library提供了一個額外的布局類:DrawerLayout。這些類的設計遵循了android系統設計的基本實踐原則,比如Design Library遵循了android 5.0的材料設計全部原則,這樣的話這個庫在很多android版本上的運行表現都是一樣的。
如果你使用support library的話,你就可以避免陷入重複造車輪的困境。如果你的app有一個特定的UI需求,你就可以使用這些現成的代碼,這些庫提供了使用者一直熟悉的介面風格和設計,這對於保證app的使用者體驗一致性是非常重要的。這些類還可以協助你構建出一個看起來很像android生態環境中的一部分的app,因為這些庫的設計是完全android的設計哲學的!舉一個例子,許多的app都需要展示一個任意長度的列表,並且需要當資訊發生變化的時候,這個列表中的資訊能夠快速,流暢地展示出來;這個列表中的元素可能是郵件,連絡人,音樂專輯等等。這些app可以使用support library中的RecyclerView來顯示列表。這種做法可以使得開發人員不用從0開始構建自己需要的類,並且能夠很好保證使用者在我們的app中的體驗和系統平台的體驗是一致的!這些都是HMI設計中重要的原則!
提供不同類型的要素
Android SDK提供了很多要素的類庫,比如TV和穿戴式裝置,一個app可以依賴一個合適的support library去提供多平台統一的功能,並且可以提供存在於外部顯示器,擴音器和其他地方的裝置的內容。
通用的工具
Android support library還提供了很多向後相容的多平台,多版本的工具類方法。app可以使用這些工具類來提供一個在多個多個android系統版本之間的一致的使用者體驗。比如說,support library提供的許可權方法,這個方法的運行會依賴於具體的系統版本,假如運行在支援動態運行時許可權檢查模型的版本(6.0+)的話,那麼這個方法會在運行是彈出相應的對話想使用者請求需要的許可權;如果是運行在不支援動態許可權的版本上時,這個方法會在app安裝時候保證所需要的許可權被授予。
提供的特性
Android Support Library包包含了一系列可以包含在你的app中的庫,這些庫中的每一個庫都提供了特定的android版本範圍支援和特性集合。
接下來我們分別講述這些庫的特性,以協助你決定使用哪些支援庫。通常來講google建議開發人員需要包含v4 support 和 v7 appcompat這兩個庫,因為這兩個庫提供了很大範圍的android版本支援和符合android UI設計模式的API。
v4 Support Library
這個庫之所以叫V4支援庫的原因就是它是運行再android 1.6(API 4)版本之上的,和其他的庫相比它提供了極豐富的API,包括對於app組件的支援,使用者介面特性,裝置無障礙使用,資料處理,網路連結和編程工具等。這裡我們簡單說明一下這個庫中包含的類:
app組件
- Fragment提供了靈活的介面設計,尤其是針對介面變化頻繁或者螢幕較大(如平板裝置)的情況下的UI設計。需要注意的是,如果你使用了V4包中的Fragment的話,那麼就算你的app運行在android 3.0之上的系統,你的app依然使用的是V4包中的Fragment類,而不是系統framework中的Fragment。
- NotificationCompat 添加針對富資訊內容的通知特性,android中的notification分為普通通知和富文本通知,普通通知大概像這個樣子:
富文本通知如:
關於notification介紹請看:
https://developer.android.com/guide/topics/ui/notifiers/notifications.html
- LocalBroadcastManager這是一個很有用的類,這個類可以使得我們的app可以在內部進行廣播而不用通過sendBroadcast發送一個全域廣播,尤其是在安全性要求比較高的情況下。
使用者介面
- ViewPager 添加一個ViewGroup來管理子view的布局,使得使用者可以靈活地使用手指的滑動切換畫面
- PagerTitleStrip 這是一個非互動性的,可以用來ViewPager中顯示當前的,下一個和前一個page的指標,一般只是用來顯示,通常作為一個子view存在於ViewPager中。
- PagerTabStrip 這是一個導航組件,可以再ViewPager的page之間進行導航
- DrawerLayout 添加可以建立下拉的Navigation Drawer
- SlidingPaneLayout 添加建立針對不同大小的螢幕自適應的顯示概要和詳細資料的視圖。
裝置無障礙使用
這部分針對特殊人士設計,比如聾啞等人士。
1. ExploreByTouchHelper
2. AccessibilityEventCompat
3. AccessibilityNodeInfoCompat
4. AccessibilityNodeProviderCompat
5. AccessibilityDelegateCompat
內容處理
- Loader 這一個載入器類,這個類主要添加針對非同步載入資料的支援,同時V4包也添加了這個類的具體實作類別,包括CursorLoader 和 AsyncTaskLoader
- FileProvider 這個類添加了針對在不同應用之間共用檔案的支援
在V4包中還有很多有用的類,這裡列出的只是日常開發中比較常用的幾個,詳細的API類介紹請看:
https://developer.android.com/reference/android/support/v4/app/package-summary.html
在app工程中使用這個庫也是很容易的,你可以下載這個庫的jar包然後添加到app project中去,也可以在你的gradle設定檔中添加這個庫的依賴,這樣gradle會自動下載這個庫,並且配置上:
com.android.support:support-v4:23.3.0
Multidex Support Library
這是一個針對Dalvik虛擬機器的支援庫,當一個app使用了超過65535個方法的時候就需要使用multidex配置,這個庫就是添加這個配置支援的。關於multidex的更多訊息,請查看:
https://developer.android.com/studio/build/multidex.html
不過目前的主要app都不會使用這麼多的方法,因此這個庫使用比較少。
v7 Support Libraries
這個庫是運行再android 2.1(API 7)之上版本的系統上,這個庫包含了一系列的子庫,這些子庫可以互相獨立地存在和應用在app中。
v7 appcompat library
這是V7庫的app相容庫,這個庫添加了對Action Bar UI設計模式的支援,添加了針對材料設計的UI設計實現支援。如果你的app想要在android 5.0之下的版本中運行並且想要材料設計的介面風格,就必須包含這個庫。需要注意的是,這個庫會依賴V4的庫。
這裡我們列出幾個V7庫中的關鍵類:
1. ActionBar 這個是ActionBar實現的類,ActionBar是app開發中比較常用的介面元素,它大概長成這個樣子:
圖中的第2部分就是ActionBar用於點擊下拉選擇執行的操作。更多關於ActionBar的資訊請查看:
https://developer.android.com/design/patterns/actionbar.html
2. AppCompatActivity 這是為了在低版本(API 7+)上實現ActionBar的一個activity,也就是說如果你的app想要在API 7以上的android版本中實現ActionBar你必須使你的Activity類整合自AppCompatActivity這個類,而不是Activity類。
3. AppCompatDialog 提供基於AppCompat主題的dialog實現
4. ShareActionProvider 添加共用資訊行為的action bar支援,共用action bar像下面這樣:
使用者可以選擇共用資料的形式,代碼上也很簡單,只要在你的menu的xml檔案中加上app:actionProviderClass就行:
<item android:id="@+id/action_share" android:title="@string/share" app:showAsAction="ifRoom" app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
在gradle中使用V7 appcompat支援包也很容易:
com.android.support:appcompat-v7:23.3.0
v7 cardview library
這個庫主要添加了CardView的支援,CardView是一個繼承自FrameLayout的widget,主要用於實現材料設計風格的帶有圓角和陰影製作效果的卡片式UI效果,如:
更多的CardView資訊請看:
https://developer.android.com/training/material/lists-cards.html#CardView
在gradle中添加該庫:
com.android.support:cardview-v7:23.3.0
V7 gridlayout library
該庫添加了grid布局的支援,grid布局是一個網格式的布局,方面在一個螢幕上顯示多個格局相似的資訊,網格布局大致如下:
另外我們home傳統型程式launcher的布局也是一個網格布局,用於顯示所有app的icon和名稱。
在gradle中添加該庫:
com.android.support:gridlayout-v7:23.3.0
v7 mediarouter library
這個庫是一個多媒體路由的庫,主要提供了MediaRouter, MediaRouteProvider等類,還有就是支援Google Cast的類,Google Cast是google在2013年7月25日發布的全新的連結裝置,主要運行簡化版本的chrome作業系統,可以插在電視機的HDMI介面上。關於Google Cast的詳細資料,請查看google cast官方網站:
https://developers.google.com/cast/
這個庫中的類主要就是提供將本地媒體流路由到一個外部的螢幕,音頻播放器和其他的目標裝置,該庫中提供了發布特定app的媒體路由提供器,以便尋找和選擇合適的目標裝置。關於本庫更加詳細的資訊請查看api手冊:
https://developer.android.com/reference/android/support/v7/media/package-summary.html
在gradle中添加該庫:
com.android.support:mediarouter-v7:23.3.0
v7 palette library
該庫主要提供了調色盤的功能,這個庫可以用來從一個圖片中抽取某個顏色。舉個例子,一個音樂app可能會從當前播放的音樂的的封面圖片中抽取出圖片的佈景主題色彩,然後使用這個顏色裝飾一下當前介面的佈景主題色彩,這樣就使得介面更加柔和,給使用者更多的代入感。這個庫中的一個主要的類就是 Palette 類,這個類的api:
https://developer.android.com/reference/android/support/v7/graphics/Palette.html
在gradle中使用這個庫:
com.android.support:palette-v7:23.3.0
v7 recyclerview library
該庫主要是提供RecyclerView這個控制項,用來再一個有限的視窗中高效靈活地展示資料項目,關於RecyclerView 的使用大家可以參考這個部落格:
http://blog.csdn.net/lmj623565791/article/details/45059587
在gradle中使用該庫:
com.android.support:recyclerview-v7:23.3.0
v7 Preference Support Library
這個庫主要就是添加了preference的支援,包括CheckBoxPreference 和 ListPreference等類。
在gradle中使用這個庫:
com.android.support:preference-v7:23.3.0
v8 Support Library
這是V8版本的支援庫,主要運行在android 2.2(API 8)以上的版本中。
v8 renderscript library
這個子庫提供了renderscript的支援,renderscript是一個android平台上的類C指令碼語言,主要實現圖形的渲染功能。關於renderscript請查看google的說明:
https://developer.android.com/guide/topics/renderscript/compute.html
還可以查看這個部落格:
http://www.cnblogs.com/TerryBlog/archive/2012/03/02/2377251.html
在gradle中使用該庫:
defaultConfig { renderscriptTargetApi 18 renderscriptSupportModeEnabled true}
v13 Support Library
這是V13版本的支援庫,這個庫的運行目標是android3.2(API 13)以上的版本,主要是添加了Fragment使用者介面模式的支援。更多資訊查看android文檔:
https://developer.android.com/reference/android/support/v13/app/package-summary.html
在gradle中使用該庫:
com.android.support:support-v13:23.3.0
v14 Preference Support Library
添加了更加豐富的Preference的支援,api文檔:
https://developer.android.com/reference/android/support/v14/preference/package-summary.html
在gradle中使用該庫:
com.android.support:preference-leanback-v17:23.3.0
v17 Leanback Library
添加在TV大螢幕裝置上的API類,包含了很多在TV上使用的控制項。
在gadle中使用該庫:
com.android.support:leanback-v17:23.3.0
Annotations Support Library
添加JAVA註解支援,以便更加有效地實施軟體設計。關於JAVA註解請看這個部落格:
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
android的註解支援庫使用可以看看android工具組的文檔,簡單明了:
http://tools.android.com/tech-docs/support-annotations
在gradle中使用該庫:
com.android.support:support-annotations:23.3.0
Design Support Library
這個庫主要添加了材料設計的支援,包含了很多材料設計的組件和模式。關於這個庫的使用可以看下這篇老外寫的部落格,寫的很清楚:
https://www.sitepoint.com/material-design-android-design-support-library/
當然,如果大家對E文表是無力的話,也可以看看國人寫的部落格:
http://blog.csdn.net/eclipsexys/article/details/46349721
個人建議先看看那個老外的文章,然後在看國人的文章,結合來看最好。
Custom Tabs Support Library
這個庫使得app開發人員可以方便地添加和管理app中的自訂tab,關於custom tabs的介紹請看chrome官網的介紹:
https://developer.chrome.com/multidevice/android/customtabs
在開發中支援庫的設定
這個直接參考google的文檔,有圖有真相,很清楚:
https://developer.android.com/topic/libraries/support-library/setup.html
支援庫的版本迭代曆史
支援庫隨著android一起在成長,也在不停地進步發展,如果你對支援庫的版本迭代曆史感興趣的話可以查看:
https://developer.android.com/topic/libraries/support-library/revisions.html
Android Support Library介紹