2022-03-15

Android 13来了,速览新特性!

作者:好中文的样子 所属分类 - 干货 - 科技资讯

去年Android 12开发者预览版的发布似乎还在去年,昨天似乎还在用昨天的Android 12,Android 13随着Android 12L的最终预览版和正式版一起到来了!谷歌于2022年2月发布了第一个Android 13的预览版,并且将由Pixel系列机型率先得到开发者版本升级,让我们一起看看Android 13给我们带来了什么新功能和全新特性吧!

Android 13 Logo

全新的主题色自适应图标

安卓13带来了很多国产设备都支持的应用主题图标,不过这个特性被正式带到了安卓的发行版上,不再需要厂商自行适配,也就是以后可能不再需要“某族”、“某米”、“某为”的主题图标包,只需要一个安装包即可支持所有的机型,展示想要的主题图标。不过目前主题图标并不支持第三方主题,只支持自带Launcher预设的主题,不排除未来开放更多第三方主题的可能性。如果应用需要支持自定义主题色彩和图标,需要应用清单引用<adaptive-icon>来启用,如果使用了自适应图标,将会支持安卓13的所有主题自定义特性。

应用主题色

如图,应用主题图标可以设置主题色彩或者暗色主题的时候使得图标更适配主题,不过目前似乎只有谷歌自带的启动器支持这个特性,国产UI大多使用了自己定制的启动器。如果应用需要支持单色图标,还需要使用VectorDrawable图标。谷歌建议开发者将图标填充进36x36dp的空间,这个图标将会在90x90的容器当中显示,如果想让图标更大,应该在60x60dp内;由于立体LOGO不便适配这个特性,因此谷歌建议使用平面LOGO。

应用图标规范

如图,1表示90x90dp的空间,2表示36x36dp的空间,最大不应该超过60x60dp。

<adaptive-icon >
    <background android:drawable="..." />
    <foreground android:drawable="..." />
    <monochrome android:drawable="@drawable/myicon" />
</adaptive-icon>

这个是自适应图标的代码示例,开发者应该要支持自适应图标的特性,特别是monochrome android:drawable标签,然后在清单当中声明如下内容:

<application
    …
    android:icon="@mipmap/ic_launcher"
    …>
</application>

支持应用添加快速设置组件

其实这个功能和桌面小部件有点类似,不过这个功能更偏重于设置开关,应用可以将自己的设置小组件放置到状态栏下拉的控制中心区域。由于国产UI大多会针对这个地方定制,所以这个功能可能不会出现在国产UI里面,大概率只是留在AOSP原生系统当中。

控制中心小组件

全新的多语言特性支持

目前应用大多只有固定数个语言,不支持实时切换或者按照单个应用切换。例如本机语言是Deutsch,那么所有应用的语言都会按照默认配置预先适配Deutsch。如果我某个应用需要使用Français,那么必须系统设置里面也切换过去,这样别的应用会跟着变更,很不方便。安卓13带来了全新的多语言支持特性,支持按照单个应用设置语言,并且原生支持单应用语言切换,不需要应用内置这个功能,也就是应用无需额外开发一套多语言支持特性。这些功能将在Appcompat 1.6.0-alpha01当中开放,应用适配这些功能并且使用Android X的AppCompat功能以后,在新版本系统当中即可启用多语言系统管理功能。

此外,安卓13升级了Unicode库的支持,包括Unicode ICU 70、Unicode CLDR 40和Unicode 14.0。

安卓13带来了快速断词、断句的功能,以前UI渲染性能低下,现在TextView的断词性能提升,应用可以在TextView的setHyphenationFrequency当中启用这个新的功能。

全新的照片拾取

Apple iPhone早在iOS 14版本就支持了这个照片隐私保护功能,用户可以自定义要提供给应用阅览的照片,而无需授予应用访问所有照片权限。这个功能现在被带到了安卓13上,极大增强了用户的隐私安全。如果应用适配安卓13,则可以启用这个全新的增强隐私功能,让用户选择愿意给应用分享的图片。

照片媒体拾取

当然不止于照片,同样可以拾取视频,开发者只需要如下代码即可适配:

// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE)
// OR Java
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE);
// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
val maxNumPhotosAndVideos = 10
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos)
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE)

// Launches photo picker for videos only in single select mode.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.type = "video/*"
startActivityForResult(intent, PHOTO_PICKER_VIDEO_SINGLE_SELECT_REQUEST_CODE)
// Apps can also change the mimeType to allow users to select
// images only - intent.type = "images/*"

然后我们可以在活动当中处理相关的事件回调:

// onActivityResult() handles callbacks from the photo picker.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode != Activity.RESULT_OK) {
        // Handle error
return
    }
    when (requestCode) {
            REQUEST_PHOTO_PICKER_SINGLE_SELECT -> {
            // Get photo picker response for single select.
            val currentUri: Uri = data.data

            // Do stuff with the photo/video URI.
            return
        }
                REQUEST_PHOTO_PICKER_MULTI_SELECT -> {
            // Get photo picker response for multi select.
            var i = 0
            while (i < data.clipData!!.itemCount) {

附近的Wi-Fi设备

Android 13 引入了‎‎NEARBY_WIFI_DEVICES‎‎运行时权限‎‎(‎‎NEARBY_DEVICES‎‎权限组的一部分),适用于通过 Wi-Fi 管理设备与附近接入点的连接的应用。此权限可以更轻松地证明应用程序访问附近Wi-Fi设备的合理性。如果应用在以前的平台上运行,则这些应用程序需要声明‎‎ACCESS_FINE_LOCATION‎‎权限。‎

‎如果应用以 Android 13 为目标平台并‎‎调用了多个不同的 Wi-Fi API‎‎,则应用必须从用户处获取此新权限。‎应用可以继续获取访问位置权限以获取附近Wi-Fi设备,当然安卓更建议使用这个新的权限以获取,而不需要获取实时定位。如果应用不需要获取位置,则可以通过如下配置解决:

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
        ...
</manifest>

全新的‎可编程着色器‎

‎Android 13 增加了对可编程 ‎‎RuntimeShader‎‎ 对象的支持,其行为使用 Android 图形着色语言 (AGSL) 进行定义。AGSL与GLSL共享其大部分语法,可以在Android渲染引擎中工作,以自定义Android画布中的绘画以及过滤视图内容。Android 在内部使用这些着色器来实现‎‎涟漪效果、‎‎模糊‎‎和‎‎拉伸过度滚动‎‎,而 Android 13 可为应用创建类似的高级效果。‎

可编程着色器

JDK升级

‎Android 13更新了Android的Java核心库,以与OpenJDK 11 LTS版本保持一致,并为应用程序和平台开发人员提供库更新和Java 11语言支持。Android 13中引入的核心库更改也将通过Google Play系统更新到ART Mainline模块提供给Android 12设备。‎

JDK11支持全新的关键字var,加入了全新方法到String类当中,支持Collection.toArray(IntFunction)方法,支持java.lang.invoke.VarHandle等等。

通知权限

安卓13 DP2版本当中增加了通知运行时权限,这个权限和vivo手机的类似,也就是应用需要申请这个权限才能发送通知。申请这个权限就跟申请电话、存储权限一样,需要用户点击界面确认。这个权限也需要在清单声明,用例如下:

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

如果开发者需要发送一个通知,应该调用areNotificationsEnabled()检查一遍,引导用户开启通知权限,界面示例如下:

引导用户开启通知权限

前台服务任务管理器

和Windows的任务管理器有点像,不过这次是前台服务管理器,Android 13针对所有适配SDK的应用推出了前台服务管理器,在安卓13之前,应用会乱启动前台服务达成保活的功能,这个是谷歌不愿意看见的,因此安卓13推出了全新的前台服务管理器。

前台服务管理器

当用户点击停止以后,软件的前台服务将会直接被结束掉,不再占后台资源。如果开发者想要获取通过这种类型被结束的应用信息,可以调用ApplicationExitInfo这个接口来查询,这个接口在安卓11的时候就加入了,安卓13添加了字段REASON_FREEZER,通过getReason()接口即可查阅,需要更多详情可以访问谷歌安卓API文档网站。另外,如果系统检测到应用前台服务长期运行,例如超过20小时运行,系统会引导用户打开这个任务管理器来结束应用进程。

广播接收器标识

在应用适配安卓13以后,调用注册广播接收器API的时候需要新增是否导出的标志,否则不能有效注册,注册源码示例如下:

// This broadcast receiver should be able to receive broadcasts from other apps.
// This option causes the same behavior as setting the broadcast receiver's
// "exported" attribute to true in your app's manifest.
context.registerReceiver(sharedBroadcastReceiver, intentFilter,
    RECEIVER_EXPORTED)

// For app safety reasons, this private broadcast receiver should **NOT**
// be able to receive broadcasts from other apps.
context.registerReceiver(privateBroadcastReceiver, intentFilter,
    RECEIVER_NOT_EXPORTED)

新电池耗电控制

安卓13更新了耗电控制功能,如果用户设置了电池使用策略为“受限”,则应用发送广播或者在后台活动都会受到对应的影响。

麦科技/62视频原创,转载请说明出处。