Android进阶之光-第1章-Android新特性-读书笔记
第 1 章 Android 新特性
1.1 Android 5.0 新特性
1.1.1 Android 5.0 主要新特性
1. 全新的 Material Design 新风格
Material Design 是一种大胆的平面化创新。换句话说,谷歌希望能够让Material Design 给用户带来纸张化的体验。这种新的视觉语言,在基本元素的处理上,借鉴了传统的印刷设计,以及字体版式、网络系统、空间、比例、配色和图像使用等这些基础的平面设计规范。另外,Material Design 还推崇实体隐喻理念,利用实体的表面与边缘的质感打造出视觉线索。让用户感受到真实性。熟悉的触感让用户可以快速地理解并认知。在设计中可以在符合物理规律的基础上灵活地运用物质,打造出不同的使用体验。为了吸引用户的注意力,Material Design 还带来了有意义而且更合理的动态效果,以及维持整个系统的连续性体验。
2. 支持多种设备
Android 系统的身影早已出现在多种设备中。
3. 全新的通知中心设计
谷歌在 Android 5.0 中加入了全新风格的通知系统。改进后的通知系统会优先显示对用户来说比较重要的信息,而将不太紧急的内容隐藏起来。用户只需要向下滑动就可以查看全部的通知内容。
4. 支持 64 位 ART 虚拟机(ART:Android runtime)
Android 5.0 内部的性能上也提升了不少,它放弃了之前一直使用的 Dalvik 虚拟机,改用了 ART 虚拟机,实现了真正的跨平台编译,在 ART、X86、MIPS 等无处不在。
5. Overview
多任务视窗现在有了一个新的名字,Overview 。在界面上,每一个 App 都是一个独立的卡片,拥有立体式的层叠效果,用户可以指定 “最近应用程序”,通过滑动来快速切换 App。
6. 设备识别解锁
Android 5.0 增加了针对特定设备(例如智能手表)识别解锁的模式。当设备没有检测到附近有可用的信任设备时,就会启动安全模式以防止未授权访问。
7. Ok Google 语音指令
只需要说出简单的语言指令,就能操作手机。
8. Face unlock 面部解锁
在 Android 5.0 中,Google 花费大力气优化了面部解锁功能。当用户拿起手机处理锁屏界面上的消息通知时,面部解锁功能便自动被激活。
1.1.2 替换 ListView 和 GridView 的 RecyclerView
有了 ListView、GridView,为什么还需要 RecyclerView 这样的控件呢?从整体上看,RecyclerView 架构提供了一种插拔式的体验,它具有高度的解耦、异常的灵活性和更高的效率,通过设置它提供的不同 LayoutManager、ItemDecoration、ItemAnimator 可实现更加丰富多样的效果。但是 RecyclewView 也有缺点和让人头疼的地方:设置列表的分割线需要自定义,另外列表的点击事件需要自己去实现。
1. 配置 build.gradle
要想使用 RecyclerView,首先要倒入 support-7 包。
2. 使用 RecyclerView
与 ListView 不同的一点就是,需要设置布局管理器用于设置条目的排列样式,可以是垂直排列或者水平排列。
此外,RecyclerView 比 ListView 的设置要复杂一些,主要是它需要自己去自定义分割线,设置动画和布局管理器,等等。
RecyclerView 的 Adapter 最大的改进就是对 ViewHolder 进行了封装定义,只需要自定义一个 ViewHolder 继承 RecyclerView.ViewHolder 就可以了。另外,Adapter 继承了 RecyclerView.Adapter,在 onCreateViewHolder 中加载布局,在 onBindViewHolder 中将视图与数据进行绑定。
3. 设置分割线
可以使用 mRecyclerView.addItemDecoration() 来加入分割线。谷歌目前没有提供默认的分割线,这就需要我们继承 RecyclerView.ItemDecoration 来自定义分割线。
虽然没有默认的分割线,但是好处是:可以更灵活地自定义分割线。
4. 自定义点击事件
列表中条目的点击事件需要自己来定义,这是一个不尽如人意的地方。但是,自定义点击事件也并不是很难。在 Adapter 中定义接口并提供回调。
5. 实现 GridView
只需要自定义横向的分割线。
6. 实现瀑布流
RecyclerView 支持瀑布流,它更稳定、效率更高、自定义能力更强。
实现瀑布流很简单,只要在 Adapter 写一个随机的高度来控制每个 item 的高度就可以了。在 Adapter 的 onBindViewHolder 中设置每个 item 的高度。
1.1.3 卡片 CardView
Android 5.0 版本中新增了 CardView,CardView 继承自 FrameLayout 类,并且可以设置圆角和阴影,使得空间具有立体性,也可以包含其他的布局容器和控件。
1. 配置 build.gradle
如果 SDK 低于 5.0,仍旧要引入 v7 包。在 build.gradle 中引入 support-v7 包。
2. 使用 CardView
CardView 的重要属性:card_view:cardCornerRadius,设置圆角半径:card_view:cardElevation,设置阴影的半径。
初次之外,CardView 还有其他属性:
- CardView_cardBackgroundColor:设置背景色。
- CardView_cardElevation:设置 Z 轴阴影。
- CardView_cardMaxElevation:设置 Z 轴最大高度值。
- CardView_cardUseCompatPadding:是否使用 CompadPadding。
- CardView_cardPreventComerOverlap:是否使用 PreventCornerOverlap。
- CardView_contentPadding;内容的 padding。
- CardView_contentPaddingLeft:内容的左 padding。
- CardView_contentPaddingTop:内容的上 padding。
- CardView_contentPaddingRight:内容的右 padding。
- CardView_contentPaddingBottom:内容的底 padding。
1.1.4 3 种 Notification
Notification 可以让我们在获得消息的时候,在状态栏,锁屏界面来现实相应的信息。
1. 普通 Notification
普通 Notification 的创建。
2. 折叠式 Notification
折叠式 Notification 是一种自定义视图的 Notification,用来显示长文本和一些自定义的布局场景。它的两种状态:一种是普通状态下的视图(如果不是自定义的话,和上面普通 Notification 的视图样式一样),另一种是展开状态下的视图。和普通 Notification 不同的是,需要自定义视图,而这个视图现实的进程和我们创建视图的进程不在一个进程,所以需要使用 RemoteViews。
3. 悬挂式 Notification
悬挂式 Notification 是 Android 5.0 新增加的方式。和前两种显示方式不同的是,前两种需要下拉通知栏才能看到通知;而悬挂式 Notification 不需要下拉通知栏就直接显示出来悬挂在屏幕上方,并且焦点不变,仍在用户操作的界面,因此不会打断用户的操作。其过几秒就会自动消失。和前两种 Notification 不同的是,它需要调用 setFullScreenIntent 来将 Notification 变为悬挂式 Notification 。
4. Notification 的显示等级
Android 5.0 加入了一种新的模式 Notification 的显示等级,共有以下 3 种。
- VISIBILITY_PUBLIC:任何情况都会显示通知。
- VISIBILITY_PRIVATE:只有在没有锁屏时会显示通知。
- VISIBILITY_SECRET:在 pin、password 等安全锁和没有锁屏的情况下才能显示通知。
设置非常简单,只要调用 setVisibility 方法就可以了。
1.1.5 Toolbar 与 Palette
Toolbar 是应用内容的标准工具栏,可以说是 Actionbar 的升级版。这两者不是独立关系,要使用 Toolbar,还是得跟 Actionbar 有关系的。相比于 Actionbar,Toolbar 最明显的一点就是变得很自由,可随处放置,其具体使用方法和 Actionbar 很类似。
1. 引入 Toolbar
引入 v7 支持包。
为了显示 Toolbar 控件,先要在 style 里把 Actionbar 去掉。
2. 自定义 Toolbar
可以设置 Toolbar 的标题和图标以及 Menu Item 等属性。Menu Item 的设置和 Actionbar 类似。
3. 添加 DrawerLayout 实现侧滑
使用 DrawerLayout 实现侧滑。
4. Palette 的应用
Android 5.x 用 Palette 来提取颜色,从而让主题能够动态适应当前界面的色调,做到整个 App 颜色的基调和谐统一。Android 内置了几种提取色调的种类:
- Vibrant (充满活力的)
- Vibrant dark (充满活力的黑)
- Vibrant light (充满活力的亮)
- Muted (柔和的)
- Muted dark (柔和的黑)
- Muted light (柔和的亮)
要使用 Palette ,需要引用 ‘com.android.support:palette-v7:23.0.1’。这在之前已经配置过了,实现提取颜色非常容易,只要将 bitmap 传递给 Palette,调用 generate 即可。在 onGenerated 回调中得到图片的色调。
1.2 Android 6.0 新特性
6.0 新系统的整体设计风格依然保持扁平化的 Material Design 风格。Android 6.0 在对软件体验与运行性能上进行了大幅度的优化。据测试,Android 6.0 可使设备续航时间提升 30%。
1.2.1 Android 6.0 主要新特性概述
1. 应用权限管理
在 Android 6.0 中,应用许可提示可以自定义了。它允许对应用的权限进行高度管理,比如应用能否使用位置、相机、网络和通信录等,这些都开放给开发者和用户。此前的 Android 系统的应用权限管理只能靠第三方应用来实现,在 Android 6.0 中应用权限管理成为系统级的功能。
2. Android Pay
Android Pay 是 Android 支付统一标准。Android 6.0 系统中集成了 Android Pay,其特性在于简洁、安全和可选性。它是一个开放性平台,用户可以选择谷歌的服务或者使用银行的 App 来使用它。Android Pay 支持 Android 4.4 以后的系统设备并且可以使用指纹来进行支付。
3. 指纹支持
虽然很多厂商的 Android 手机实现了指纹的支持,但是这些手机都使用了非谷歌认证的技术。这一次谷歌提供的指纹识别支持,旨在统一指纹识别的技术方案。
4. Doze 电量管理
Android 6.0 自带 Doze 电量管理功能。手机静止不动一段时间后,会进入 Doze 电量管理模式。谷歌表示,当屏幕处于关闭状态时,平均续航时间可提高 30%。
5. App Links
Android 6.0 加强了软件间的关联,允许开发者将 App 和他们的 Web 域名关联。
6. Now on Tap
在桌面或 App 的任意界面,长按 Home 键即可激活 Now on Tap,它会识别当前屏幕上的内容并创建 Now 卡片。
1.2.2 运行时权限机制
在 Android 6.0 时,将不会在安装的时候授予权限;取而代之的是,App 不得不在运行时一个一个询问用户来授予权限。
1. Android 6.0 之前版本的应对之策
Android 6.0 系统默认为 targetSdkVersion 小于 23 的应用授予了所申请的所有权限,所以如果你以前的 App 设置的 targetSdkVersion 低于 23,在运行时也不会崩溃。
2. Normal Permissions 与 Dangerous Permission
Google 将权限分为两类,一类是 Normal Permissions,这类权限一般不涉及用户隐式,是无须用户进行授权的,比如手机振动、访问网络等,这些权限只需要在 AndroidManifest.xml 中简单声明就好,安装时就授权,无须每次使用时都检查权限,而且用户不能取消以上授权;另一类是 Dangerous Permission,一般会设计用户隐私,需要用户进行授权,比如读取 adcard、访问通信录等。
Normal Permissions |
---|
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS |
android.permission.ACCESS_NETWORK_STATE |
android.permission.ACCESS_NOTIFICATION_POLICY |
android.permission.ACCESS_WIFI_STATE |
android.permission.ACCESS_WIMAX_STATE |
android.permission.BLUETOOTH |
android.permission.BLUETOOTH_ADMIN |
android.permission.BROADCAST_STICKY |
android.permission.CHANGE_NETWORK_STATE |
android.permission.CHANGE_WIFI_MULTICAST_STATE |
android.permission.CHANGE_WIFI_STATE |
android.permission.KILL_BACKGROUND_PROCESSED |
android.permission.MODIFY_AUDIO_SETTINGS |
android.permission.NFC |
android.permission.READ_SYNC_SETTINGS |
android.permission.READ_SYNC_STATS |
android.permission.RECEIVE_BOOT_COMPLETED |
android.permission.REORDER_TASKS |
android.permission.REQUEST_INSTALL_PACKAGES |
android.permission.SET_TIME_ZONE |
android.permission.SET_WALLPAPER |
android.permission.SET_WALLPAPER_HINTS |
android.permission.TRANSMIT_IR |
android.permission.USE_FINGERPRINT |
android.permission.VIBRATE |
android.permission.WAKE_LOCK |
android.permission.WRITE_SYNC_SETTINGS |
com.android.alarm.permission.SET_ALARM |
com.android.launcher.permission.INSTALL_SHORTCUT |
com.android.launcher.permission.UNINSTALL_SHORTCUT |
Dangerous Permission
Permission Group | Permissions |
---|---|
android.permission-group.CALENDAR | android.permission.READ_CALENDAR android.permission.WRITE_CALENDAR |
android.permission-group.CAMERA | android.permission.CAMERA |
android.permission-group.LOCATION | android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION |
android.permission-group.PHONE | android.permission.READ_PHOTO_STATE android.permission.CALL_PHOTO android.permission.READ_CALL_LOG android.permission.WRITE_CALL_LOG com.android.voicemail.permission.ADD_VOICEMAIL android.permission.USE_SIP android.permission.PROCESS_OUTGOING_CALLS |
android.permission-group.SENSORS | android.permission.BODY_SENSORS |
android.permission-group.SMS | android.permission.SEND_SMS android.permission.RECEIVE_SMS android.permission.READ_SMS android.permission.RECEIVE_WAP_PUSH android.permission.RECEIVE_MMS android.permission.READ_CELL_BROADCASTS |
android.permission-group.STORAGE | android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE |
同一组的任何一个权限被授权了,其他权限也自动被授权。此外,对于申请时弹出的提示框上面的文本说明也是对整个权限组的说明,而不是单个权限的说明。
3. 实现支持运行时权限
举例获取电话权限。
4. 处理“不再询问”选项
如果用户选择了“不再询问”,那么每次我们调用需要访问该权限的 API 时都会失效,这显然不会带来好的用户体验,所以我们需要做的就是给用户一个友好的提示。这时候需要使用 shouldShowRequestPermissionRationale 方法,这个方法可以帮助开发者向用户解释权限的情况。如果用户选择了“不再询问”选项,则 shouldShowRequestPermissionRationale 方法会返回 false,这时候就可以弹出 AlertDialog 来提醒用户允许访问该权限的重要性。
5. PermissionDispatcher 框架的使用
PermissionDispatcher 框架用来封装请求权限。
使用 PermissionDispatcher 的例子。
1.3 Android 7.0 新特性
1.3.1 Android 7.0 主要新特性概述
1. 多窗口模式
Android 7.0 中支持多窗口多任务处理,你只要在一个应用程序中长按 Overview 按钮,就能进入多窗口模式。在大屏幕设备中,同时打开两个应用程序窗口显然可以提升执行效率。
2. Data Server
Android 7.0 中引入了 Data Server 模式,它是一种流量保护机制。启动 Data Server 模式时,系统将拦截后台的数据使用,并在可能的情况下减少前台运行应用使用的数据量。例如限制流媒体服务的码率,下调画质,以及减少缓存等。而通过白名单设置,用户可以让应用避免受到 Data Server 模式的影响。
3. 改进的 Java 8 语言支持
Android 7.0 可以支持 Java 8 语言平台,使得 Android 的 Jack 编译器现在能够有助于减少系统的冗余代码、降低占用和运行时间。开发者可以直接用 Lambda 表达式。
4. 自定义壁纸
在 Android 7.0 中,可以为主屏幕设置壁纸,为锁屏设置另外一张壁纸。
5. 快速回复
Android 7.0 还支持通知栏直接回复的功能。值得注意的是,这个功能不仅仅限于即时通信应用,它还适用于诸如 Twitter 这样的社交应用。
6. Daydream VR 支持
Android 7.0 内置谷歌的全新 VR 平台 Daydream。Daydream 是一个虚拟现实平台,由 Daydream 头盔、手柄和只能手机构成,支持 Daydream 的智能手机要满足一定的硬件要求。
7. 后台省电
Android 7.0 在后台省电方面也做了不小的改进,屏幕关闭后所有的后台进程都将会被系统限制活动,使这些应用不会在后台中持续唤醒,从而达到省电的目的。此外,Project Svelte 功能也在持续地改善,这最大限度地减少了 Android 设备中系统和应用所占用的内存。
8. 快速设置
下拉通知栏顶部可以展开快捷开关界面。在快捷开关界面右下角有个“编辑”(EDIT)按钮,点击之后即可自定义添加/删除快捷开关,或拖动进行排序。
9. Unicode 9 支持和全新的 emoji 表情符号
Android 7.0 支持 Unicode 9,并且新增了大约 70 种 emoji 表情符号。这些表情符号大多数都是人形的,并且提供不同的肤色。
10. Google Assistant
Google Assistant 号称融合了谷歌搜索的深度学习技术以及 Google Now 的个人信息学习技术,它能够分辨用户的自然语言,并具备练习上下文的理解能力。它能够按照你的谈话内容和习惯来调整自己的推荐建议,最终能够形成一种适合于用户本人的模式,为用户的日常生活提供帮助。
1.3.2 多窗口模式
1. 进入多窗口模式
进入多窗口模式有两种方式:
- 点击手机导航栏最右边的 Overview 按钮进入 Overview 列表,长按列表中的活动窗口并拖入到屏幕最上方的分屏显示区域。
- 打开一个程序,长按 Overview 按钮也可以进入多窗口模式。
2. 多窗口模式的生命周期
长按进入多窗口模式时,生命周期方法:onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResumt() -> onPause()。经历了一个重新创建的过程,最终会停留在 onPause() 状态,当点击项目的窗口时,才会获取焦点进入 onResume 状态。
长按 Overview 按钮退出多窗口模式,生命周期方法:onstop() -> onDestory() -> onCreate() -> onStart() -> onResume() -> onPause() -> onResume() 。先经历了销毁的过程,然后是一个重新恢复的过程,最终会停留在 onResume 状态。
3. 禁用多窗口模式
多窗口模式未必适用于所有应用。如果想要禁用多窗口模式,只需要在 AndroidManifest.xml 中加入如下属性即可:
<application
...
android:resizeableAcivity = "false"
...
</application>
设置 android:resizeableAcivity
属性为 false ,当长按 Overview 按钮想要进入多窗口模式时,会发现项目无法进入多窗口模式,并会弹出 Toast 来提醒用户当前应用不支持多窗口模式。
1.4 本章小结
Android进阶之光-第1章-Android新特性-读书笔记的更多相关文章
- Android进阶加密-第1章-Android系统架构-读书笔记
第 1 章 Android 系统架构 1.1 Android 系统架构 Android 系统架构分为五层,从上到下依次是应用层.应用框架层.系统运行库层.硬件抽象层和 Linux 内核层. 应用层(S ...
- [置顶]
曙光到来,我的新书《Android进阶之光》已出版
独立博客版本请点击这里 由来 2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了 ...
- 《Android进阶之光》--注解与依赖注入框架
No1: 标准注解: 1)@Override:覆写 2)@Deprecated:过时 3)@SuppressWarnings:取消警告 4)@SafeVarargs:申明使用了可变长度参数的方法 No ...
- 《Android进阶之光》--Material Design
接上篇<Android进阶之光>--Android新特性 No1: 组件: 1)底部工作条-Bottom Sheets 2)卡片-Cards 3)提示框-Dialogs 4)菜单-Menu ...
- 我的Android进阶之旅------>如何解决Android 5.0中出现的警告: Service Intent must be explicit:
我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...
- 第三章 Git的入门 - 读书笔记
Android驱动月考3 第三章 Git的入门 - 读书笔记 对于Github,这是全世界最大的开源平台,你可以把你做的项目在这里开源,把你发现的一些新技术在这里开源,向全世界的开发者们分享,大家都彼 ...
- java8 新特性学习笔记
Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...
- 《Android进阶之光》--Android新特性
Android 5.0新特性 1)全新的Material Design设计风格 2)支持多种设备 3)全新的通知中心设计--按照优先级显示 4)支持64位ART虚拟机 5)多任务视窗Overview ...
- 第十四章 JDK新特性回顾
14.1.JDK5新特性回顾 自动装箱.拆箱 静态导入 增强for循环 可变参数 枚举 泛型 元数据 14.2.JDK7新特性回顾 对Java集合(Collections)的增强支持 在switch中 ...
随机推荐
- Spring Security 实战:QQ登录实现
准备工作 1.在 QQ互联 申请成为开发者,并创建应用,得到APP ID 和 APP Key.2.了解QQ登录时的 网站应用接入流程.(必须看完看懂) 为了方便各位测试,直接把我自己申请的贡献出来:A ...
- thymeleaf 专题
Thymeleaf 之 内置对象.定义变量.URL参数及标签自定义属性 如标题所述,这篇文章主要讲述Thymeleaf中的内置对象(list解析.日期格式化.数字格式化等).定义变量.获取URL的参数 ...
- 【新手向】自用的tooltip小插件,前端插件知识科普~
上面的tooltip就是成品图,为了和自己站点的风格保持一致所以自己写的. 第一部分:你绝对碰到过的匿名函数闭包问题 第二部分:写个tooltip demo 第三部分:源码地址 第一部分 你绝对碰到过 ...
- java 基础之 反射技术
1. java代码 在 java 语言中最核心的就是代码的运行, 按照面向对象的思想,在调用java代码时往往需要先创建对象,再调用方法, 而写在方法中的即所谓的java 代码 一段java代码在程序 ...
- 27.app后端搭建聊天服务器的经历
现在,聊天功能已经成了社交app的标配了.但是,众多web开发出生的程序员对聊天相关的服务的不了解,带来了很多开发上的困扰.在这篇文章中,根据下面3个方面,谈谈聊天服务. 1. 聊天服务的技 ...
- Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:[张鸿洋的博客] 很久以前也过一个html5的刮刮卡 ...
- sublime text3汉化
注意在安装 sublime text3 时勾选Add to explorer context menu,这样在右键单击文件时就可以直接使用Sublime Text打开. 下载Package Contr ...
- Java 读书笔记 (十四) Java 方法
finalize() 方法 finalize() 用来清除回收对象. //为什么要回收内存?怎样写可以避免内存过多占用?什么时候需要手动回收内存? protected void finalize() ...
- 再谈.net的堆和栈---.NET Memory Management Basics
.NET Memory Management Basics .NET memory management is designed so that the programmer is freed fro ...
- 内连接查询 (select * from a join b on a.id = b.id) 与 关联查询 (select * from a , b where a.id = b.id)的区别
转自https://blog.csdn.net/l690781365/article/details/76261093 1.首先了解 on .where 的执行顺序以及效率? from a join ...