Android 6.0的变化 (上)

随着一系列新的特性以及功能, Android 6.0 (API level 23)包含了很多的系统变化以及API行为的变化。本文着重介绍了一些你应该理解的和占用APP中重要部分的变化。

如果你之前已经在Android平台发布过APP,要知道这些平台上的变化将会影响你的APP。

目录

运行时权限

这个版本引入了一个新的权限模型,使得用户现在可以在运行时直接管理APP权限。这个模型改善了用户对权限管理的可见度和管理程度,并简化了APP开发者对安装和自动升级的流程。用户可以对已安装的APP的权限分别进行授权和取消。

当你的APP的目标版本在Android 6.0 (API level 23)或者更高的时候, 请确保在运行时检查并申请权限。要确定你的APP是否被授予了某权限,可以通过调用新的checkSelfPermission()方法。为了去申请一个权限,可以通过调用 requestPermissions() 新方法。即使你的APP目标版本不是 Android 6.0 (API level 23),你也应该在新的权限模型下进行测试。

想要了解更多的在你的APP里支持新的权限模型的细节,可见 Working with System Permissions。获得更多的评估对你的APP的影响的提示,可见Permissions Best Practices。

危险权限和普通权限见下链接
点击打开链接

休眠和应用待机模式

这个版本将为空闲的设备和APP引入新的节能方式。这些新功能将会影响所有的APP,所以请确保你的APP在新的模式下进行测试。

休眠:如果用户拔出一个设备并将其屏幕关闭闲置一段时间,设备将会进入休眠模式,尝试使系统进入睡眠状态。在这个模式下,设备周期性的恢复短暂时间的正常操作使得APP可以进行同步,使得系统可以进行一些待执行的操作。

APP待机:APP待机允许系统判定一个APP是处于待机状态当这个APP没有被用户显式的使用。系统在用户一段时间内并没有触摸这个APP时做出这个决定。如果设备没有连接充电器,系统将会禁止访问网络并暂停APP的同步以及相应的工作当他被认为是闲置的时候。

学习更多的有关节能方面的改变,详见Optimizing for Doze and App Standby。

移除Apache的 HTTP Client

Android 6.0 的版本移除了对 Apache HTTP client的支持.如果你的APP正在使用这个client并且目标版本在Android 2.3 (API level 9)或者更高,请使用HttpURLConnection类来替代。这个API是更加高效的,因为他采用了透明压缩和响应缓存来减少网络使用,减少电能消耗。如果仍然想继续使用Apache HTTP APIs,你必须一开始就在你的build.gradle文件里定义以下编译时依赖。

1
2
3
android {
useLibrary 'org.apache.http.legacy'
}

BoringSSL

Android正在将OpenSSL替换为BoringSSL库。如果你的APP使用的是 Android NDK,请不要使用那些不属于NDK API里的库,比如:libcrypto.so 和 libssl.so.这些库不是公开的API,他们的修改和禁用也不会通过文件和设备通知开发者。另外,这样可能还会暴露你APP的安全漏洞。取而代之的是你需要修改你的native代码,通过JNI来调用Java cryptography APIs或者静态连接到你选择的加密库。

获取硬件标识符

从这个版本开始,为了给用户提供更好点数据保护,Android删除了通过编程方式从Wi-Fi 和 Bluetooth APIs来获得硬件本地标识符的方法。现在 WifiInfo.getMacAddress() 和 BluetoothAdapter.getAddress()方法将始终返回一个常量值02:00:00:00:00:00。

为了通过蓝牙或WiFi扫描获取附近的设备的硬件标识符,你的APP必须拥有ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION权限。

1
2
3
WifiManager.getScanResults()
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()

注意:当一个运行Android 6.0 (API level 23)的设备启动WiFi或者蓝牙扫描时,这个操作对外部设备是可见的,并会被初始化一个随机的mac地址。

通知

这个版本删除了 Notification.setLatestEventInfo()方法。使用Notification.Builder来取代它进行构造通知。为了反复更新一个通知,可以重用 Notification.Builder 实例,调用 build() 方法来更新通知实例。

adb shell dumpsys notification命令不在打印你的通知文本。使用adb shell dumpsys notification –noredact命令来取代它打印你的通知对象文本。

AudioManager 改变

不再支持通过 AudioManager类来对某个音频流进行精确的调音或者静音设置。 setStreamSolo()方法已经被弃用了,你应该使用 requestAudioFocus() 方法来替代它。同样的setStreamMute()方法也被弃用了,调用 adjustStreamVolume() 方法来替代它,传入的参数变为ADJUST_MUTE 或 ADJUST_UNMUTE 。

文本选择

当用户在你的APP上选择文本时,你现在可以在浮动工具栏里显示一些文本选择动作比如剪切,复制,和粘贴。和用户的交互界面类似于上下文动作菜单,就像为单独的视图配置的上下文菜单。

为了实现文本选择的浮动工具栏,需要在你已有的APP里做出以下改变:

1.在你的view里或者activity里,改变你的 ActionMode 的获取方法,由startActionMode(Callback)变为 startActionMode(Callback, ActionMode.TYPE_FLOATING).

2.将你已经实现了ActionMode.Callback变为继承自ActionMode.Callback2。

3.重写 onGetContentRect()方法来提供视图中内容选中框(比如文本选中框)的坐标。

4.在矩形框作为一个唯一的元素不再有效时,调用 invalidateContentRect() 方法。

如果你在使用 Android Support Library revision 22.2, 你要知道浮动工具栏并不向后支持并且APP兼容会默认控制 ActionMode。这会阻止悬浮工具栏的显示。为了实现在 AppCompatActivity 里对 ActionMode的支持,调用 getDelegate()方法,并用其得到的 AppCompatDelegate 对象调用setHandleNativeActionModesEnabled()并将传入参数设为false。这个调用返回 ActionMode的控制给框架。在设备运行Android 6.0 (API level 23),这允许框架去支持 ActionBar 或者浮动工具栏模式,而当设备运行早Android 5.1 (API level 22)或更低的版本上时,只有 ActionBar 模式被支持。

Share