Android 各系统版本特性之4.4 到 6.0

832 阅读8分钟

前言

安卓系统版本碎片过于分散,于是边看官网边整理。

KitKat -4.4 -19,20

广告语:最具创新、最美妙和最有用

外部存储空间读取数需要权限

  • 应用需要具有 READ_EXTERNAL_STORAGE 权限,才能在 Android 4.4 上读取外部存储空间上的共享文件
  • getExternalStoragePublicDirectory() 方法也需要权限
  • getExternalFilesDir() 返回应用特有缓存文件目录,无需权限

WebView 更改 chromium

  • WebView 类的底层代码和相关API 已经升级为 Chromium 内核

AlarmManager 的闹铃将不准确

  • 使用 AlarmManager 的 set 或 setRepeating 创建的闹铃将变得不准确
  • 为提高电源效率,Android 整合多个相似时间的闹铃,减少唤醒设备
  • 精确时钟时间,使用新的 setExact 方法

短信提供程序

  • Telephony 短信内容提供程序,提供应用读写设备上短信和彩信
  • 默认短信应用可以接受 SMS_DELIVER_ACTION 广播或 WAP_PUSH_DELIVER_ACTION, 默认短信应用有责任在收到或发送新消息时将消息写入短信提供程序
  • 其他非默认短信应用,可以监听 SMS_RECEIVER_ACTION 广播,进行手机号码验证操作

NFC 读取器模式

  • 使用 enableReaderMode 方法设置为读取器模式,提供一个 NfcAdapter.ReaderCallback 实现进行检测
  • NFC 读取器模式和主机卡模式结合使用,允许实现:一个设备作为支付终端运行(运行读取器模式Activity 设备),另一个作为支付客户端运行(模拟NFC卡的设备)

红外线发射器

  • 附带红外线(IR)发射器的设备,使用 ConsumerIrManager(getSystemService(CONSUMER_IR_SERVICE) 获取) API 发送红外线信号
  • 使用 getCarrierFrequencies 方法查询设备支持的红外线频率,通过 transmit 方法传递所需的频率和信号模式来发射信号
  • 使用 hasIrEmitter 检查设备是否附带红外发射器

多媒体

  • 通过 MediaCodec API 支持自适应视频播放,从而实现在 Surface 上播放

用户界面-沉浸式全屏模式

  • 使用 setSystemUiVisibility 的新标记 SYSTEM_UI_FLAG_IMMERSIVE(结合SYSTEM_UI_FLAG_HIDE_NAVIGATION) ,启用新的沉浸式全屏模式
  • 用户沿系统状态栏下拉,显示系统状态栏,会清除 SYSTEM_UI_FLAG_HIDE_NAVIGATION 标记
  • 出现系统状态栏后再次隐藏,可用 SYSTEM_UI_FLAG_IMMERSIVE_STICKY

用户界面-透明状态栏

  • 使用新主题背景 Theme.Holo.NoActionBar.TranslucentDecor 和 Theme.Holo.Light.NoActionBar.TranslucentDecor 将系统状态栏设置为部分透明
  • 启用透明系统状态栏,布局将填充系统状态栏后面的区域,可以将不被系统状态栏覆盖的布局部分启用 fitsSystemWindow

用户界面- 增强的通知监听器

  • Android 4.3 添加 NotificationListenerService API
  • 4.4 可以检索通知的附加元数据,填写有关通知操作的详细详细,Notification.extras 包含 Bundle,提供EXTRA_TITLE 和 EXTRA_PICTURE

应用权限

INSTALL_SHORTCUT : 允许应用在启动器中安装快捷键
UNINSTALL_SHORTCUT : 允许应用在启动器中卸载快捷键
TRANSMIT_IR : 允许应用使用设备的红外线发射器(如果可用)

Lollipop -5.0 -21,22

广告语:迄今为止功能最丰富并且最具雄心的版本

核心功能

  • Material Design(三维视图,允许设置 Z 维度实现实时阴影)
  • 性能 -> ART(替换到新的 ART 运行,支持预编译(AOT))
  • 通知改版(抬头通知显示来电通知提醒,用户选中响应或拒绝通知)
  • 重新设计的概览空间(最近使用应用)
  • OpenGl ES 3.1, 添加计算着色器、模具文理等
  • 增强的相机和视频功能,引入全新Camerra Api(允许采集RAW 原始格式,曝光时间、感光度)
  • Chromium WebView 版本更新,可从Google Play 进行更新
  • Android NDK 中的 64 位支持

ART 替代 Dalvik

系统-弃用 getRecentTasks()

  • 弃用 getRecentTasks() 来获取最近任务,改用 getAppTasks 检索自己的任务
  • 新增 android.app.usage API 访问设备上的应用使用历史
需要 "android.permission.PACKAGE_USAGE_STATS" 

绑定到服务只支持显示Intent

  • Context.bindService 方法需要显示 Intent,如果提供隐式intent 将引发异常(不主动设置打开的类,而是设置 Action\Data\Category 让系统筛选)

WebView 更新

  • Android 5.0 引入 PermissionRequest 类,通过 getUserMedia 等网络API 授予 WebView 访问相机和麦克风之类受保护的权限
  • 借助新的 onShowFileChooser 方法,可以在 WebView 使用输入表单字段,然后启用文件选择器从 Android 设备选择图像和文件

屏幕采集和共享

  • 引入新的 android.media.projection API,让应用添加屏幕采集和屏幕共享给你
  • 采集屏幕之前,需要通过 createScreenCaptureIntent 方法获取的 Intent 启动采集对话框,请求用户授予权限
  • 新增 createVirtualDisplay 方法允许将主屏幕的内容采集到一个 Surface 对象,然后通过网络传输

通知- 锁屏屏幕通知+ 通知原数据

  • Android 5.0 锁屏可以显示通知
  • Notification.Build.setVisibillity 设置通知的可见性级别(PUBLIC- 完整,PRIVATE-图标,SECRET-不显示)

媒体- 新的 Camera api

  • Android 5.0 引入新的 android.hardware.camera2 API 来简化精细照片采集和图像处理
  • 使用 getCameraIdList() 访问可供系统使用的相机设备,使用 openCamera 连接特定设备
  • 开始采集图像,需要创建 CameraCaptureSession 并指定用于发送采集图像的 Surface 对象
  • 使用 CameraCaptureSession 配置进行单张拍摄或多张拍摄
  • 要在采集新的图像得到通知,请实现 CameraCaptureSession.CaptureCallback 监听器,并在系统完成图像采集请求时,执行 onCaptureCompleted, 从 CaptureResult 提供图像采集原数据
  • CameraCharacteristics 检测设备上可用相机功能

媒体- 音频回放控制

  • 新增 MediaController 可开发自己的媒体控制器应用,该类可通过您的应用的 UI 线程,以线程安全方式监控和控制媒体回放
  • 创建控制器指定一个 MediaSession.Token 对象,以便您的应用可与给定 MediaSession 交互,利用 MediaController.TransportControls 通过发送 play、stop、skipToNext、setRating ;注册 MediaController.Callback 对象来监听会话上的元数据和状态变化

媒体- 媒体浏览

  • Android 5.0 引入新增的 android.media.browse API 来让应用浏览其他媒体内容库的功能

存储- 目录选择

  • Android 5.0 扩展存储访问框架,允许用户选择整个目录子树

无线- 多个网络连接

  • 动态连接网络: 创建 ConnectivityManager 服务
  • 使用 NetworkRequest.Build 创建 NetworkRequest对象,指定网络功能
  • 使用 requestNetwork 或 registerNetworkCallback 扫描合适网络

性能优化- 计划排定作业 JobScheduler

  • Android 5.0 新增 JobScheduler API, 用于特定条件下运行已排任务
设备充电时启动
设备连入无限流量网络时启动
设备空闲时启动
特定期限前或最低延迟完成
  • 实例代码
JobInfo uploadTask = new JobInfo.Build(mJobId, mServiceComponent)
    .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
    .build();
JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobscheduler.schedule(uploadTask)

性能优化- 电池检测

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

系统- 测试与辅助工具

  • 新增 executeShellCommand 方法,可以在仪器中执行 shell 命令,允许使用 dumpsys、am、content 和 pm

系统- 多 SIM 卡支持

  • 通过 SubscriptionManager 类获取激活的SIM 信息

Marshmallow-6.0-23

核心功能

  1. 4K显示模式
  2. 引入低电耗模式和应用待机模式

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

  • 低电耗模式:设备未充电且屏幕关闭一段时间,进入低电耗模式
  • 应用待机模式:用户一段时间未触摸应用

指纹身份验证

  • 通过 FingerprintManager 类的 authenticate 方法来扫描指纹验证用户身份
- 需增加权限 android.permission.USER_FINGERPRINT
- 模拟器 Settings -> Security -> Fingerprint 登记新指纹
- 命令行执行模拟指纹触摸: adb -e emu finger touch <finger_id>

可采用存储设备

  • Context 方法
- getFilesDir()
- getCacheDir()
- getDatabasePath()
- getDir()
- getPackageResourcePath()
  • ApplicationInfo 字段
- dataDir
- sourceDir
- nativeLibraryDir
- publicSourceDir
- splitSourceDirs
- splitPublicSourceDirs

通知

  • 新增 Icon 类,同 setSmallIcon 方法和 setLargeIcon 方法附加到通知上
  • 新增 getActiveNotification ,让你应用目前处于活动状态的通知

蓝牙触控笔支持

  • 通过 Activit 中注册 View.OnContextClickListener 对象和 GestureDetector.OnContextClickListener, 监听触控笔按键动作
  • 使用 MotionEvent 监测触控笔,getTooltype() 方法会返回 TOOL_TYPE_STYLUS
  • 触控笔的主按键,getButtonState() 方法返回 BUTTON_STYLUS_PRIMARY;按下辅助按键,则返回 BUTTON_STYLUS_SECONDARY; 同时按下,执行OR运算

运行时权限 *

  • 新的权限模式,新增 checkSelfPermission 方法查看应用是否被授予权限,requestPermissions方法 请求权限

取消支持 Apache Http 客户端

  • Andorid 6.0 移除对 Apache HTTP 客户端的支持
  • 改用HttpUrlConnection ,效率更高,透明压缩和响应缓存减少网络使用,最大限度降低耗电量
  • 继续使用,需要 build.gradle 文件声明编译依赖项
android{
    useLibrary 'org.apahe.http.legacy'
}

硬件标识符访问权

  • Android 6.0, WifiInfo.getMacAddress 方法,和 BluetoothAdapter.getAddress,返回常量值 02:00:00:00:00:00
  • 通过蓝牙和WLAN 扫描附加外部设备硬件标识符,需要拥有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限
WifiManager.getScanResults()
BluetoothScanner.startScan()
  • Android 6.0 设备发起蓝牙或WLAN 扫描,外部设备看了,该操作的发起者来源是随机化的MAC 地址

APK 验证

  • APK 验证更为严格,如果清单声明的文件实际不存在,视为APK已损坏

USB 连接

  • 默认USB 端口连接的设备仅充电模式

View 渲染默认开启硬件加速

  • 来自 View.setAlpha 方法的注释:
Starting with
     * {@link android.os.Build.VERSION_CODES#M}, {@link #LAYER_TYPE_HARDWARE} is automatically
     * applied to the view at the rendering level