从4.4到7.0的经历了三个大版本,中间的行为变更和新增API非常多。不过总体来说,5.0带来了Material Design设计规范, ART虚拟机以及更好的后台运行方式JobScheduler, 6.0引入运行时权限机制和指纹身份验证,7.0提供多窗口支持,JIT/AOT编译以及后台优化。
1. Android 5.x的新特色和行为变更
对于普通用户来说,从5.0开始能够感受到的最大改变就是Material Design了,Material Design是一整套复杂的设计规范,包含了从视觉,动画和交互等内容,为了使开发者更好地实践,Google还提供了support-design library.
<img src="https://i-blog.csdnimg.cn/blog_migrate/b42714767b5ce4a03e23b77f222d9a59.png" data-rawwidth="275" data-rawheight="491" class="content_image" width="275">
![](https://i-blog.csdnimg.cn/blog_migrate/b42714767b5ce4a03e23b77f222d9a59.png)
对于开发者来说,5.0的另外一个重大变更就是ART虚拟机正式取代Dalvik成为Android系统的默认虚拟机。ART相比Dalvik的优势主要在于:
1)预先编译(AOT)
2)改进的垃圾回收机制
3)改进的调试支持
其他的一些改变包括:
1)声音和振动
如果你当前使用Ringtone、MediaPlayer或Vibrator类向通知中添加声音或振动,则移除此代码,以便系统可以在“优先"模式中正确地显示通知。取代它们的是Notification.Builder.
2)锁定屏幕可见性
默认情况下,在Android 5.0中,通知现在显示在用户的锁定屏幕上,用户可以选择保护敏感信息不被公开,在此情况下,系统会自动删除通知显示的文本。要自定义此删除的通知,请使用setPublicVersion().
3)媒体播放
Notification.MediaStyle取代RemoteViews.RemoteView成为新的媒体播放状态或传输控件的通知API,另外,从5.0开始系统将不再将RemoteControlClient对象显示在锁定屏幕上。
4)浮动通知
当设备处于活动状态时,通知可以显示在小型浮动窗口中。
5)getRecentTasks()
Android 5.0中引入新的"并发文档和Activity任务”功能后,为提升用户隐私的安全性,现已弃用ActivityManager.getRecentTasks()方法。
6)Android NDK的64位支持
Android 5.0引入了对64位系统的支持。64位可增加地址空间和提升性能,同时仍然完全支持现有的32位应用。64位支持也可改进用于加密的OpenSSL的性能。
7)绑定服务
Context.bindService()方法现在需要显式Intent,如果提供隐式Intent,将引发异常。
8)多SIM卡支持
Android 5.1添加了对同时使用多个蜂窝运营商SIM卡的支持。可以通过SubscriptionManager类来获取有关当前激活的SIM卡的信息,包括设备是否被认为在当前网络上漫游。
9)弃用的HTTP类
Android 5.1中弃用了org.apache.http类和android.net.http.AndroidHttpClient类,这些类将不再保留,应该尽快将使用这些API的代码修改为使用URLConnection类。不过其实大多数开发者都已经迁移到okhttp了。
10)JobScheduler
在JobScheduler出现之前,我们只能通过AlarmManager定时唤起应用或者监听广播的方式来完成某些工作,这种做法的效率很低,甚至需要保活,对于手机电量的浪费很大。为了优化对于电量的使用,Google推出了JobScheduler,它适用于这样的场景:当你需要在稍后的某个时间点或者当满足某个特定的条件时执行一个任务,例如当设备接通电源或者连接上Wifi时。
不过需要注意的是国内厂商对于JobScheduler做了很多额外的限制,比如setPeriodic()和setPerist()这两个属性在一些国厂手机上的表现就跟预期的不一样。
另外,Google为了防止应用在后台做太多的事情,从7.0开始对于JobScheduler做了更多的限制,比如setPeriodic()就不再是准确地周期性活动,而是跟其他的一些任务合并进行。
2. Android 6.x的新特色和行为变更
1)运行时权限
所谓运行时权限是指用户可直接在运行时管理应用权限。而对于开发者来说,就意味着以API 23及以上为目标平台的应用,必须在运行时检查和请求权限。
我个人觉得这是Android系统从混乱往有序的一个转折点,虽然还有很多流氓应用,但是相比之前已经好很多。
2)低电耗模式和应用待机模式
此版本引入了针对空闲设备和应用的最新节能优化技术。具体如下:
- 低电耗模式:如果用户拔下设备的电源插头,并在屏幕关闭后的一段时间内使其保持不活动状态,设备会进入低电耗模式,在该模式下设备会尝试让系统保持休眠状态。在该模式下,设备会定期短时间内恢复正常工作,以便进行应用同步,还可让系统执行任何挂起的操作
- 应用待机模式:应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态。当用户有一段时间未触摸应用时,系统便会作出此判定。如果拔下了设备电源插头,系统会为其视为空闲的应用停用网络访问以及暂停同步和作业。
3)取消支持Apache HTTP客户端
Android 6.0版移除了对Apache HTTP客户端的支持,转而改用HttpURLConnection类。此API效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。
4)BoringSS
Android正在从使用OpenSSL库转向使用BoringSSL库。如果您要在应用中使用Android NDK,请勿链接到并非NDK API组成部分的加密库,如libcrypto.so和libssl.so,这些库并非公共API,可能会在不同版本和设备上发生变化或出现故障。此外,还可能让你暴露在安全漏洞的风险之下。所以请修改为原生代码,以通过JNI调用Java加密API,或静态链接到您选择的加密库。
5)硬件标识符访问权
为给用户提供更严格的数据保护,此版本开始,对于使用WLAN API和Bluetooth API的应用,Android移除了对设备本地硬件标识符的编程访问权。WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()方法会返回常量02:00:00:00:00:00.
现在,要通过蓝牙和WLAN扫描访问附近外部设备的硬件标识符,必须拥有ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限;
6)通知
此版本移除了Notification.setLatestEventInfo()方法。请改用Notification.Builder类来构建通知。要重复更新通知,请重复使用Notification.Builder实例。调用build()方法可获取更新后的Notification实例。
7)音频管理器变更
不再支持通过AudioManager类直接设置音量或将特定音频流静音。setStreamSolo()方法已弃用,应该修改为requestAudioFocus()方法。类似地,setStreamMute()方法也已弃用,要修改为adjustStreamVolume()方法并传入方向值ADJUST_MUTE或ADJUST_UNMUTE.
8)文本选择
现在,当用户在应用中选择文本时,您可以在一个浮动工具栏中显示“剪切”、"复制”和"粘贴”等文本选择操作。如下图所示:
<img src="https://pic1.zhimg.com/v2-0f8cd9ccf9414e4e5c10df509f4f9c04_b.gif" data-rawwidth="360" data-rawheight="640" data-thumbnail="https://i-blog.csdnimg.cn/blog_migrate/5de093ec105a3939846bbf3d293cd4ac.jpeg" class="content_image" width="360">
![](https://i-blog.csdnimg.cn/blog_migrate/5de093ec105a3939846bbf3d293cd4ac.jpeg)
9)Android密钥库变更
此版本开始,Android Keystore Provider不再支持DSA,但仍然支持ECDSA.
10)相机服务变更
在此版本中,相机服务中共享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式。
11)APK验证
现在执行的APK验证更为严格,如果在清单中声明的文件在APK中并不存在,该APK将被视为已损坏。移除任何内容后必须重新签署APK.
12)指纹身份验证
此版本提供了一些新的API,在受支持的设备上,用户只需扫描其指纹即可完成身份验证,这些API还可与Android Keystore Provider结合使用。
要通过指纹扫描验证用户身份,请获取新FingerprintManager类的实例,并调用authenticate()方法,您的应用必须运行在带有指纹传感器的兼容设备上。
13)确认凭据
您的应用可以根据用户在多久之前最后一次解锁设备来验证其身份。此功能让用户不必费心记忆应用特定密码,您也无需实现自己的身份验证用户界面。您的应用应当利用此功能并结合实现公钥或私钥,以进行用户验证。
14)应用链接
此版本通过提供功能更强大的应用链接,增强了Android的intent系统,您可以利用此功能将应用与您拥有的某个Web域关联。
3. Android 7.x的新特色和行为变更
1)多窗口支持
现在,用户可以一次在屏幕上打开两个应用。如下图所示:
<img src="https://i-blog.csdnimg.cn/blog_migrate/e8abe973f7526b72298b7898b14a4089.png" data-rawwidth="393" data-rawheight="800" class="content_image" width="393">
![](https://i-blog.csdnimg.cn/blog_migrate/e8abe973f7526b72298b7898b14a4089.png)
- 在运行Android 7.0的手机和平板电脑上,用户可以并排运行两个应用,或者处于分屏模式时一个应用位于另一个应用之上。用户可以通过拖动两个应用之间的分隔线来调整应用。
- 在Android TV设备上,应用可以将自身置于画中画模式,从而让它们可以在用户浏览或与其他应用交互时继续显示内容。
2)通知增强功能
通知增强包括以下方面:
- 模板更新:我们正在更新通知模板,新强调了人物形象和化身。开发者将能够充分利用新模板,只需进行少量的代码调整。
- 消息传递样式自定义:您可以自定义更多与您的使用MessagingStyle类的通知相关的用户界面标签。您可以配置消息、会话标题和内容视图。
- 捆绑通知:系统可以将消息组合在一起(如将消息主题)并显示组。用户可以适当地进行拒绝或归档等操作。
- 直接回复:对于实时通信应用,Android系统支持内联回复,以便用户可以直接在通知界面中快速回复短信。
- 自定义视图:两个新的API让您在通知中使用自定义视图时可以充分利用系统装饰元素,如通知标题和操作。
<img src="https://i-blog.csdnimg.cn/blog_migrate/12524d940c7d89e6e091e729da98ffd3.png" data-rawwidth="393" data-rawheight="800" class="content_image" width="393">
![](https://i-blog.csdnimg.cn/blog_migrate/12524d940c7d89e6e091e729da98ffd3.png)
<img src="https://i-blog.csdnimg.cn/blog_migrate/88d36ee78636a35797f62e98e6c9940e.png" data-rawwidth="393" data-rawheight="800" class="content_image" width="393">
![](https://i-blog.csdnimg.cn/blog_migrate/88d36ee78636a35797f62e98e6c9940e.png)
<img src="https://i-blog.csdnimg.cn/blog_migrate/32f9eee7a371d3ff597473be54db1662.png" data-rawwidth="393" data-rawheight="800" class="content_image" width="393">
![](https://i-blog.csdnimg.cn/blog_migrate/32f9eee7a371d3ff597473be54db1662.png)
3)配置文件指导的JIT/AOT编译
在Android 7.0中,我们添加了即时(JIT)编译器,对ART进行代码分析,让它可以在应用运行时持续提升Android应用的性能。JIT编译器对Android运行组件当前的Ahead of Time(AOT)编译器进行了补充,有助于提升运行时性能,节省存储空间,加快应用更新和系统更新速度。
4)快速的应用安装路径
Android 运行组件的JIT编译器最实际的好处之一是应用安装和系统更新的速度。即使在Android 6.0中需要几分钟进行优化和安装的大型应用,现在只需几秒钟就可以完成安装。系统更新也变得更快,因为省去了优化步骤。
5)随时随地低电耗模式
Android 6.0推出了低电耗模式,即设备处于空闲状态时,通过推迟应用的CPU和网络活动以实现省电的系统模式,例如,设备放在桌上或抽屉里时。
现在Android 7.0只要屏幕关闭了一段时间,且设备未插入电源,低电耗模式就会对应用使用熟悉的CPU和网络限制,这意味着用户即使将设备放入口袋也可以省电。
<img src="https://i-blog.csdnimg.cn/blog_migrate/9a06206115154ff79beea4a8e8f3b435.png" data-rawwidth="653" data-rawheight="289" class="origin_image zh-lightbox-thumb" width="653" data-original="https://pic3.zhimg.com/v2-e93fff4441efcab08d099659d2069272_r.png">
![](https://i-blog.csdnimg.cn/blog_migrate/9a06206115154ff79beea4a8e8f3b435.png)
6)Project Svelte:后台优化
前面说过,Android 5.0发布了JobScheduler,它已经成为后台工作的首选方式,其工作方式有利于用户。应用可以在安排作业的同时允许系统基于内存、电源和连接情况进行优化。
另一个非常好的选择是GCMNetworkManager,其在旧版Android中提供类似的作业安排和兼容性。
在Android 7.0中,我们删除了三个常用的隐式广播--CONNECTIVITY_ACTION、ACTION_NEW_PICTURE和ACTION_NEW_VIDEO,因为这些广播可能会一次唤醒多个应用的后台进行,同时会耗尽内存和电池。
7)SurfaceView
Android 7.0可同步移动到SurfaceView类,此类在某些情况下提供的电池性能优于TextureView:在渲染视频或3D内容时,包含滚动和动画视频位置的应用在使用SufaceView时比TextureView耗电更少。
8)流量节省程序
Android 7.0 扩展了 ConnectivityManager,以便为应用检索用户的流量节省程序首选项并监控首选项变更提供一种方式。所有应用均应检查用户是否已启用流量节省程序并努力限制前台和后台流量消耗。
9)VulKan API
Android 7.0将一项新的3D渲染API Vulkan集成到平台中,就像OpenGL ES一样,Vulkan是3D图形和渲染的一项开放标准,由Khronos Group维护。
10)快速设置
“快速设置”通常用于直接从通知栏显示关键设置和操作,非常简单。在 Android 7.0 中,我们已扩展“快速设置”的范围,使其更加有用更方便。
<img src="https://i-blog.csdnimg.cn/blog_migrate/ebbe22ae6824d04de023a17083f014e5.png" data-rawwidth="1126" data-rawheight="1346" class="origin_image zh-lightbox-thumb" width="1126" data-original="https://pic4.zhimg.com/v2-cfaa6ca895709f5a84aa150f8982e6ff_r.png">
![](https://i-blog.csdnimg.cn/blog_migrate/ebbe22ae6824d04de023a17083f014e5.png)
11)号码屏蔽和来电过滤
这个大家都很熟悉了,不多解释。
12)WebView
- Chrome和WebView配合使用
- 多进程
- Javascript在页面加载之前运行
- 不安全起点上的地理定位
- 测试WebView测试版
13)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和传统签名方案来签署您的应用。
14)权限更改
为了提高私有文件的安全性,面向Android 7.0或更高版本的应用私有目录被限制访问(0700).此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。此权限理性有多重副作用:
- 私有文件权限不应再由所有者放宽,为使用MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE而进行的此类尝试将触发SecurityException;
- 传递软件包网域外的file://URI可能给接收器留下无法访问的路径。因此,尝试传递file://URI会触发FileUriExposedException. 分享私有文件内容的推荐方法是使用FileProvider;
- DownloadManager不再按文件名分享私人存储的文件 。
15)屏幕绽放
Android 7.0支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至最小屏幕宽度sw320dp,该宽度是Nexus 4的宽度,也是常规中等大小手机的宽度。
<img src="https://i-blog.csdnimg.cn/blog_migrate/a353d3fac43eeae330ec7117efc821d1.png" data-rawwidth="1406" data-rawheight="872" class="origin_image zh-lightbox-thumb" width="1406" data-original="https://pic3.zhimg.com/v2-99750400f5989f4307cce95ebc27ea8e_r.png">
![](https://i-blog.csdnimg.cn/blog_migrate/a353d3fac43eeae330ec7117efc821d1.png)
<img src="https://i-blog.csdnimg.cn/blog_migrate/a0110c200d891d7a375d2851d250c11a.png" data-rawwidth="1406" data-rawheight="1030" class="origin_image zh-lightbox-thumb" width="1406" data-original="https://pic3.zhimg.com/v2-5c0c229f6db5e313f72fca85d9e747f6_r.png">
![](https://i-blog.csdnimg.cn/blog_migrate/a0110c200d891d7a375d2851d250c11a.png)