Android新版本特性以及注意事项
版权声明:本文为HaiyuKing原创文章,转载请注明出处!
概述
了解新版本的特性还是很有必要的,为什么这么讲呢?因为可以从应用市场对发布应用的目标API版本(targetSdkVersion值)的要求说起:
- 从 2018 年 8 月 1 日起,所有向 Google Play 首次提交的新应用都必须针对 Android 8.0 (API 等级 26) 开发; 2018 年 11 月 1 日起,所有 Google Play 的现有应用更新同样必须针对 Android 8.0。
-
自2019年5月1日起,应用宝本商城新上架应用应基于Android 8.0 (API等级26,即targetSdkVersion大于等于26)及以上开发。自2019年8月1日起,现有应用的更新应基于Android 8.0 (API等级26,即targetSdkVersion大于等于26)及以上开发。2018年9月1日后,未达到要求的应用,腾讯开放平台将逐步采用不推荐的策略。2019年5月1日后,未达到要求的应用,腾讯开放平台将拒绝上架,2019年8月1日后,未达到要求的应用,腾讯开放平台将拒绝更新。
- 腾讯开放平台将在2018年3月21日启动Android P (API 等级 28) 版本应用适配检测工作。针对未适配Android P版本的应用,腾讯开放平台将在Android P版本机型上采取屏蔽或不推荐更新等策略。
- 华为开发者联盟:自2019年5月1日起,华为应用市场新上架应用应基于Android 8.0 (API等级26,即targetSdkVersion大于等于26)及以上开发。自2019年8月1日起,现有应用的更新应基于Android 8.0 (API等级26,即targetSdkVersion大于等于26)及以上开发。2019年5月1日后,未达到要求的新应用,华为应用市场将拒绝上架。2019年8月1日后,未达到要求的现有应用,华为应用市场将拒绝更新。
而将targetSdkVersion的值修改成高版本,那么就代表在这个版本上的手机设备上已经进行了适配,比如Android8.0(API 26),那么就要考虑到适配应用图标的问题、还有通知栏适配等等。
各版本对应的API值
数据来源:https://developer.android.google.cn/about/dashboards/?hl=zh-cn
Android 4.4 KitKat(targetSdkVersion =19)
参考《Android 4.4 API》
这里简单讲一下主要API变更,具体的请阅读上面的链接。
外部存储空间访问权限
您的应用在 Android 4.4 上运行时无法读取外部存储空间上的共享文件,除非您的应用具有 READ_EXTERNAL_STORAGE 权限。也就是说,没有此权限,您无法再访问 getExternalStoragePublicDirectory() 返回的目录中的文件。但是,如果您仅需要访问 getExternalFilesDir() 提供的您的应用特有目录,那么,您不需要 READ_EXTERNAL_STORAGE 权限。
webview底层代码变化
WebView 类的底层代码和相关 API 已升级为基于现代的 Chromium 源代码快照。这会带来各种性能提升,同时为新的 HTML5 功能和远程调试 WebView 内容提供支持。此次升级的范围意味着如果您的应用使用 WebView,则在某些情况下其行为可能会受影响。尽管对已知的行为变更进行了记录,但仅在您将应用的 targetSdkVersion 更新为“19”或更高版本时这些变更才会对应用产生很大的影响—新的 WebView 在“兼容模式”中运行以便在面向 API 级别 18 和更低级别的应用中提供部分旧功能—您的应用有可能依赖来自以前的 WebView 版本的未知行为。
沉浸式全屏模式
要为您的应用提供填充整个屏幕的布局,适用于 setSystemUiVisibility() 的新标记 SYSTEM_UI_FLAG_IMMERSIVE(与 SYSTEM_UI_FLAG_HIDE_NAVIGATION 结合使用时)将启用新的沉浸式全屏模式。在启用沉浸式全屏模式后,您的 Activity 将继续接收所有触摸事件。用户可以沿着系统状态栏正常出现的区域向内滑动来显示系统状态栏。这将清除 SYSTEM_UI_FLAG_HIDE_NAVIGATION 标记(如果应用了 SYSTEM_UI_FLAG_FULLSCREEN 标记,也会清除该标记),因此系统状态栏保持可见状态。但是,如果您想要系统状态栏在片刻后再次隐藏,可以改用 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 标记。
透明系统状态栏
现在,您可以使用新主题背景 Theme.Holo.NoActionBar.TranslucentDecor 和 Theme.Holo.Light.NoActionBar.TranslucentDecor 将系统状态栏设置为部分透明。通过启用透明系统状态栏,您的布局将填充系统状态栏后面的区域,因此,您也必须为不应被系统状态栏覆盖的布局部分启用 fitsSystemWindows。
如果您要创建自定义主题背景,则将其中某个主题背景设置为父主题背景,或在您的主题背景中添加 windowTranslucentNavigation 和 windowTranslucentStatus 样式属性。
从Android4.4开始,才可以实现状态栏着色,并且从5.0开始系统更加完善了这一功能。
Android 5.0(targetSdkVersion =21)
参考《Android 5.0 API》
这里简单讲一下主要API变更,具体的请阅读上面的链接。
Material Design 支持
Android 5.0 添加了对 Android 的新 Material Design 样式的支持。您可以创建具有 Material Design 功能的应用,实现动态视觉效果,利用其中的 UI 元素转换赋予用户自然的感觉。此支持包括:
- Material Design 主题
- 视图阴影
- RecyclerView、卡片CardView、Toolbar、FloatingActionButton、TextInputLayout、Snackbar、AppBarLayout、TabLayout、NavigationView
- 可绘制动画和造型效果
- Material Design 动画和 Activity 转换效果
- 针对基于视图状态的视图属性的动画生成器
- 可自定义的 UI 小部件和具有可由您控制的调色板的应用栏
- 基于 XML 矢量图形的动画和非动画可绘制对象
通知
1.普通Notification
创建Builder 对象,添加各种属性,用PendingIntent 控制跳转,最后是创建NotificationManager调用notify方法。
2.折叠式Notification
用RemoteViews来创建自定义Notification视图。
3.悬挂式Notification(5.0新增)
调用setFullScreenIntent来将Notification变为悬挂式Notification。焦点不变,不会影响用户操作,显示几秒会自动消失。
Android 6.0(targetSdkVersion =23)
参考《Android 6.0 API》
这里简单讲一下主要API变更,具体的请阅读上面的链接。
指纹身份验证
通知
此版本移除了 Notification.setLatestEventInfo() 方法。请改用 Notification.Builder 类来构建通知。要重复更新通知,请重复使用 Notification.Builder 实例。调用 build() 方法可获取更新后的 Notification 实例。
此版本针对通知功能引入了下列 API 变更:
- 新增了 INTERRUPTION_FILTER_ALARMS 过滤级别,它对应于新增的“仅闹铃”免打扰模式。
- 新增了 CATEGORY_REMINDER 类别值,用于区分用户安排的提醒与其他事件 (CATEGORY_EVENT) 和闹铃 (CATEGORY_ALARM)。
- 新增了 Icon 类,您可以通过 setSmallIcon()方法和 setLargeIcon()方法将其附加到通知上。同理,addAction() 方法现在接受 Icon 对象,而不接受可绘制资源 ID。
- 新增了 getActiveNotifications() 方法,让您的应用能够了解哪些通知目前处于活动状态。要查看使用此功能的应用实现,请参阅 ActiveNotifications 示例。
运行时权限
此版本引入了一种新的权限模式,如今,用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的 requestPermissions() 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。
Android 7.0(targetSdkVersion =24)
这里简单讲一下主要API变更,具体的请阅读上面的链接。
FileProvider【常用于调起系统相机拍照返回图片路径、调用系统文件管理器返回文件路径】
传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。
多窗口支持
在 Android 7.0 中,我们为该平台引入了一个新的而且非常需要的多任务处理功能 — 多窗口支持。
现在,用户可以一次在屏幕上打开两个应用。
通知增强功能
在 Android 7.0 中,我们重新设计了通知,使其更易于使用并且速度更快。部分变更包括:
- 模板更新:我们正在更新通知模板,新强调了英雄形象和化身。开发者将能够充分利用新模板,只需进行少量的代码调整。
- 消息传递样式自定义:您可以自定义更多与您的使用 MessagingStyle 类的通知相关的用户界面标签。您可以配置消息、会话标题和内容视图。
- 捆绑通知:系统可以将消息组合在一起(例如,按消息主题)并显示组。用户可以适当地进行拒绝或归档等操作。如果您已实现 Android Wear 的通知,那么您已经很熟悉此模式。
- 直接回复:对于实时通信应用,Android 系统支持内联回复,以便用户可以直接在通知界面中快速回复短信。
- 自定义视图:两个新的 API 让您在通知中使用自定义视图时可以充分利用系统装饰元素,如通知标题和操作。
多语言区域支持,更多语言
Android 7.0 现在允许用户在设置中选择多个语言区域,以更好地支持双语用例。应用可以使用新的 API 获取用户选择的语言区域,然后为多区域设置用户提供更成熟的用户体验 — 如以多个语言显示搜索结果,并且不会以用户了解的语言翻译网页。
应用可以通过调用 LocaleList.GetDefault() 获取用户设置的语言区域列表。为支持扩展的语言区域数量,Android 7.0 正在改变其解析资源的方式。请务必使用新的资源解析逻辑测试和验证您的应用是否能如期运行。
Android 8.0(targetSdkVersion =26)
这里简单讲一下主要API变更,具体的请阅读上面的链接。
自适应图标(应用图标适配)
Android 8.0 引入自适应启动器图标。自适应图标支持视觉效果,可在不同设备型号上显示为各种不同的形状。
最大屏幕纵横比(为了全面屏适配)
以 Android 7.1(API 级别 25)或更低版本为目标平台的应用默认的最大屏幕纵横比为 1.86。针对 Android 8.0 或更高版本的应用没有默认的最大纵横比。如果您的应用需要设置最大纵横比,请使用定义您的操作组件的清单文件中的 maxAspectRatio 属性。
权限
1、Android 8.0 引入了多个与电话有关的新权限:
- ANSWER_PHONE_CALLS 允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可以使用 acceptRingingCall() 函数。
- READ_PHONE_NUMBERS 权限允许您的应用读取设备中存储的电话号码。
2、在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。
对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。
例如,假设某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。应用请求 READ_EXTERNAL_STORAGE,并且用户授予了该权限。如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。如果该应用针对的是 Android 8.0,则系统此时仅会授予 READ_EXTERNAL_STORAGE;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE,则系统会立即授予该权限,而不会提示用户。
语言区域和国际化
Android 7.0(API 级别 24)引入能指定默认类别语言区域的概念,但是某些 API 在本应使用默认 DISPLAY 类别语言区域时,仍然使用不带参数的通用 Locale.getDefault() 函数。现在,在 Android 8.0 中,以下函数使用 Locale.getDefault(Category.DISPLAY) 来代替 Locale.getDefault():
允许安装未知来源应用
针对 8.0 的应用需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限,否则将无法进行应用内升级。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
通知
通知渠道:Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。
Android 9.0(targetSdkVersion =28)
这里简单讲一下主要API变更,具体的请阅读上面的链接。
显示屏缺口支持(刘海屏适配)
Android 9 支持最新的全面屏,其中包含为摄像头和扬声器预留空间的屏幕缺口。 通过 DisplayCutout 类可确定非功能区域的位置和形状,这些区域不应显示内容。 要确定这些屏幕缺口区域是否存在及其位置,请使用 getDisplayCutout() 函数。
利用 Wi-Fi RTT 进行室内定位
Android 9 添加了对 IEEE 802.11mc Wi-Fi 协议(也称为 Wi-Fi Round-Trip-Time(RTT))的平台支持,从而让您的应用可以利用室内定位功能。
Crypto provider去掉了
已知影响的主要是AES加密,网上的一些没有添加对28版本号判断的工具类都是不可行的。建议换成官网的。
参考资料:https://blog.csdn.net/drkcore/article/details/69931654
Http网络请求
Google表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。
在Android P系统的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。
有以下三种解决方案
- APP改用https请求
- targetSdkVersion 降到27以下
- 在 res 下新增一个 xml 目录,然后创建一个名为:network_security_config.xml 文件(名字自定) ,内容如下,大概意思就是允许开启http请求
<?xml version="1.0" encoding="utf-8"?> <!-- 适配Android9.0 --> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
然后在APP的AndroidManifest.xml文件下的application标签增加以下属性:
android:networkSecurityConfig="@xml/network_security_config"
参考资料:http://www.cnblogs.com/renhui/p/9921790.html
https://developer.android.google.cn/training/articles/security-config
通知
提升短信体验
渠道设置、广播和请勿打扰
多摄像头支持和摄像头更新
在运行 Android 9 的设备上,您可以通过两个或更多物理摄像头来同时访问多个视频流。] 在配备双前置摄像头或双后置摄像头的设备上,您可以创建只配备单摄像头的设备所不可能实现的创新功能,例如无缝缩放、背景虚化和立体成像。 通过该 API,您还可以调用逻辑或融合的摄像头视频流,该视频流可在两个或更多摄像头之间自动切换。
动画
Android 9 引入了 AnimatedImageDrawable 类,用于绘制和显示 GIF 和 WebP 动画图像。 AnimatedImageDrawable 的工作方式与 AnimatedVectorDrawable 的相似之处在于,都是渲染线程驱动 AnimatedImageDrawable 的动画。 渲染线程还使用工作线程进行解码,因此,解码不会干扰渲染线程的其他操作。 这种实现机制允许您的应用在显示动画图像时,无需管理其更新,也不会干扰应用界面线程上的其他事件。