APP从Android5.1(API22)升级到Android8.1(API27)的简单概述

一、闲聊几句

    换工作了,所以接手了一个13年的老项目,APP的对应版本是API22,这么久不升级我猜测是为了绕过Android6.0的权限问题。嗯,现在各大平台都得强制升级到 Android 8.0或者Android9.0,所以有这篇文章。至于为什么这个APP不直接适配到Android9.0,我也不知道...

    下面升级的都是些简单的概述,给各位做个参考;具体详细的代码啥的,大兄弟们Google吧。

二、升级过程

1.API等级23:Android 6.0 Marshmallow

1.1.运行时权限

用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限。

处理方式:清单文件中注册所需要的权限(Normal和Dangerous),引入三方库RXPermission,并且按需申请Dangerous权限。

1.2.通知栏

此版本移除了 Notification.setLatestEventInfo() 方法。

处理方式:8.0重新设计了通知,一起解决

1.3.AudioManager类

音频管理器变更不再支持通过 AudioManager 类,直接设置音量或将特定音频流静音。setStreamSolo() 方法已弃用,应该改为调用 requestAudioFocus() 方法。类似地,setStreamMute() 方法也已弃用,改为调用 adjustStreamVolume() 方法并传入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE。

2.API等级24:Android 7.0 Nougat、API等级25:Android 7.1 Nougat

2.1.私有目录被限制访问

在Android7.0私有目录被限制访问,禁止向你的应用外公开 file:// URI,否则出现 FileUriExposedException 异常。

处理方式:使用FileProvider发送一项 content:// URI,并授予 URI 临时访问权限。(需要测试所有相册相关,分享图片,应用内升级)

2.2.检查应用是否使用私有库

Android7.0识别加载私有库的问题,logcat 可能会生成一个警告或运行时错误

处理方式:检查是否有UnsatisfiedLinkError

2.3.通知增强功能

Android 7.0 中,重新设计了通知,使其更易于使用并且速度更快。部分变更包括:模板更新,消息传递,样式自定义,捆绑通知,直接回复,自定义视图。

处理方式:8.0重新设计了通知,一起处理

2.4.低电耗模式

处理方式:将应用调整到低电耗模式,测试app暂时没问题

2.5.广播

在 Android 7.0 中,删除了三个常用隐式广播 — CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO

处理方式:应用中用到CONNECTIVITY_ACTION,8.0升级中都改为动态申请广播

2.6.SurfaceView

从 Android 7.0 开始,我们强烈建议您使用 SurfaceView 代替 TextureView,以实现省电

处理方式:涉及的地方较多,且逻辑复杂,未修改。

2.7.新增的表情符号

Android 7.0 引入更多表情符号和表情符号相关功能,包括肤色表情符号和支持变量选择符

处理方式:不使用这些表情

2.8.设置中的流量节省程序

Android 7.0 扩展了 ConnectivityManager,以便为应用检索用户的流量节省程序首选项并监控首选项变更提供一种方式。所有应用均应检查用户是否已启用流量节省程序并努力限制前台和后台流量消耗。

处理方式:暂无影响

2.9.多窗口支持

在运行 Android 7.0 的手机和平板电脑上,用户可以并排运行两个应用,或者处于分屏模式时一个应用位于另一个应用之上。用户可以通过拖动两个应用之间的分隔线来调整应用。

处理方式:使用android:resizeableActivity="false"禁止分屏

2.10.Shortcuts

 Android 7.1可以使用新的快捷方式功能将用户从启动器直接发送到应用中的关键操作。用户只需长按应用程序的启动器图标即可显示应用程序的快捷方式,然后点击快捷方式跳转到相关操作。

处理方式:暂时不做

3.API等级26:Android 8.0 Oreo、API等级27:Android 8.1 Oreo

3.1. 通知栏

Android 8.0 中,已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式。针对 8.0 的应用,创建通知前需要创建渠道,创建通知时需要传入 channelId,否则通知将不会显示。

处理方式:通知按照版本大于等于26的,传入 channelId和channelName.

3.2. 后台执行限制

如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。

处理方式:我们无法得知系统如何判断是否允许应用创建后台服务,所以我们目前只能简单 try-catch startService(),保证应用不会 crash

3.3. 应用内升级

 8.0 的应用需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限,否则将无法进行应用内升级。

处理方式: AndroidManifest.xml 中声明权限

3.4. 透明主题的 Activity 设置屏幕方向

针对 8.0 的应用,设置了透明主题的Activity,再设置屏幕方向,将会抛出异常。

大概意思是:只有不透明的全屏Activity可以自主设置界面方向.

处理方式:android:screenOrientation="behind", behind:与栈内前一个activity方向相同。

3.5. 桌面图标适配

8.0 的应用如果不适配桌面图标将会被添加白色背景。

处理方式:暂不处理

3.6. 隐式广播

由于 Android 8.0 引入了新的广播接收器限制,因此应该移除所有为隐式广播 Intent 注册的广播接收器。将它们留在原位并不会在构建时或运行时令应用失效,但当应用运行在 Android 8.0 上时它们不起任何作用。

处理方式:需要检查应用静态注册的隐式广播,需要改为动态注册。

3.7. 网络连接和 HTTP(S) 连接

处理方式:这点应用一般无需适配.

3.8. View 对象焦点

可点击的 View 对象现在默认也可以成为焦点。如果您希望 View 对象可点击但不可成为焦点,请在包含 View 的布局 XML 文件中将 android:focusable 属性设置为 false,或者将 false 传递至应用界面逻辑中的 setFocusable()。

处理方式:基本无需适配.

3.9. 权限

在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。

对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。

处理方式:权限都为按需申请。

3.10.最大屏幕纵横比

Android 7.1(API 级别 25)或更低版本屏幕纵横比固定为 1.86。而Android 8.0 的应用没有默认的最大纵横比。如果需要设置最大纵横比那么对应设置maxAspectRatio 属性。

处理方式:已设置为2.1

3.11.提供更多Api管理WebView

处理方式:暂时无需处理

三、致谢

    由于洒家水平有限,肯定翻阅并且借鉴了很多文章,就不一一致谢了,可能有些错漏,也欢迎大家吐槽。

你可能感兴趣的:(Android-界面)