在前不久的Google I/O 2017大会上,谷歌为我们带来了Android O版本,相比于上一个版本Android N版本,O又多了很多新的特性,比如画中画、通知栏修改、自适应图标等。不过,作为开发者们,似乎更关心这些新特性更细节的部分,比如在代码上该如何支持、Api有哪些新的变化等等。本次我们先概要的谈谈这些新特性,今后的章节中我们将一个个深入探讨这些新的功能。
1. 画中画(Picture in Picture)
从Android O开始,画中画将支持手机端系统,如下图中在主界面上的正在播放视频的NetFlix小窗。
在开发中,若想要让App支持画中画,首先你需要在AndroidManifest.xml文件中声明android:supportPictureInPicture="true"
,并且在Android O中你不再需要声明android:resizeableActivity="true"
。
<activity android:name=".MyappActivity"
/* android:resizeableActivity="true" 这一行不再需要*/
android:supportPictureInPicture="true"
android:configChanges="..."
/>
然后,在你的代码中,可以通过如下形式的代码进入画中画模式:
public void onActionClicked(Action action) {
if (action.getId() == R.id.start_myapp) {
getActivity().enterPictureInPictureMode();
}
}
2. 媒体文件(Media)
安卓在media包中已经内置很多有用的类,如MediaPlayer,MediaRecorder,MediaCodec,MediaExtractor等,Android O中为每个这些类添加了一个getMetrics()
方法,它能帮你获取你当前处理的媒体对象的具体信息,如分辨率、编码、比特率、持续时长等。如以下代码片段所示,在PersistableBundle
对象中可以获得详细信息。
MediaRecorder recorder = new MediaRecorder();
// ...
PersistableBundle metrics = recorder.getMetrics();
此外,媒体的回放功能上,增强了缓存控制功能,你可以指定一个高位标志(high watermark)和一个低位标志(low watermark),标志位既可以通过时间也可以通过大小来指定,媒体只有当到达低位标志时才会开始回放,并且系统会尽量缓存在高、低位标志之间的媒体数据。
对媒体对象的定位(seek)功能也得到了加强,你现在可以定位到最近的frame、下一个keyframe、上一个keyframe或者最近的sync frame。
3. Web视图(WebView)
WebView新增了一些非常有用的API,可以使用和chrome浏览器类似的API来实现对恶意网站的检测来保护web浏览的安全性,为此需要在manifest中添加如下meta-data标签:
<manifest>
<meta-data
android:name="android.webkit.WebView.EnableSafeBrowing"
android:value="true" />
<!-- ... -->
</manifest>
WebView还增加了关于多进程的API,可以使用多进程来增强安全性和健壮性,如果render进程崩溃了,你还可以使用Termination Handler API来检测到崩溃并做出相应处理。
4. 自动填充(Autofill)
Android O增加了自动填充的功能,当有需要填充的表单时,系统会列出之前已经填充过的表单。开发时你可以实现一个Service来提供cache以及提供cache数据,标准视图组件(如TextView)自己知道如何和Service交互来获取缓存的表单,如果是自定义视图,也有对应的API来提供其和缓存表单的交互。
5. 字体
Android O中让使用自定义字体的方式变得更加简单高效,在res目录下直接增加了一个新的font
目录,其中就可以存放第三方字体文件,也可以用xml的形式声明font family,使用时直接通过R.font.myfont
就可以引用,如下图所示:
6. 自适应TextView(Auto-Sizing TextView)
Auto-Sizing TextView能够根据TextView的特性和边界自动缩放和重新布局其中的文本,这使得在不同像素密度的屏幕上对TextView的现实得到了优化。
同样,要使用这个特性也非常简单,在最新的support libraries中就包含了这些特性,只需要在布局xml中声明TextView的相应属性即可,如以下代码片段:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="12sp"
android:autoSizeMaxTextSize="100sp"
android:autoSizeStepGranularity="2sp"
/>
7. findViewById()
在编写android代码时,最常用的一行代码应该就是findViewById(int id)
,然而这个方法的返回值是View
类型,你必须对其进行强制转换以得到自己想要的类型。但是现在,在Android O中,你可以省略掉强制转换的步骤了,开发者将其称为Castaway
,虽然这个改动是个很小的变化,但是确实能让你少敲很多无聊冗余的代码。
8. 自适应图标(Adaptive Icons)
新特性Adaptive Icons让你能够在不同的设备上显示不同形状的启动图标,例如在一种设备上显示圆角矩形图标,而在另一种设备上使用圆形图标,其原理是不同的设备OEM提供不同的遮罩(mask),系统就使用这样的mask来截取出不一样的图标。
9. 通知渠道(Notification Channels)
Android O 引入了通知渠道,以提供统一的系统来帮助用户管理通知,用户可以对同一个应用的不同类型(或者说不同优先级)的通知采取不同的措施。
Android O 弃用了为单个通知设置优先级的功能。现在,创建通知渠道时您可以设置建议重要性级别。您为通知渠道指定的重要性级别适用于您发布至该渠道的所有通知消息。您可以为渠道配置五个重要性级别中的一个,这些级别配置的是渠道可以打断用户的程度,范围是 IMPORTANCE_NONE(0)
至IMPORTANCE_HIGH(4)
。默认重要性级别为 3:在所有位置显示,发出提示音,但不对用户进行视觉干扰。创建通知渠道后,只有系统可以修改其重要性。
10. Java语言
Android O中为新增了一些Java语言的包:
- java.time
让操作时间、日期、时长等对象变得更加容易,让操作路径和文件更容易 - java.nio.file
对旧的java.io
API做出了新的改进 - java.lang.invoke
如下代码展示了新的file API如何操作文件:
Path path = Paths.get("...");
String uncommented = Files.lines(path)
.map(l -> l.trim())
.filter(l -> l.length() == 0 || l.charAt(0) != '#')
.collect(Collections.joining("\n"));
后记
Android O还有许多有用的新特性这里没有列出来,如生命周期等,而且上文中讲的也只是粗浅的介绍性质的,今后我会更具体介绍一些重要的新特性。
关于更多Android O的内容,可以参考官方开发者文档 https://developer.android.com/preview/index.html 。