Android 5.0(API 21)
1. Android Runtime(ART)。
2. 声音和振动:如果您当前使用 Ringtone、MediaPlayer 或 Vibrator 类向通知中添加声音和振动,则移除此代码,以便系统可以在“优先”模式中正确显示通知。取而代之的是,使用 Notification.Builder 方法添加声音和振动。
将设备设为 RINGER_MODE_SILENT 可使设备进入新的优先模式。如果您将设备设为 RINGER_MODE_NORMAL 或 RINGER_MODE_VIBRATE,则设备将退出优先模式。
以前,Android 使用 STREAM_MUSIC 作为主流式传输来控制平板电脑设备上的音量。在 Android 5.0 中,手机和平板电脑设备的主音量流式传输现已合并,由 STREAM_RING 或 STREAM_NOTIFICATION 进行控制。
3. 锁定屏幕可见性:默认情况下,在 Android 5.0 中,通知现在显示在用户的锁定屏幕上。用户可以选择保护敏感信息不被公开,在此情况下,系统会自动删减通知显示的文本。要自定义此删减的通知,请使用 setPublicVersion()。如果通知不包含个人信息,或者您想允许媒体播放控件显示在通知上,则调用 setVisibility() 方法并将通知的可见性级别设为 VISIBILITY_PUBLIC。
4. getRecentTasks():为提升用户隐私的安全性,现已弃用 ActivityManager.getRecentTasks() 方法。对于向后兼容性,此方法仍会返回它的一小部分数据,包括调用应用自己的任务和可能的一些其他非敏感任务(如首页)。如果您的应用使用此方法检索它自己的任务,则改用 getAppTasks() 检索该信息。
5. 绑定到服务:Context.bindService() 方法现在需要显式 Intent,如果提供隐式 intent,将引发异常。为确保应用的安全性,请使用显式 intent 启动或绑定 Service,且不要为服务声明 intent 过滤器。
6. webview:如果您的应用是面向 API 级别 21 或更高级别:默认情况下,系统会阻止混合内容和第三方 Cookie。要允许混合内容和第三方 Cookie,请分别使用 setMixedContentMode() 和 setAcceptThirdPartyCookies() 方法。
Android 6.0(API 23)
1. 权限分组:Android系统6.x 的权限分为危险权限(不涉及危险性信息泄露)和普通权限(涉及用户私人信息),危险权限不仅仅要在清单文件中添加申请,还需要动态添加授权申请。危险权限是分组(9组)的,当组内的一个权限被授予可以执行则其他权限皆可执行。
2.运行时权限:对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的 requestPermissions() 方法。
注意:Fragment中onRequestPermissionsResult(请求权限回调)是失效的,需要移到Fragment所依附的Activity中处理。
3. 取消支持Apache HTTP客户端:Android 6.0 版移除了对 Apache HTTP 客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别 9)或更高版本为目标平台,请改用 HttpURLConnection 类。此 API 效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。要继续使用 Apache HTTP API,您必须先在 build.gradle 文件中声明以下编译时依赖项:
android {
useLibrary 'org.apache.http.legacy'
}
4. BoringSSL:Android 正在从使用 OpenSSL 库转向使用 BoringSSL 库。如果您要在应用中使用 Android NDK,请勿链接到并非 NDK API 组成部分的加密库,如 libcrypto.so 和 libssl.so。这些库并非公共 API,可能会在不同版本和设备上毫无征兆地发生变化或出现故障。此外,您还可能让自己暴露在安全漏洞的风险之下。请改为修改原生代码,以通过 JNI 调用 Java 加密 API,或静态链接到您选择的加密库。
5. 通知:移除了Notification.setLatestEventInfo()方法。改用 Notification.Builder 类来构建通知。要重复更新通知,请重复使用 Notification.Builder 实例。调用 build() 方法可获取更新后的 Notification 实例。
6. 音频管理器变更:不再支持通过 AudioManager 类直接设置音量或将特定音频流静音。setStreamSolo() 方法已弃用,您应该改为调用 requestAudioFocus() 方法。类似地,setStreamMute() 方法也已弃用,请改为调用 adjustStreamVolume() 方法并传入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE。
7. 相机服务变更:在此版本中,相机服务中共享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式。对服务行为的变更包括:
Android 7.0(API 24)
1. 电池和内存:Android 7.0 包括旨在延长设备电池寿命和减少 RAM 使用的系统行为变更。这些变更可能会影响您的应用访问系统资源,以及您的应用通过特定隐式 intent 与其他应用交互的方式。
2. 后台优化
Android 7.0 移除了三项隐式广播,以帮助优化内存使用和电量消耗。此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显著提升设备性能和用户体验。
移动设备会经历频繁的连接变更,例如在 WLAN 和移动数据之间切换时。目前,可以通过在应用清单中注册一个接收器来侦听隐式 CONNECTIVITY_ACTION 广播,让应用能够监控这些变更。由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。
同理,在之前版本的 Android 中,应用可以注册接收来自其他应用(例如相机)的隐式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 广播。当用户使用相机应用拍摄照片时,这些应用即会被唤醒以处理广播。
为缓解这些问题,Android 7.0 应用了以下优化措施:
面向 Android 7.0 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清单条目来请求接受这些事件的通知。在前台运行的应用如果使用 BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。
应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是面向 Android 7.0 的应用。
如果您的应用使用任何 intent,您仍需要尽快移除它们的依赖关系,以正确适配 Android 7.0 设备。Android 框架提供多个解决方案来缓解对这些隐式广播的需求。例如,JobScheduler API 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。您甚至可以使用 JobScheduler 来适应内容提供程序变化。
3. 系统权限更改
为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问 (0700)。此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。此权限更改有多重副作用:
4. 在应用间共享文件:对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。
5. 屏幕缩放:Android 7.0 支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度 sw320dp,该宽度是 Nexus 4 的宽度,也是常规中等大小手机的宽度。
当设备密度发生更改时,系统会以如下方式通知正在运行的应用:
如果是面向 API 级别 23 或更低版本系统的应用,系统会自动终止其所有后台进程。这意味着如果用户切换离开此类应用,转而打开 Settings 屏幕并更改 Display size 设置,则系统会像处理内存不足的情况一样终止该应用。如果应用具有任何前台进程,则系统会如处理运行时更改中所述将配置变更通知给这些进程,就像对待设备屏幕方向变更一样。
避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用与密度无关像素 (dp) 单位指定尺寸。
7. 检查你的应用是否使用私有库
如果您的应用面向 API 级别 23 或更低级别,并在运行 Android 7.0 的设备上尝试访问私有库,您可能会看到一个类似于下面所示的警告(这个 logcat 警告通知您哪个库正在尝试访问私有平台 API,但不会导致您的应用崩溃。):
03-21 17:07:51.502 31234 31234 W linker :
library "libandroid_runtime.so"("/system/lib/libandroid_runtime.so")
needed or dlopened by "/data/app/com.popular-app.android-2/lib/arm/libapplib.so"
is not accessible for the namespace "classloader-namespace"
- the access is temporarily granted as a workaround for http://b/26394120
但是,如果应用面向 API 级别 24 或更高级别,logcat 会生成以下运行时错误,您的应用可能会崩溃:
java.lang.UnsatisfiedLinkError: dlopen failed:
library "libcutils.so"("/system/lib/libcutils.so")
needed or dlopened by"/system/lib/libnativeloader.so"
is not accessible for the namespace "classloader-namespace"
at java.lang.Runtime.loadLibrary0(Runtime.java:977)
at java.lang.System.loadLibrary(System.java:1602)
Android 8.0(API 26)
1.TensorFlow Lite
TensorFlow Lite是谷歌机器学习工具TensorFlow的精简版,新工具可帮助低功耗设备跟上当今高强度任务处理,利用新的神经网络API帮助底层芯片加速数据处理。这一功能有助于为下一代在线设备提高语音处理,视觉搜索,增强现实等能力。随着移动设备制造商越来越多地在其ROM中加入各种AI功能,对应的,像高通这样的芯片制造商已经开始为其产品增加芯片上机器学习功能,因此TensorFlow Lite来得正是时候。
TensorFlow Lite可以解读为谷歌将人工智能应用在应用程序中的尝试,并进一步将机器学习的优势扩展到Android生态系统。
2.画中画
Android O 现已支持 Activity 的画中画模式,为用户带来不同应用程序间的流畅操作体验。PIP 是一种多窗口显示模式,多用于视频播放,支持将电影屏幕缩小成悬浮窗口,看视频的同时玩微信等。这一功能的唤醒只需要点击Home键按钮,如果想结束这一模式,可以将小窗口滑下来以终止。
1> 关于生命周期:PIP 模式不会改变 Activity 的生命周期。在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。当一个 Activity 处于 PIP 模式时,其实它是出在暂停状态,但其内容会继续展示。
2> API变更:在 Android O 中新增 PictureInPictureArgs 对象来指明你的 Activity 在 PIP 模式中的属性,比如长宽比等。
3> Android O 还新增了以下方法来支持 PIP。
3.通知渠道 — Notification Channels
通知渠道是由应用自行定义的通知内容类别,借助渠道,开发者可以让用户对不同种类的通知进行精细控制,用户可以单独拦截或更改每个渠道的行为,而不是统一管理应用的所有通知。
创建通知渠道的步骤:
4.安装未知来源apk:在Android8.0之前的系统中,用户要从除官方应用商店之外的来源安装App时,需要打开系统设置当中的”允许未知来源”安装应用程序的选项,在最新的Android O当中谷歌已经删除了该永久授权的选项,从系统设置当中已经找不到该开关。谷歌将永久授权修改为每次的单独授权,当用户每次安装第三方来源的android软件时需要对软件权限进行手动确认。 可做如下适配:
Uri packageURI = Uri.parse("package:"+mContext.getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI);
startActivityForResult(intent, INSTALL_PERMISS_CODE);
5.后台执行限制:Android O 为提高电池寿命而引入的变更,当您的应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。 主要会限制应用的广播、后台运行和位置,但应用的整体进程并没有被杀掉。
Fused Location Provider (FLP)
Geofencing
GNSS Measurements
Location Manager
7.智能文本选择(Smart Text Selection)
在过去,你想要获取一个地址并导航到那个地方是需要很多步骤,首先是收到这些信息,然后选取文本、复制、打开地图、粘贴进去,然后开始导航。Android O提供了智能文本选择(Smart Text Selection),是使用谷歌的机器学习来检测何时选择地址或电话号码,然后自动将其应用于相应的应用程序的功能。如果你点击朋友发送给你的餐厅的地址,Google将会了解你想要的内容,并自动使用地图启动路线。电话号码,电子邮件地址等也可以这样做。
8.自动填写(Auto-Fill)
对于用户设备上最常用的应用,Android O将会帮助用户进行快速登录,而不用每次都填写账户名和密码。例如当用户使用一个新设备时,可以从Chrome中提取已经保存的账户名和密码,选择之后,自动填充功能便可以在本地进行,适用于你可能用到的大多数应用程序。开发人员也需要对其应用程序进行优化,让其应用程序能够和自动填充功能更好地兼容。
9.引入新权限
Android O 中引入了一项新权限android.permission.ANSWER_PHONE_CALLS,使用此权限,应用可按设定的方式接听拨入的电话。此权限被划分为危险类别,属于 PHONE 权限组。
要在应用中处理拨入的电话,您可以使用 TelecomManager 类中的 acceptRingingCall() 方法。