伴随着众多新特性和新功能,Android6.0(API level 23)在系统和API上都有着诸多的改变。本文着重介绍几个关键变化,以帮助你理解这些改变对你的APP产生的影响。

一、运行时权限检查(Runtime Permisssions)
    此次发布引入了一个新的权限管理模型,使得用户能够在运行时控制应用的权限。这个模型一方面提高了用户在权限控制的可视化程度和管理粒度,另一方面也改善了应用安装和自动更新的流程。用户能够对已安装的应用的各个权限进行独立的授权(grant)和禁用(revoke)。
     作为开发者,当你的app的目标版本(target)为Android6.0(API 23)或更高时,请确保在运行时进行权限的检查和请求。其中,新的方法checkSelfPermission()可以用来判断你的应用是否被授予了权限,而requestPermissions()可请求权限。即使你app的目标版本在android6.0以下,也应该在新的权限管理模型下测试你的应用。
让你的应用支持新的权限管理模型,以及获得更多的官方提示,可查看Working with System Permissionss(https://developer.android.com/training/permissions/index.html)和 Permissions Best Practices(https://developer.android.com/training/permissions/best-practices.html#testing)

二、休眠和应用待机模式(Doze and App Standby)

    此次发布引入了新的省电优化方案,在设备和应用空闲时起作用。此特性影响所有的应用,请确保做好相应的测试。

    休眠模式(Doze): 手机在没有外接电源且放置至屏幕关闭一段时间后,设备将进入休眠模式,它将使系统进入睡眠状态(sleep state)。在此模式下,设备周期性的短暂恢复正常操作,以使应用可以同步,系统执行一些必要操作

    应用待机模式(App Standby):在用户没有使用某应用的情况下,此模式允许系统判定此应用进入空闲状态。系统的判定依据则是用户在一定的时间内没有再点击此应用(译注:主要还是依据前台进程判定)。如果此时设备也没有连接充电器,系统将禁用该应用的网络连接、同步及任务调度

  了解更多关于省电方面的变化,可查看Optimizing for Doze and App Standby(Optimizing for Doze and App Standby)


三、移除Appache的HTTP Client(Apache HTTP Client Removal)

  Android6.0版本移除了对Appache的HTTP client的支持。如果你的app的目标版本是Android2.3(API level 9)或者更高,请使用HttpURLConnection类进行替换。此类采用了透明压缩(transparent compression)和响应缓存(response caching),最小化电量消耗。如果你希望继续使用Appache Http API,请修改你的build.gradle文件,增加如下:

android {
    useLibrary 'org.apache.http.legacy'
}

四、BoringSSL
  Android正在将OpenSSL库替换为BoringSSL库。这将影响你的应用在NDK中所链接的加密库,比如libcrypto.so和libssl.so,它们不是NDK API的一部分。这些库不是公开的API,因此在不同版本和设备上的变化也不会及时通知开发者。而且,这也将暴露你应用的安全缺陷。因此,需要修改你的native代码,通过JNI的方式调用Java的加密API或者静态链接你选择的加密库

五、获取硬件标识符(Access to Hardware Identifier)
  在此版本中,为了更好的保护用户的数据,Android移除了从代码中通过Wi-Fi和蓝牙的API访问设备本地网络标识符。因此WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()将始终返回02:00:00:00:00:00
  而为了能够通过Wi-Fi和蓝牙扫描时,获取周边设备的硬件标识符,应用必须具有ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION权限:
WifiManager.getScanResults()
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()
注意:当运行Android6.0(API level 23)的设备启动后台Wi-Fi或蓝牙扫描时, 此操作对外部设备是可见的,且被显示为一个随机MAC的地址

六、通知(Notifications)
  此版本移除了Notification.setLatestEventInfo()方法。用Notification.Builder类来构造通知,在需要反复更新通知的情况下,保存并重用Notification.Builder的实例;在获取更新后的Notification实例时,调用其build()方法
  adb shell dumpsys notification命令不再输出你的通知文本,而adb shell dumpsys notification --noredact命令将输出一个notification对象的文本

七、AudioManager Changes
  此版本不再支持通过AudioManager类来直接对特定的音频流设置音量和静音,因此:
  setStreamSolo()方法过时(deprecated),替换调用requestAudioFocus()方法
  setStreamMute()方法过时,替换调用为adjustStreamVolume()方法,传入的值也变为ADJUST_MUTE 或 ADJUST_UNMUTE

八、文本选择(Text Selection)
    用户在应用中选择文字后,你现在可以显示一个浮动工具栏(floating toolbar),展示并进行剪切、拷贝、粘贴操作,交互过程的实现和contextual action bar的实现一样( Enabling the contextual action mode for individual views)
  实现选择文字后的浮动工具栏,在app代码中需要做如下修改:
  (1)在View 或 Activity对象,ActionMode的调用从startActionMode(Callback) 变为 startActionMode(Callback, ActionMode.TYPE_FLOATING)
 (2)替换原有的ActionMode.Callback为ActionMode.Callback2
 (3)重写OnGetContentRect()方法,提供内容Rect对象(文本选择的矩形框)在view中的位置
 (4)在矩形框作为唯一的元素不再有效时,调用invalidateContentRect() 方法
    如果你在使用Android Support Library revision 22.2,需要注意浮动工具栏不向后兼容且因为appcompat默认接管ActionMode对象,阻止了浮动工具栏被显示。为了在AppCompatActivity中支持ActionMode,需要调用getDelegate()方法,之后对返回的AppCompatDelegate对象调用setHandleNativeActionModesEnabled()方法,并设置输入参数为false,该调用将ActionMode对象的控制交还给系统框架层。在Android6.0(API level 23)的设备上,框架层支持ActionBar或浮动工具栏模式,在Android 5.1(API level 22)及以下的设备上,只支持ActionBar模式。

九、浏览器书签变化(Browser Bookmark Changes)

  此版本移除了全局书签的支持。android.provider.Browser.getAllBookmarks() 和 android.provider.Browser.saveBookmark()方法被移除,同样的READ_HISTORY_BOOKMARKS和WRITE_HISTORY_BOOKMARKS权限也被移除。如果你app的目标版本是android6.0或更高,请不要访问全局的provider获取书签,而是应该在应用的内部保存书签数据。

原文链接:Android6.0 changes

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐