标签:
我们知道,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支持库的原因就是它是运行再android 1.6(API 4)版本之上的,和其他的库相比它提供了极丰富的API,包括对于app组件的支持,用户界面特性,设备无障碍使用,数据处理,网络链接和编程工具等。这里我们简单说明一下这个库中包含的类:
这部分针对特殊人士设计,比如聋哑等人士。
1. ExploreByTouchHelper
2. AccessibilityEventCompat
3. AccessibilityNodeInfoCompat
4. AccessibilityNodeProviderCompat
5. AccessibilityDelegateCompat
com.android.support:support-v4:23.3.0
这是一个针对Dalvik虚拟机的支持库,当一个app使用了超过65535个方法的时候就需要使用multidex配置,这个库就是添加这个配置支持的。关于multidex的更多消息,请查看:
https://developer.android.com/studio/build/multidex.html
不过目前的主要app都不会使用这么多的方法,因此这个库使用比较少。
这个库是运行再android 2.1(API 7)之上版本的系统上,这个库包含了一系列的子库,这些子库可以互相独立地存在和应用在app中。
这是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
这个库主要添加了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
该库添加了grid布局的支持,grid布局是一个网格式的布局,方面在一个屏幕上显示多个格局相似的信息,网格布局大致如下:
另外我们home桌面程序launcher的布局也是一个网格布局,用于显示所有app的icon和名称。
在gradle中添加该库:
com.android.support:gridlayout-v7:23.3.0
这个库是一个多媒体路由的库,主要提供了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
该库主要提供了调色板的功能,这个库可以用来从一个图片中抽取某个颜色。举个例子,一个音乐app可能会从当前播放的音乐的的封面图片中抽取出图片的主题颜色,然后使用这个颜色装饰一下当前界面的主题颜色,这样就使得界面更加柔和,给用户更多的代入感。这个库中的一个主要的类就是 Palette 类,这个类的api:
https://developer.android.com/reference/android/support/v7/graphics/Palette.html
在gradle中使用这个库:
com.android.support:palette-v7:23.3.0
该库主要是提供RecyclerView这个控件,用来再一个有限的窗口中高效灵活地展示数据项,关于RecyclerView 的使用大家可以参考这个博客:
http://blog.csdn.net/lmj623565791/article/details/45059587
在gradle中使用该库:
com.android.support:recyclerview-v7:23.3.0
这个库主要就是添加了preference的支持,包括CheckBoxPreference 和 ListPreference等类。
在gradle中使用这个库:
com.android.support:preference-v7:23.3.0
这是V8版本的支持库,主要运行在android 2.2(API 8)以上的版本中。
这个子库提供了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版本的支持库,这个库的运行目标是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
添加了更加丰富的Preference的支持,api文档:
https://developer.android.com/reference/android/support/v14/preference/package-summary.html
在gradle中使用该库:
com.android.support:preference-leanback-v17:23.3.0
添加在TV大屏幕设备上的API类,包含了很多在TV上使用的控件。
在gadle中使用该库:
com.android.support:leanback-v17:23.3.0
添加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
这个库主要添加了材料设计的支持,包含了很多材料设计的组件和模式。关于这个库的使用可以看下这篇老外写的博客,写的很清楚:
https://www.sitepoint.com/material-design-android-design-support-library/
当然,如果大家对E文表是无力的话,也可以看看国人写的博客:
http://blog.csdn.net/eclipsexys/article/details/46349721
个人建议先看看那个老外的文章,然后在看国人的文章,结合来看最好。
这个库使得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
标签:
原文地址:http://blog.csdn.net/baniel01/article/details/51719728