值得你关注的Android8.0(Android O)上的重要变化

丈夫欲遂平生志,一载寒窗一举汤。这篇文章主要讲述值得你关注的Android8.0(Android O)上的重要变化相关的知识,希望能为你提供帮助。
刚适配完android7.0还没多久, 就看到Google官方推出的Android8.0( Android O) 的开发者预览版新闻, 我的心情你可以好好想想。对于上层应用开发者的我来说, 适配新版本的工作还好, 而有JNI且有很多深层修改的人来说则是痛苦的。那么这一次的大版本更新, 最终何时定型发布? 她都带来了哪些新的限制与变化, 对我们已有的应用有何影响? 新增了什么特性, 能否利用起来增加新奇有趣的功能呢?
本文在整理官方的Preview文档同时, 运行部分示例代码, 为各位一一展现。如果你英文还不错, 时间也充裕, 文末有官方文档链接, 供你亲自琢磨和体验。
Android O完善计划与发布时间 Google在2017年3月21日首次推送Android O开发者预览版, 那接下来的更新和到Android O真正稳定, 最终发布是在何时呢? 借用官方文档的时间轴图:

值得你关注的Android8.0(Android O)上的重要变化

文章图片

从上能够看出, 此次发布的DP1( 开发者预览版) 的更新版本DP2在五到六月份之间, 而DP1和DP2都主要面向开发者, 发现兼容性问题, 体验反馈新特性, 此时的系统镜像自身还有很多稳定性问题, 还不适合日常使用;
DP3、DP4已经到七月份, 提供了最终的API和官方SDK, 在此基础上可以做完整的兼容性测试和基于新特性开发新功能。最终的Android O版本发布则定在了第三季度。
根据以往的经验, 第三季度到年底才陆续有旧设备的OTA升级, 而到国内的新机发布和旧设备的升级则持续到了第二年的三四月份。因此, 从最后的发布时间看, 现在是可以先松口气。但是很多实际情况是很早的完成了Google亲儿子手机的适配工作, 而国内手机厂商又大肆修改, 带来其他很多不确定性。所以还是早做准备, 心里有数, 毕竟早起的鸟儿有虫吃。
新的限制与变化 Android新版本的限制与变化主要分成两方面, 一是影响所有app的, 二是影响面向新版本app的( 主要是targetSdkVersion指向新版本) 。后者的适配还好, 一般的应用不会非常快的修改targetSdkVersion; 而前者是实实在在的需要立即着手跟进的。
影响所有应用的:
1.后台限制
( 1) 后台运行限制
  • 当应用进入到后台, 没有可见且运行的组件( 如后台Service) , 系统会释放应用所持有的唤醒锁( wakelock)
  • 使用 NotificationManager.startServiceInForeground()方法启用foreground Service, 旧方法不再有效
( 2) 后台位置获取限制
在Android O系统上, 后台运行的应用, 不再能频繁的收到位置更新的信息; 但具体更新频次减少到多少, 还需要最重版发布后测试确定
2.安全相关的变化
( 1) 平台不再支持SSLv3
( 2) HttpsURLConnection在HTTPS链接建立时, 不再自动切换到早期TLS协议版本重试
( 3) 应用的WebView实例, 将运行在独立的进程中
3.隐私策略变化
( 1) ANDROID_ID 不再是设备中所有应用共享的, 而是每个应用获取到的都不一样, 而且以包名和签名作为区分; 卸载后重新安装也不会发生变化; 但是手机恢复出厂设置后, 应该和上一次的不再一致
( 2) 获取系统属性net.hostname, 将得到null
4.应用快捷方式变化
以com.android.launcher.action.INSTALL_SHORTCUT广播方式创建快捷方式不再有效, 而要使用 ShortcutManager的 requestPinShortcut()方法。
5.Alert Window显示变化
在声明SYSTEM_ALERT_WINDOW 权限后, 选择使用TYPE_SYSTEM_ALERT等来使弹窗显示在其他应用之上; 在Android O系统上都将显示在TYPE_APPLICATION_OVERLAY类型的窗口之下。而targetSdkVersion为android O的应用直接使用TYPE_APPLICATION_OVERLAY显示Alter Window。这样你的弹框可能还是在别人的弹窗之下。
6.其他
( 1) 蓝牙: ScanRecord.getBytes()方法变化
( 2) 键盘导航: 使应用支持实体键盘导航( 以前就有, 只是重新提一下)
( 3) 网络连接及HTTPS相关: 在connect失败之后, 调用send(DatagramPacket)会抛出SocketException, 以及其他一些细节的变化
( 4) 当集合为空时, AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 将抛出 NullPointerException
( 5) 本地化与国际化: 如Currency.getDisplayName()等方法默认调用 Locale.getDefault(Category.DISPLAY), 默认时区的解析等
( 6) 联系人统计数据: 不再提供联系人邮件或电话准确的联系过的次数信息, 而是仅提供近似值
影响面向android O应用的:
1.后台限制
( 1) startService() 将抛出 IllegalStateException
( 2) 限制在AndroidManifest.xml中注册接收隐式广播, 如ACTION_PACKAGE_REPLACED , 但也有些例外如ACTION_BOOT_COMPLETED, ACTION_LOCALE_CHANGED( 所有例外参考文末连接) 。( 注意此部分限制都是只针对targetSdkVersion为android O, 或者编译的SDK为android O及以上的的, 低于的则不受影响)
2.隐私相关变化
( 1) 获取系统属性net.dns1、net.dns2、net.dns3 和 net.dns4不再可用
( 2) 不再支持 Build.SERIAL, 而改为 Build.getSerial()
3.本地库变化
在Android O上强制要求Segment不能同时具备写和可执行, 如数据段不可执行, 代码段不可写。
4.ContentProvider的变更通知
调用 ContentResolver.notifyChange()和registerContentObserver(Uri, boolean, ContentObserver) 实现通知和监听某些Uri上的变化, 在Android O上则要求uri对应的ContentProvider要正确定义, 但是没有定义会有怎样的问题并没有提及
5.其他
Alter Window的显示, 集合排序方法的变化和获取用户帐号权限变化等。
新的特性 在写本文时, Google官方已推出部分中文文档( 应该很快会全部更新) , 鉴于此, 本处仅展示下有趣且具有示例代码的多频道( Channel) 的通知、画中画和自动填充框架
1.多频道通知
我的理解是将应用发出的通知进行细化, 划分成不同的类别, 就像电视的一个个频道, 可以针对频道进行操作。如用户可以屏蔽某个频道的通知, 而不是这个应用的所有通知消息; 开发者可以针对频道设置通知的震动、声音等。
【值得你关注的Android8.0(Android O)上的重要变化】通知显示和原来没有大的区别, 如下图所示:
值得你关注的Android8.0(Android O)上的重要变化

文章图片

在设置中可以看到针对某个频道通知进行控制
值得你关注的Android8.0(Android O)上的重要变化

文章图片

2.画中画( Picture In Picture)
Activity的显示多了一种方式, 只要在AndroidManifest.xml中设置android:supportsPictureInPicture为true即可, 实现如下图显示效果:
值得你关注的Android8.0(Android O)上的重要变化

文章图片

注意, 处在画中画模式中的Activity会回调onPause方法, 因此像播放视频类的应用, 不要在onPause中停止播放, 而是在onStop方法中停止。
3.自动填充框架( AutofillFramework)
简单分为提供自动填充服务的应用和使用自动填充功能的应用。前者通过继承AutoFillService解析界面上的view结构提供自动填充和保存数据的能力, 后者在标准View上不做修改就能使用此服务, 而自定义View还得做些处理才行。可是提供自动填充服务的应用需要取得信任, 还要做很多额外的事情, 后续推广不知能否推开。
本来修改了测试Demo可以在通知栏Demo中使用自动填充的功能, 结果系统不稳定, 已经无法在任何页面显示自动填充的弹窗, 而且还出现几次死机, 因此没有截图。
如何体验到Android O 把手中的设备刷到Android O的操作步骤很简单, 首先查找手上的设备是否有支持Android O预览版的机型
Nexus 5X
Nexus 6P
Nexus Player
Pixel C
Pixel
Pixel XL
我使用的是Nexus 6P, 具体步骤如下: 官网链接
1.下载到对应ZIP包
解压, 目录中包含了flash-all.sh
2.USB连接手机
确保可调用adb命令, 即在环境变量中设置好adb命令的路径
3.进入fastboot模式
adb reboot bootloader
( 没有采用按键方式进入)
4.解锁bootloader
尝试使用fastboot flashing unlock或者fastboot oem unlock, 本人手机已经解锁过, 因此没有使用
5.刷入新系统
在终端命令行切到刚才解压ZIP文件后的目录, 即在flash-all.sh目录; 执行flash-all.sh(windows可使用flash-all.bat)。执行完毕之后即可进入Android O
6.锁定bootloader
执行fastboot flashing lock或者fastboot oem lock, 本人没有执行
最后再次提醒, 请以最后发布的官方文档为准。而且此版本仅供开发者体验和测试反馈, 不适合日常使用, 避免不必要的麻烦。
转载请注明出处: http://blog.csdn.net/w7849516230, 欢迎关注微信公众号“编程阳光”
1.Android O Preview官方说明
2.可以注册的隐式广播

    推荐阅读