丈夫欲遂平生志,一载寒窗一举汤。这篇文章主要讲述值得你关注的Android8.0(Android O)上的重要变化相关的知识,希望能为你提供帮助。
刚适配完android7.0还没多久,
就看到Google官方推出的Android8.0(
Android O)
的开发者预览版新闻,
我的心情你可以好好想想。对于上层应用开发者的我来说,
适配新版本的工作还好,
而有JNI且有很多深层修改的人来说则是痛苦的。那么这一次的大版本更新,
最终何时定型发布?
她都带来了哪些新的限制与变化,
对我们已有的应用有何影响?
新增了什么特性,
能否利用起来增加新奇有趣的功能呢?
本文在整理官方的Preview文档同时,
运行部分示例代码,
为各位一一展现。如果你英文还不错,
时间也充裕,
文末有官方文档链接,
供你亲自琢磨和体验。
Android O完善计划与发布时间 Google在2017年3月21日首次推送Android O开发者预览版,
那接下来的更新和到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,
旧方法不再有效
在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)上的重要变化】通知显示和原来没有大的区别, 如下图所示:
文章图片
在设置中可以看到针对某个频道通知进行控制
文章图片
2.画中画( Picture In Picture)
Activity的显示多了一种方式, 只要在AndroidManifest.xml中设置android:supportsPictureInPicture为true即可, 实现如下图显示效果:
文章图片
注意, 处在画中画模式中的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.可以注册的隐式广播
推荐阅读
- Android xUtils3源码解析之数据库模块
- Google App Engine10年,支持更多你喜欢的编程语言
- Android studio 2.3安装遇到的问题
- PhoneGap 获得APP的VersionName
- 学习嵌入式开发板的Android平台体系结构和源码结构
- Android利用Fiddler进行网络数据抓包
- h5开发app之在线生成二维码
- Tornado 高并发源码分析之三--- Application 对象
- Installation Guide for Appium 1.6.3