Android 在 Google 开发者大会上发布了哪些更新? | Google 开发者大会 2018

有哪些新的 Android 系统特性

  • Google Play 上的 targetVersion 要求
    • 2018年8月 新应用发布必须为26或者更高
    • 2018年11月 升级现有应用必须为26或者更高
    • 2019年之后 新发布或者升级应用必须为一年内发布的 Android 版本
  • 工信部已经出台相应的政策,中国主流的应用市场也已经跟进
  • Google 提供了全新的 TargetVersion 升级指南,可以扫描图片中的二维码获得。

电量优化和后台控制

Android 始终致力于电量优化和后台控制,通过后台控制程序进程,优化电量,进而提升待机时间,来提升用户体验。我们希望开发者通过下图中的要求,来测试自己的应用,进而提升自己的应用质量。

从Android O 开始,应用可以像以前一样,在前台启动服务,但是当被转到后台的时候,应用只有几分钟的时间继续进行服务,然后,他的后台服务就会被停止。当应用在后台时,是不能使用 startService 来启动服务的,会抛出 illegalStateException 错误。

所以,对于开发者来说,如果你的应用需要和开发者在后台保持交互的话,你需要按照下面的方案进行优化

  • Context.startForegroundService()
  • 使用JobScheduler WorkManager 调度后台任务
  • 使用 JobIntentService 替换 IntentService

后台位置限制

很多开发者反应,电池耗电是应用开发过程中最不爽的因素,而后台定位就是电池耗电的最大原因之一。如果大量使用定位,电池就会消耗很快,用户就会禁用定位,然后你的应用体验就会变得很差。进而会导致你的应用的一些功能失效。所以,我们在 Android O 的时候,对定位加了一定的限制。

当你的应用在前台的时候,还是可以像往常一样,你实时无限制的收集用户信息,但是,当你的应用在后收集的时候,收集速度会被限速,大概每小时会有几次的位置更新。

对开发者来说,有以下方案可以用于优化后台位置信息的限制

  • 使用地理围栏 Geofence。我们对地理围栏做了很多效率上的优化,他的延时会稍稍增加,但是功耗却只有原来的10%。
  • 使用位置批处理 LocationService.setMaxWaitTime()。这就意味着,很多数据点都会在后台收集,然后一起返回给你。虽然你每小时只会收到几次位置信息,但是会包含更多的数据点。
  • 被动获取位置信息 LocationService.setFastestInterval() 当你的应用在后台时,前台应用在收集位置信息,你的应用可以被动接受前台应用采集的数据信息。

隐式广播限制

这也是之前 Android 系统中存在的一个问题,隐式广播可能会导致系统的大量服务被启动,进而会导致系统不稳定。所以,Android O 中将不在 androidmanifest 中为隐式广播注册广播接收器。具体限制可以参考下面的几条:

  • 无法在 androidmanifest 中卫隐式广播注册广播接收器
  • androidmanifest 中注册的显式广播仍然有效
  • 使用Context.registerReceiver()注册隐式广播接收器仍然有效

针对上面的限制,我们建议广大开发者使用一下方法进行优化:

  • 使用优先级更高的 FCM 消息
  • 使用JobScheduler WorkManager 来安排一个作业

Android 的新版本将会支持更多的现代化设备,应用也应该利用这些新的特性来提升用户体验,这些新的体验我们在下面会一一介绍。

特长屏幕支持

从 Android O 开始,系统开始支持特长屏幕,很多手机厂家开始发布特长屏幕的手机。对于广大开发者来讲,请不要对屏幕的纵横比做出错误的假设。否则会影响用户的 UI 体验。

从 API 26 以上,系统就不会为应用设置默认的屏幕纵横比,所以你的应用应该适应不同的屏幕尺寸,来做一些屏幕自适应的设计。

如果真的需要最大的屏幕纵横比声明支持的话,纵横比应该这设置

  • android:resizableActivity = false
  • API 26 以上设置 android: MaxAspectRatio 声明你所支持的最大纵横比。

凹口屏幕支持

Android O 也对凹口屏幕进了相关的支持,应用可以在 androidmanifest 中通过一下方式实现对刘海屏幕的支持

  • android:layoutInDisplayCutoutMode
    • DEFAULT 有黑色边框(屏幕纵向-仅在状态栏隐藏时)
    • NEVER 一直有黑色边框
    • SHORT_EDGES 占用凹边周围
  • WindowInsets.getDisplayCutout()
    • getSafeInset(Top|Bottom|Right|Left) 获取内容的安全区域
    • getBounds()获取凹口区域(支持多个凹口)
  • 对于开发者来说不要假设状态栏高度,应该通过模拟器多测试,模拟多种凹口屏的设备。

画中画模式(PIP)

从 Android O 开始,系统开始支持画中画模式。画中画模式是一种特殊的多窗口模式,可以用来视频聊天,播放电影,导航等场景。

当一个Activity 处于 PIP 模式,他会处于暂停状态,但是仍然会显示内容。出于这个原因,你应该保证你的应用不会在 onPause()中会暂停播放,正确的做法是,应用在 onStop() 的过程中暂停播放视频,在 onStart() 的时候继续播放。

多显示器支持

从 Android O 开始,系统支持多显示支持,如果 Activity 支持多显示器显示,系统会自动启用多显示器支持。当应用启动一个 Activity 的时候,可以通过 ActivityOptions.setLaunchDisplayId() 来制定在哪个显示器上进行显示。每个显示器都有自己的配置,当应用从一个显示器到另一个显示器的时候,Activity 会根据显示器的配置自动修改某些属性。需要注意的是:虽然 Activity 运行在多个显示器上,但是仍然只有一个 Activity,不要假设暂停的 Activity 一定是不可见的。

最后,我们希望开发者能够利用最新的开发工具,来提升应用开发效率和可靠性。 为了帮助开发者更有效,更容易的开发应用。我们在今年的 Google I/O 上推出了 Android JetPack 。其中包含了应用开发库、工具、以及最佳实用指南。通过提供通用的基础配件和组件,帮助开发者更好的专注于应用开发的业务逻辑。

由于时间原因,我们无法详细的介绍每个模块的具体使用方法,请大家参考文档和实例代码,在应用中使用最新的 Android JetPack 组件

包名重构

所有的扩展类,例如 v4 和 v7 在 JetPack 中使用统一的包名 androidx。同时 gradle 也提供了相应的转换支持。

我们下面来介绍一下 JetPack 的架构组件

架构组件提供了数据存储、管理生命周期等模块化的功能帮助开发者避免在开发过程中的常见错误,减少样板文件。 在架构组件中,Room 是支出流畅数据库访问的对象映射抽象层,其他的组件的的说明可以在下面的图片中看到

有些组件可以放在一起使用,比如:LiveData 和 Room,当 Room 中的数据有更新的时候,他就会更新 LiveData 中的数据,从而自动触发界面中的更新。

Kotlin

我们现在也非常鼓励开发者使用 Kotlin 编程语言,相较于 Java,Kotlin 可以减少25%的代码量,并且可以有效防止 NullPointerException,Kotlin 和 Java 的二进制代码完全兼容,可以互相调用,所以大家可以逐步的迁移到 Kotlin 的开发语言。

我们在 Android 9 SDK 中,对 Kotlin 添加了可控性注解,如果你的项目中违法了可控性注解的协议,你的代码在 IDE 中会出现警告,虽然只是警告级别,但是我们想再下个版本的 IDE 中提高错误等级。

从去年 Google I/O 中发布 Kotlin 成为 Android 开发的官方语言,我们做了相关的问卷调查,在调查中我们发现,40%的开发者已经在使用 Kotlin 进行开发

JetPack 中,我们也提供了 Kotlin 的扩展库 KTX,使 Kotlin 的代码更加简单整洁,更符合 Android 开发习惯。KTX 可以帮助你更简单的编写业务的核心代码。

通过使用 Kotlin,开发者们也尝到了甜头,我们在国内的合作伙伴 Camera360,使用 Kotlin 获得了全球业务上的增长,你们可以通过图片中的二维码,了解关于 Camera360 的开发者故事

Android Studio 3.1中也更新了许多新工具,帮助开发者更好的开发和测试 Android 应用。例如:支持 Kotlin Lint

Android Studio 3.1 中 还有很多新工具,但是由于时间关系我们无法一一做介绍,总而言之,Android Studio 3.1 提供了更好的编译速度、更快的模拟器、更全面的分析器、更好的 Kotlin 支持和更好的架构组件的支持。欢迎开发者们在以后的开发过程中使用。

Google 开发者大会 2018 技术干货

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两个不同的数据库如何跨库事务

首先我们要明白同一实例,简单来说就是一个ip,如果两个数据库位于同一个ip,就是同一实例。其实实例并不相当于ip, 他其实相当于服务,也就是serve。 这样的两个或多个就可以跨库事务,比如 begin; insert in…

链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)

参考http://www.cnblogs.com/TenosDoIt/p/3666585.html 插入排序(算法中是直接交换节点,时间复杂度O(n^2),空间复杂度O(1)) 1 class Solution {2 public:3 ListNode *insertionSortList(Lis…

zookeeper使用和原理探究

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 zookeeper介绍 zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据…

thinkphp如何部署到宝塔面板nginx服务器

原理:一般本地都会使用apache服务器,这个对pathinfo(两个,一个是环境变量$_SERVER[PATH_INFO],另一个是pathinfo函数)路由解析非常支持的,不需要部署什么, 但是nginx是对pathinfo函…

Android获取所有应用的资源id和对应的uri

背景在某些应用中,为了实现应用apk资源放入重复利用,或者使用反射得到本应用的资源,需要使用反射方式获得,但Resources类中也自带了这种获取方式,并且功能更加强大你可以获取string,color,drawable,raw,xml等文件&…

nginx的脚本引擎(一)

nginx的脚本的语法和shell是很像的,我大致看了一下觉得挺有意思的,就想写写记录一下。我没看过shell脚本的引擎,不知道nginx脚本引擎和shell脚本引擎像不像,但是我觉得nginx的脚本引擎有点像C和汇编。 ngx_http_script_engine_t这…

一个待办事列表todolist

最近有位老师让我做的,图片在下面,做了4个多小时,ui有的简陋,可以再美化一下,这个会更好看,毕竟我也不是专业前端,测试网站http://todolist.sshouxin.top/使用的是thinkphp5.1的框架&#xff0c…

详细说明 SourceTree 免登录,跳过初始设置的方法(Windows 版 )

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 首先,安装完 SourceTree 以后先运行一次,弹出初始化登录页面后退出。 2. 进入这个文件夹:C:\Users…

什么是好的API设计?

摘要:有人言,API设计是编程工作中最难的事情。甚至有人认为至少要有10年的工作经验才能接触它。不过这里提出了一个引人思考的问题:究竟是构建什么样的库需要花费10年的时间去学习? 有人言,API设计是编程工作中最难的事…

Linux学习记录-文件、目录与磁盘

用户和群组 用户和群组主要是为了区分用户对文件的操作权限。 账号在/etc/passwd个人密码在/etc/shadow组信息在/etc/group 不要乱动这3个文件文件权限和目录配置 文件属性 文件前缀解释,例如: 第一个字符代表这个文件是『目录、文件或链接文件等等』&am…

php curl模拟https请求

https请求(支持GET和POST) function http_request($url,$data null){$curl curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if(!empty($data)){curl_setopt($cur…

springboot集成环信sdk报错

import io.swagger.client.ApiException; import io.swagger.client.api.MessagesApi; import io.swagger.client.model.Msg 这个是因为少两个包,只需要把在你的pom.xml添加以下代码即可,不要忘记点赞哈只需要添加两个包即可,你可以自行网上下…

解决 error: Your local changes to the following files would be overwritten by merge:XXXX

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 idea 上将本地代码推送到 git后 , 报错如下图 error: Your local changes to the following files would be overwritten by merge:src/…

深度有趣 | 30 快速图像风格迁移

简介 使用TensorFlow实现快速图像风格迁移(Fast Neural Style Transfer) 原理 在之前介绍的图像风格迁移中,我们根据内容图片和风格图片优化输入图片,使得内容损失函数和风格损失函数尽可能小 和DeepDream一样,属于网络…

转型从思维习惯的转变开始

摘要:首先建议大家不要轻易转向管理岗位,要认清自己是否适合做管理。转型过程中应把握好几点:良好的技术基础,它是赢得团队信任的前提,是把握团队整体方向的关键;培养大局观,只有站得高才能看得…

数据库小知识点(一直更新)

一、mysql查询是否含有某字段: mysql数据库查询带有某个字段的所有表名 SELECT * FROM information_schema.columns WHERE column_namecolumn_name; oracle数据库查询带有某个字段的所有表名 select column_name,table_name,from user_tab_columns where column_n…

其他运算符

原文地址:https://wangdoc.com/javascript/ void运算符 void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 void 0 // undefined void(0) // undefined 上面是void运算符的两种写法,都正确。建议采用后一…

git pull --rebase 做了什么? 以及 Cannot rebase: You have unstaged changes 解决办法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 最近刚学 git rebase,觉得很牛逼的样子, 结果今天就被打脸了。 git pull --rebase 1 报错: Cann…

vue如何实现单页缓存方案分析

实现全站的页面缓存,前进刷新,返回走缓存,并且能记住上一页的滚动位置,参考了很多技术实现,github上的导航组件实现的原理要么使用的keep-alive,要么参考了keep-alive的源码,但是只用keep-alive…

C语言常用函数简介

一、字符测试函数 isupper()测试字符是否为大写英文字ispunct()测试字符是否为标点符号或特殊符号isspace()测试字符是否为空格字符isprint()测试字符是否为可打印字符islower()测试字符是否为小写字母isgraphis()测试字符是否为可打印字符isdigit()测试字符是否为阿拉伯数字i…