【Android】完善Android学习(三:API 3.0)
备注:之前Android入门学习的书籍使用的是杨丰盛的《Android应用开发揭秘》,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增加了很多的新组件,一直没有系统的学习过。现在开始这个“完善Android学习”系列,将2.2以后的新知识做一个概览。概览来自:http://developer.android.com/about/versions/android-3.0.html
前面的Android2.0称为Gingerbread(姜饼),进入3.0则称为Honeycomb(蜂巢),这一版相对于2.0版做了不少改进。详述如下。
一、Fragments
这个是3.0中新加入的框架组件,允许你将一些界面元素组织成一个独立的、具有自己声明周期的模块。创建Fragment的时候,需要继承Fragment类,实现一些有关生命周期的回调方法,这和Activity是很类似的。最重要的是,你可以将多个Fragment组合在一起显示在一个Activity中,这样你就可以在一个界面上显示多个面板,每个面板都有自己的生命周期并且可以独立处理输入事件。
你也可以创建一个没有UI的Fragment,让它为Activity工作,比如,可以负责一个只有当Activity运行的时候才进行的下载工作。
另外:
1)Fragment是独立的,可以在多个不同的Activity中进行复用;
2)你可以在Activity中对Fragment进行添加,移除,替换或者施加动画;
3)你可以将Fragment添加到一个由Activity管理的栈中,并且保存Fragment的的改变状态,允许用户回退;
4)通过提供可选的布局,开发者可以根据屏幕尺寸和方向混合使用各种Fragment;
5)Fragments可以直接访问它们的容器Activity,并且可以添加items到Activity的Action Bar;
开发者必须使用FragmentManager来管理fragment,该类提供了一些和Fragment交互的API,比如寻找Activity中的fragment,将Fragments从栈中弹出来并恢复之前的状态;
为了执行一个事务,比如添加或者移除一个fragment,开发者必须使用FragmentTransaction,然后调用方法add(),remove(),replace()等,一旦你确定了事务要做出的所有变化,你就可以使用commit()提交变化,系统就会将fragment事务提交给activity。
二、Action Bar
Action Bar是位于Activity窗口顶部的传统的title bar的替代物。它在左边的角落上包含了应用的logo,并且在Options Menu中提供了新的接口Item,另外,Action Bar还允许:
1)直接在Action Bar中添加menu Item,称作“action items”;
2)用一个widget(比如搜索框)替换action item——创建一个“action view”;
3)为应用logo添加动作,用一个定制的logo替换它;
4)定制Action Bar的主题和背景;
5)通过fragments添加tabs和drop-down list以便于导航;
6)Add breadcrumbs to navigate backward through the back stack of fragments
Action Bar对于所有的应用来说,使用holographic theme是标准的。
三、System clipboard
应用可以使用系统范围内的剪贴板进行数据的复制黏贴。剪切的数据可以是文本,uri或者是一个Intent(?)。
通过提供对你想让用户复制的东西的系统级访问权限,你用户可以从你的应用中复制复杂的内容并粘贴到其他的应用中去。
为了使用剪贴板,你必须调用getSystemService(CLIPBOARD_SERVICE)获得一个ClipboardManager对象。
为了复制一个item到剪切板,我们需要创建一个ClipData对象,对象保持着一个或者多个ClipData.Item对象,每一个描述一个单独的实体。创建维护一个实体的ClipData,你可以使用辅助方法:newPlainnText(),newUri()和newIntent().然后你可以将用ClipboardManager的setPrimaryClip()方法将ClipData添加到剪切板,你也可以使用方法getPrimaryClip()获取剪切板数据。处理接收到的ClipData是很复杂的,因此你在尝试粘贴之前必须了解其包含的数据类型。
剪贴板一次只维护一个ClipData对象,但是一个ClipData可以同时包含多个ClipData.Items。
四、App widget
Android3.0提供了几种新的wiget,使得用户Home界面上的app widgets交互性更好,包括:GridView,ListView,StackView,ViewFlipper和AdapterViewFlipper。
更重要的是,你可以用新添加的RemoteViewService来使用collection创建应用诸如GridView,ListView和StackView等被诸如content provider等remote data支持的widget。
AppWidgetProviderInfo类(使用<appwidget-provider>元素在XM文件中定义)也支持两个行的属性:autouAdavnceViewId和previewImage。前者让你定义app widegt的应当被wedget宿主自动优化的子视图的ID,后者则定义了widget的样子以及如何在widget picker中被展示,如果没有提供,看到的就是应用图标。
为了帮助创建app widget的预览视图,Android模拟器包含了一个应用叫做”Widget Preview“,只需要打开这个应用,选择你的app widget,然后定义你的预览图片是什么样子的,然后保存它,将它放置到你的应用图片资源文件中去;
五、Status bar notifications
Notification API已经被扩展可以容纳更加丰富的内容,新的Noification.Builder类可以让你更容易的常见Notification对象。新的特性包括:
1)支持设置大icon。这经常被社交应用用来显示联系人的头像;
2)在状态栏ticker中支持自定义的布局;
3)支持自定义的通知布局,可以用PendingInent添加按钮,从而创建更有交互性的widget;
六、Content loaders
新的框架API提供了Loader类让异步加载数据更加方便,你可以将它和UI组件联合起来使用,动态的从worker县城加载数据。子类CursorLoader被特别射界用来帮助开发者从ContentProvider获得数据支持。
你所要做的就是实现LoaderCallbacks接口来供当一个新的loader发生或者数据变化的时候调用,然后调用initLoader()方法为你的activity和fragment初始化loader。
七、Animation framework
一个全新的动画框架允许你在任何对象上施加想要的动画,它允许你定义动画的如下属性:
1)时长;2)重复次数和行为;3)时间加速器的类型;4)动画集合和执行的方式(一起执行,顺序执行,或者一定的延迟执行)5)帧更新延迟;
你可以定义动画的这些方面以及别的方面。
有两种animators可供使用来animate属性的值:ValueAniamtor和ObjectAniamtor。ValueAnimator计算动画的值,它只是计算,你必须监听更新,用自己的逻辑处理数据。ObjectAniamtor是ValueAnimator的一个子类,允许你设置动画的对象和属性,它承担所有的动画工作:你指定动画的对象,动画期间要改变的属性,以及一系列要赋给属性的值,然后开始动画。
另外,LayoutTransition类允许你对你的activity布局进行自动的转变动画。为了让你的布局部分的进行转变,可以创建一个LayoutTransition对象然后设置到一个ViewGroup上面。任何时候元素从group中添加或者溢出都会触发动画,可以调用LayoutTransition的方法setAnimator()来设置一个Animator,例如前面提到的ValurAnimator和ObejctAnimator。
八、Extended UI framework
1)KistView和GridView可以通过setChoiceMode设置选择模式(单选或者多选);
2)新的改变视图的API,允许你在layout上轻松添加2D/3D转变动画,和上面的动画框架一起使用,可以轻松对一个View施加绚丽的效果。
3)新的hologrphics主题;
4)新的widget组件:
AdapterViewAnimator:AdapterView的基类;
AdapterViewFlipper:简单在两个或者多个子视图之间的ViewAnimator被添加进去,一次只能显示一个child,如果有必要,可以确定一个间隔,让它自动切换;
CalendarView:可以让用户在其上选择一个特定的时间,你可以配置可选的时间区间;
ListPopWindow:将自己锚定在一个宿主View上,展示一系列可选色Item;
NumberPicker:允许用户从预定义的范围内选择一个数字,该组件提供了一个输入区域和上下调整按钮,它也允许你映射到相应的字符串;
PopMenu:可以弹出一个Menu锚定到特定的视图,如果有空间popup会显示在特定的视图下面,没有就显示在上面,如果有键盘,不会覆盖键盘除非用户触摸它
SearchView:提供一个你可以配置的搜索框,将搜索传递给特定的activity,展示搜索结果,这个组件在action bar中特别有用;
StackView:一个以3D堆的方式展示子视图的组件,允许用户像名片盒那样在子视图之间切换;
九、Graphics
1)硬件加速2D绘画:你可以在应用中通过设置android:hardwareAccelerated="true"使用OpenGL渲染,这可以帮助应用让它们绘画的更加快速,同样也使得动画、滚动更顺滑,以及交互上的性能和响应的总体提升;
2)View Support for hardware and software layers:缺省来说,View是没有明确的层的,你可以制定一个View被硬件和软件层支持。硬件层支持是通过硬件的渲染管道实现的,但是只有当硬件加速被启用的时候才会有用,当硬件加速关闭的时候,硬件层就和软件层支持一样;软件层是通过bitmap支持的,即使硬件加速开启,这种情况下View的渲染还是通过Android的软件渲染管道进行,如果View tree经常更新,就应当避免使用软件层,因为每一次更新都会要求重新渲染软件层,这会比较慢;
3)Renderscript 3D渲染引擎:Renderscript是一个运行时3D框架,提供建立3D常见的API和特殊的最大化性能的、平台独立的着色语言。使用Renderscript,你可以家族图形操作和数据处理,Renderscript是为应用,壁纸等创建高性能3D效果的理想方法;
十、Media
1)Time laspe video:摄像机现在支持录制time lapse video(延时摄影),方法setCaptureRate()设置画面捕捉的速率;
2)图片流的纹理支持:新的SurfaceTexture允许捕捉图片流,通过调用Camera实例的setPreviewTextture()方法,可以告诉Camera可以在哪一个SurfaceTexture上面回执捕捉的帧;
3)Http Live streaming:应用现在可以传递一个M3U播放列表URL给多媒体框架来开始HTTP Live streaming会话(进行在线播放),多媒体框架支持大多数的HTTP Live streaming规格,包括各种码率;
4)EXIF data:ExifInterface增加新的照片属性:孔径,ISO(感光度)以及曝光时间;
5)便携式摄像机配置文件:新的hasProfile()方法检测设备是否支持该配置,以及几个video质量配置文件(比如QUALITY_1080P,QUALITY_720P等)来决定摄像质量;
6)数字媒体文件传输:这个平台提供了内建的基于USB的MTP/PTP。让用户可以方便的在设备和主机电脑之间传输任何行书的多媒体文件。开发者可以在此基础上建立应用让用户创建或者管理想要在设备之间传输的富媒体文件;
十一、Split touch events
之前,只有一个view可以一次接收一个touch时间,Andrid3.0则支持split touch events,因此不同的views可以接收同时发生的touch事件。对于Android3.0来说,这是默认开启的,然而下面的属性可以让你关闭window或者某个view Group的该功能。
下面的例子是关闭一个layout和其子视图之间的:
1 <LinearLayout android:splitMotionEvents="false" ... > 2 ... 3 </LinearLayout>
这样设置之后,Linearlayout中一次就只有一个视图可以接收touch事件了。
下面则可以通过将属性设置到activity或者整个app中在windows中禁止split touch events:
1 <style name="NoSplitMotionEvents" parent="android:Theme.Holo"> 2 <item name="android:windowEnableSplitTouch">false</item> 3 ... 4 </style>
当这个主题被应用到<activity>或者<application>上的时候,只有发生在当前activity窗口中的时间才会被接收。
举个例子:通过在windows层禁止split touch events,系统栏就不能和activity同事接受触摸事件,缺省来说这不影响activity中的视图是否可以split touch events。
十二、WebKit
1)提供新的WebViewFragment类来创建由WebView组成的frament;
2)新的WebSettings方法:
setDisplayZoomControls():允许用户可以使用手势进行放缩,隐藏屏幕上的放缩控制按钮;
setE那边了SmoothTransaction():允许在放缩的时候提供顺滑的过度,当开启的时候,WebView就会选择一个方案最大化性能;
3)新的WebView方法:
onPause()回调方法:当WebView不可见的时候暂停所有相关的处理,这在WebView不在前台的时候用来减少不必要的CPU和网络流量消耗非常有用;
onResume()回调方法:继续执行之前暂停的操作;
saveWebArchive():允许你将当前的视图保存为设备上的一个web压缩包;
showFindDialog():在当前页面上初始化一个文本搜索;
十三、Browser
浏览器应用增添了下列新的特征来支持web应用:
1)Media Capture
如同在HTML Media Capture 详细说明中定义的一样,浏览器允许web应用访问设备的音频、视频和图片捕获功能,举个例子,下面的HTML提供了一个输入供用户拍摄照片上传:
1 <input type="file" accept="image/*;capture=camera" />
或者可以移除参数capture=camera来让用户选择是从打开摄像头拍着照片还是让用户从设备上选择一张;
2)Device Orientation
如同在Device Orientation Event详细说明中定义的一样,浏览器允许web应用监听提供设备方向和移动信息的DOM事件。设备的方向有x,y和z轴使用度数定义,移动则由加速和旋转速率数据表达,一个web页面可以通过调用window.addEventListener方法设置"deviceorientation"属性注册监听方向事件,设置"devicemotion"属性监听移动事件;
3)CSS 3D变换
如同在CSS 3D Transform Module中定义的一样,浏览器允许CSS渲染的元素进行3D变幻;
十四、JSON utilities
新添加JsonReader和JsonWriter类,帮助开发者读写JSON流,新的API补足了在内存中操作文档的org.json类。
你可以通过调用构造方法创建一个JsonReader的实例,然后传递一个InputStreamReader实例进去,然后通过调用beginObject来读取对象,通过nectName()读取Key,调用和数据类型一致的方法来读取数据,比如nextString()和nextInt(),一直继续直到hasNext()不为true;
开啊放着同样调用构造方法创建一个JsonWriter,传递一个合适的OutputStreamWriter进去,然后写入数据,使用name()来添加一个属性名字,使用value()方法添加相应的值。
这些类缺省状态下都是非常杨哥的,每个类中的方法setLenient()都使得它们可以接收更加自由的参数。
十五、New featrue constants
<uses-feature>manifest文件元素可以被用来告诉外界实体(比如GooglePlay)你的应用依赖于哪些硬件和软件特性,在这一版本中,Android添加下列新的应用可以用来生命的约束:
"android.hardware.faketouch":这个属性表明应用和支持模拟触摸屏幕(比如鼠标点击,远程控制等等)的设备兼容。任何一个包含触摸屏幕的的设备都支持"android。hardware.faketouch",因为触摸屏能力是模拟触摸屏的一个超集。所以,除非你确实需要一个触摸屏,否则你应该加上faketouch<uses-featrue>。
十六、New permissions
“android.permission.BIND_REMOTEVIEWS”
这是在实现ReomoteViewsService的时候必须在<service>中声明的属性。举例来说,当使用RemoteViewsService来创建一个App Widget,它的manifest文件看上去或许就是下面这样:
1 <service android:name=".widget.WidgetService" 2 android:exported="false" 3 android:permission="android.permission.BIND_REMOTEVIEWS" />