Android 各版本特性总结

这里只总结了一些开发相关的重要更新

  • Android 4.4 KitKat (API 19)

    • 权限
      使用Environment.getExternalStorageDirectory();获取外部存储目录时需要设置权限

      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      

      使用Environment.getDataDirectory();获取内部存储目录时则不需要

    • 添加转场动画

      5.0之前启动Activity时使用动画

      startActivity(new Intent(this, Main2Activity.class));  
          overridePendingTransition(R.anim.in,R.anim.out); 
      

      对应的入场

      <?xml version="1.0" encoding="utf-8"?>  
      <set xmlns:android="http://schemas.android.com/apk/res/android">  
      <translate  
          android:toYDelta="0"  
          android:fromYDelta="100%"  
          android:duration="1500"/>  
      </set>  
      

      出场

      <?xml version="1.0" encoding="utf-8"?>  
      <set xmlns:android="http://schemas.android.com/apk/res/android">  
      <translate  
          android:duration="1500"  
          android:fromYDelta="0"  
          android:toYDelta="-100%"/>  
      </set> 
      

      5.0之后Activity出入场动画大体分为两种,一种分解滑动进入,淡入淡出;另一种共享元素动画
      详细介绍参考:
      传送门

    • 添加全屏沉浸模式

    • 添加透明系统UI样式

      全屏沉浸模式/透明系统UI样式

  • Android 5.0 Lollipop (API 21)

    • Material Design 支持

      • Material Design 主题
      • 视图阴影
      • RecyclerView 小部件
      • 可绘制动画和造型效果
      • Material Design 动画和 Activity 转换效果
      • 针对基于视图状态的视图属性的动画生成器
      • 可自定义的 UI 小部件和具有可由您控制的调色板的应用栏
      • 基于 XML 矢量图形的动画和非动画可绘制对象

      具体内容请参阅 Material Design

    • 对 OpenGL ES 3.1 的支持
      Android 5.0 添加了 Java 接口和对 OpenGLES 3.1 的原生支持。OpenGL ES 3.1 中提供的主要新功能包括:

      • 计算着色器
      • 单独的着色器对象
      • 间接绘制命令
      • 多重采样和模具纹理
      • 着色语言改进
      • 高级混合模式和调试专用扩展
      • 向后兼容 OpenGL ES 2.0 和 3.0
    • 多个网络连接
      Android 5.0 提供了新的多网络 API,允许您的应用动态扫描具有特定能力的可用网络,并与它们建立连接。当您的应用需要 SUPL、彩信或运营商计费网络等专业化网络时,或者您想使用特定类型的传输协议发送数据时,就可以使用此功能。

      要从您的应用以动态方式选择并连接网络,请执行以下步骤:

      1. 创建一个 ConnectivityManager。
      2. 使用 NetworkRequest.Builder 类创建一个 NetworkRequest 对象, 并指定您的应用感兴趣的网络功能和传输类型。
      3. 要扫描合适的网络,请调用 requestNetwork() 或 registerNetworkCallback(),并传入 NetworkRequest 对象和 ConnectivityManager.NetworkCallback 的实现。如果您想在检测到合适的网络时主动切换到该网络,请使用 requestNetwork() 方法;如果只是接收已扫描网络的通知而不需要主动切换,请改用 registerNetworkCallback() 方法。

      当系统检测到合适的网络时,它会连接到该网络并调用 onAvailable() 回调。您可以使用回调中的 Network 对象来获取有关网络的更多信息,或者引导通信使用所选网络。

    • 电池使用开发者工具
      新增的 dumpsys batterystats 命令可生成值得关注的设备电池使用情况统计数据,这些数据按唯一身份用户 ID (UID) 加以组织。统计数据包括:

      • 电池相关事件的历史记录
      • 设备的全局统计数据
      • 每个 UID 和系统组件的近似耗电情况
      • 每个应用的每数据包移动 ms
      • 系统 UID 汇总统计数据
      • 应用 UID 汇总统计数据

      可使用 --help 选项来了解各种输出定制选项的相关信息。例如,要打印设备上次充电后某个给定应用软件包的电池使用情况统计信息,请运行以下命令:

      $ adb shell dumpsys batterystats --charged <package-name>

      Battery Historian使用.

    • Android Runtime (ART)
      在 Android 5.0 中,ART 运行时取代 Dalvik 成为平台默认设置
      有关 ART 的部分主要的新功能包括:

      • 预先 (AOT) 编译
      • 改进的垃圾回收 (GC)
      • 改进的调试支持

      ART 简介

    • 计划排定作业
      Android 5.0 新增了一个 JobScheduler API,允许您定义一些系统在稍后或指定条件下(如设备充电时)以异步方式运行的作业,从而优化电池寿命。下列情形下,作业计划排定功能很有用:

      • 应用具有不面向用户并且可以推迟的作业
      • 应用具有您更愿意在设备插入电源时再进行的作业
      • 应用具有一项需要接入网络或连接 WLAN 的任务。
      • 应用具有多项您希望定期以批处理方式运行的任务。

      要查看如何使用JobScheduler API 的示例,请参阅此版本中的 JobSchedulerSample 实现示例

    • 应用使用情况统计信息
      现在可以利用新增的 android.app.usage API 访问 Android 设备上的应用使用历史记录。此 API 提供比已弃用的 getRecentTasks() 方法更为详细的使用信息。要使用此 API,您必须先在清单中声明 "android.permission.PACKAGE_USAGE_STATS" 权限。用户还必须通过 Settings > Security > Apps 为该应用启用访问使用情况的权限。

    • Android NDK 中的 64 位支持

    • WebView 更新增强了稳定性

  • Android 5.1 (API 22)

    • 已弃用的 HTTP 类
      Android 5.1 中新增URLConnection 类代替org.apache.http 类和 android.net.http.AndroidHttpClient 类。
  • Android 6.0 Marshmallow (API 23)

    • 低电耗模式和应用待机模式

    • BoringSSL

    • 硬件标识符访问权

    • 音频管理器变更

    • Android 密钥库不再支持 DSA。但仍支持 ECDSA

    • WLAN 和网络连接变更

    • 相机服务变更

    • APK 验证

    • USB 连接

    • 支持文本选择

    • 运行时请求权限
      此版本引入了一种新的权限模式,户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。

      对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,需要在运行时检查和请求权限。
      新增的权限相关内容:

      • checkSelfPermission()
        要确定应用是否已被授予权限
      • requestPermissions()
        请求权限

      即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。

    • 彻底取消支持 Apache HTTP 客户端
      要继续使用 Apache HTTP API,您必须先在 build.gradle 文件中声明以下编译时依赖项:

       android {
             useLibrary 'org.apache.http.legacy'
       }
      
    • 通知
      此版本移除了 Notification.setLatestEventInfo() 方法。请改用 Notification.Builder 类来构建通知。要重复更新通知,请重复使用 Notification.Builder 实例。调用 build() 方法可获取更新后的 Notification 实例。

  • Android 7.0 Nougat (API 24)

    • 在应用间文件共享权限控制

    • 多窗口支持

    • 通知栏快捷回复

    • 支持VR

    • 画中画

    • App快捷菜单

    • 电池和内存
      低电耗模式

    • 引入JIT编译器

    • APK signature scheme v2
      Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。
      此方案并非强制!

    • OpenGL™ ES 3.2 API
      Android 7.0 添加了框架接口和对 OpenGL ES 3.2 的平台支持

    • SurfaceView
      从 Android 7.0 开始,建议使用 SurfaceView 代替 TextureView,以实现省电。

    • Project Svelte:后台优化
      Android 7.0 移除了三项隐式广播,以帮助优化内存使用和电量消耗。此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显著提升设备性能和用户体验。

    • 权限更改

      • 系统权限更改
        为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问 (0700)。此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。
  • Android 8.0 Oreo (API 26)

    • 画中画模式 PIP

      PIP 是一种多窗口显示模式,多用于视频播放,即你可以一边发微信一边看视频。

      PIP 模式不会改变 Activity 的生命周期。在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。当一个 Activity 处于 PIP 模式时,其实它是出在暂停状态,但其内容会继续展示。

      Activity 可以使用 PIP 模式,请在清单中将 android:supportsPictureInPicture 设置为 true

    • 自适应图标 Adaptive Icons

      • 自适应图标支持多种形状

        通过定义两张图层(前景与背景)你可以制定你的桌面图标外观,你必须提供没有形状和阴影的 PNG 格式图象作为图层。

      • 自适应图标由两张图层和一个形状来定义

        在以前的 Android 版本中,图标大小定义为 48 x 48 dp。现在你必须按照以下的规范定义你的图层大小:

        1. 两张图层大小都必须为 108 x 108 dp。
        2. 图层中心 72 x 72 dp 范围为可视范围。
        3. 系统会保留四周外的 36dp 范围用于生成有趣的视觉效果(如视差和跳动)
      • 创建你的自适应图标

        首先你需要在 Application 标签中加入 Android:icon 属性,定义你的 icon 图标。其次如果你需要创建一个原型的 icon,你还需要加入 Android:roundIcon 属性。
        接下来,你需要 res/mipmap-anydpi/ic_launcher.xml 文件中定义您的图层。在 选项中加入您的前景和背景图

    • 固定快捷方式和小部件 — Pinning shortcuts

      Pinning shortcuts 是一个比 APP shortcuts 更小的快捷方式,放置于桌面上,用于更快速的打开某一 APP 的某单一任务。Pinning shortcuts 在桌面上可呈现不同的图标显示。

      1. 首先使用 isRequestPinShortcutSupported() 方法校验手机是否支持启动这种快捷方式。
      2. 创建 ShortcutInfo 对象。
      3. 用 requestPinShortcut() 方法应用 Pinning shortcuts。你可以通过 PendingIntent 来通知你的 shortcuts 有没有创建成功。
    • 内容刷新请求
      ContentProvider 和 ContentResolver 类均包含 refresh() 函数,这样,客户端可以更轻松地知道所请求的信息是否为最新信息。

    • 最大屏幕纵横比
      以 Android 7.1(API 级别 25)或更低版本为目标平台的应用默认的最大屏幕纵横比为 1.86。针对 Android 8.0 或更高版本的应用没有默认的最大纵横比。如果您的应用需要设置最大纵横比,请使用定义您的操作组件的清单文件中的 maxAspectRatio 属性。

    • JobScheduler 改进
      Android 8.0 引入了对 JobScheduler 的多项改进。由于您通常可以使用计划作业替代现在受限的后台服务或隐式广播接收器,这些改进可以让您的应用更轻松地符合新的后台执行限制

    • findViewById() 签名变更
      现在,findViewById() 函数的全部实例均返回 <T extends View> T,而不是 View。

    • 通知
      重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式

      通知渠道是由应用自行定义的通知内容类别,借助渠道,开发者可以让用户对不同种类的通知进行精细控制,用户可以单独拦截或更改每个渠道的行为,而不是统一管理应用的所有通知。

      创建通知渠道的步骤:

      1. 创建 NotificationChannel 对象,并设置应用内唯一的通知 ID。
      2. 配置通知渠道的属性,比如提示声音等
      3. 在 NotificationManager 中注册通知渠道对象。
    • Background Execution Limits

      • 对Background Service 的限制

        当一个应用程序在前台的时候,可以自由运行Foreground 和Background service。但是当应用程序切换到后台的时候,在开始几分钟所有的services都可以正常使用,过几分钟后,系统将会停止所有的Background service,就好比调用了Service.stopSelf( ) 。

        在Android O之前,创建一个Foreground Service的方式通常是先创建一个Background Service的方式,再通过startForeground()的方式变为前台。

        但是在Android O中,如果应用程序运行在后台,那么静不能查创建Background Service,同时也就不能创建Foreground Service。

        出于这种考虑,Android O引入了一个新的方法:

        NotificationManager.startServiceInForeground()
        

        调用这个方法就相当于startService( )在后台创建一个服务,然后立即调用的服务的startForeground( )方法使其变为Foreground。由于新的服务从未在后台,所以不受后台服务的限制。

      • 对Broadcast 的限制

        • 应用不能够再通过在AndroidManifest中声明广播的时候添加intent-filter来注册广播。

        • 不管intent是显示还是隐式,都可继续使用Context.registerReceiver的方式注册广播。
          具体内容请查看

  • Android 9 Pie (API 28+)

    • 前台服务
      如果应用以 Android 9 或更高版本为目标平台并使用前台服务,则必须请求 FOREGROUND_SERVICE 权限。这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

      如果以 Android 9 或更高版本为目标平台的应用尝试创建前台服务且未请求 FOREGROUND_SERVICE,则系统会抛出 SecurityException。

    • 显示屏缺口支持
      Android 9 支持最新的全面屏,其中包含为摄像头和扬声器预留空间的屏幕缺口。通过 DisplayCutout 类可确定非功能区域的位置和形状,这些区域不应显示内容。要确定这些屏幕缺口区域是否存在及其位置,请使用 getDisplayCutout() 函数。
      全新的窗口布局属性 layoutInDisplayCutoutMode 让您的应用可以为设备屏幕缺口周围的内容进行布局。您可以将此属性设为下列值之一:

      • LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
      • LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
      • LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

      可以按以下方法在任何运行 Android 9 的设备或模拟器上模拟屏幕缺口:

      1. 启用开发者选项。
      2. 在 Developer options 屏幕中,向下滚动至 Drawing 部分并选择 Simulate a display with a cutout。
      3. 选择屏幕缺口的大小。

      注:我们建议您通过使用运行 Android 9 的设备或模拟器测试屏幕缺口周围的内容显示。

    • 适用于可绘制对象和位图的 ImageDecoder
      Android 9 引入了 ImageDecoder 类,可提供现代化的图像解码方法。使用该类取代 BitmapFactory 和 BitmapFactory.Options API。

    • 动画
      Android 9 引入了 AnimatedImageDrawable 类,用于绘制和显示 GIF 和 WebP 动画图像

    • DEX 文件的 ART 提前转换
      在运行 Android 9 或更高版本的设备上,Android 运行时 (ART) 提前编译器通过将应用软件包中的 DEX 文件转换为更紧凑的表示形式,进一步优化了压缩的 Dalvik Executable 格式 (DEX) 文件。此项变更可让您的应用启动更快并消耗更少的磁盘空间和内存。

      这种改进特别有利于磁盘 I/O 速度较慢的低端设备。

    • 对使用非 SDK 接口的限制
      帮助确保应用稳定性和兼容性,此平台对某些非 SDK 函数和字段的使用进行了限制;无论您是直接访问这些函数和字段,还是通过反射或 JNI 访问,这些限制均适用。
      针对非 SDK 接口的限制

    • 渠道设置、广播和请勿打扰

    • 强制执行 FLAG_ACTIVITY_NEW_TASK 要求
      在 Android 9 中,您不能从非 Activity 环境中启动 Activity,除非您传递 Intent 标志 FLAG_ACTIVITY_NEW_TASK。 如果您尝试在不传递此标志的情况下启动 Activity,则该 Activity 不会启动,系统会在日志中输出一则消息。

      注:在 Android 7.0(API 级别 24)之前,标志要求一直是期望的行为并被强制执行。 Android 7.0 中的一个错误会临时阻止实施标志要求。

    • 默认启用网络传输层安全协议 (TLS)
      如果您的应用以 Android 9 或更高版本为目标平台,则 isCleartextTrafficPermitted() 方法默认返回 false。如果您的应用需要针对特定网域启用明文,则您必须在应用的网络安全配置中,针对这些网域明确将 cleartextTrafficPermitted 设置为 true。

    • 视图焦点
      0 面积的视图(即宽度或高度为 0)无法再被聚焦。

      此外,Activity 不会再在轻触模式下隐式分配初始焦点,而是需要由您根据需要显式请求初始焦点。

  • Android 10 Q (API 29)

    • ART 优化
      在 ART 运行时方面的改进可帮助您的应用更快地启动、占用更少的内存并更顺畅地运行,而您无需执行任何操作。借助 Google Play 提供的 ART 配置文件,ART 在应用运行之前就可以预先编译应用组件。在运行时,Android 10 向 ART 的并发复制 (CC) 垃圾回收器添加了分代垃圾回收功能,以节省垃圾回收的时间并提高 CPU 效率,减少卡顿,同时帮助应用在低端设备上更顺畅地运行。

    • 限制非 SDK 接口
      为了帮助确保应用的稳定性和兼容性,Android 平台开始限制应用在 Android 9(API 级别 28)中使用非 SDK 接口。Android 10 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。我们的目标是在限制使用非 SDK 接口之前确保有可用的公开替代方案。

      如果您不打算以 Android 10(API 级别 29)为目标平台,那么其中一些变更可能不会立即对您产生影响。虽然您目前仍然可以使用灰名单中的一些非 SDK 接口(取决于您的应用的目标 API 级别),但如果您使用任何非 SDK 方法或字段,则应用无法运行的风险终归较高。

      如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用,进行确认。如果您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。不过,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API

      要了解详情,请参阅 Android 10 中有关限制非 SDK 接口的更新以及针对非 SDK 接口的限制

    • android.preference 库已弃用
      从 Android 10 开始,将弃用 android.preference 库。开发者应该改为使用 AndroidX preference 库,这是 Android Jetpack 的一部分。(https://developer.android.google.cn/preview?)

    • HTTPS 连接变更

    • TLS 1.3 支持

    • 深色主题
      Android 10 提供深色主题背景,既可应用于 Android 系统界面,也可应用于设备上运行的应用。如需了解完整信息,请参阅深色主题背景

    • 触发基于 Mallinfo 的垃圾回收
      当小型平台 Java 对象引用 C++ 堆中的大型对象时,通常只有在系统已回收并(举例而言)最终确定 Java 对象后,才能回收 C++ 对象。在之前的版本中,平台会估算与 Java 对象相关联的许多 C++ 对象的大小。这种估算并不总是准确,并且偶尔会导致内存使用量大大增加,因为平台无法在应该进行垃圾回收时完成回收。

      在 Android 10 中,垃圾回收器 (GC) 会跟踪系统 malloc() 分配的堆的总大小,以确保 malloc() 分配的大型堆始终包含在可触发 GC 的计算中。因此,与 Java 执行交错大量 C++ 分配的应用可能会出现垃圾回收频率提高的现象。其他应用的频率则可能会略有下降。

  • Android 11 // TODO: ...

具体版本信息请移步这里

End

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容