Android 问题汇总(进行中...)

Catalogue
  1. 1 网络相关
  2. 2 自定义 View 相关

本文将长期记录并解答笔者在 Android 开发过程中所遇到的问题,这些问题一般是几句话就能概括并且不需要单独成文讲解的。

1 网络相关

1、Host 这个 Header的作用是?
答:仅用于找到目标主机后确认子主机的域名和端口。
解释:Host表示服务器主机地址,这个地址是子主机的地址,或者说是子主机的域名(也可以是IP地址)。
参考地址>>

2、Host 为什么不放在请求行和 Path 一起拼凑使用,而是单独作为 Header ?
答:请求行中的 Path 是给子主机确定访问路径用的,而 Host 是给主主机确认访问的子主机用的。两个的用途不一样,前者给子主机用,后者给主主机用。

3、Http 协议中主主机的 IP 地址是何时确定的?
答:是在 Http 请求发送之前通过DNS域名解析后确定的。

4、什么是编码?
答:把数据从一种格式转换成另一种格式(可能是同一种格式),它是可逆的,它的逆向过程叫做解码。

5、什么是对象序列化?
答:把数据对象(一般是内存种的,例如JVM中的对象)转换成字节序列的过程。对象在程序内存里的存放形式是散乱的(存放在不同的内存区域、并且由引用进行连接),通过序列化可以把内存中的对象转换成一个字节序列,从而可使用byte[]等形式进行本地存储或网络传输,在需要的时候重新组装(反序列化)来使用。

6、序列化和编码的区别
答:编码是把数据由一种数据格式转换成另一种数据格式;而序列化是把数据由内存中的对象(而不是某种具体的格式)转换成字节序列。

7、非对称加密和数字签名在加密通信中如何配合使用?
答:使用非对称加密通信,可以在不可信网络上将双方的公钥传给对方,然后在发消息前分别对消息使用对方的公钥来加密和使用自己的私钥来签名,做到不可信网络上的可靠密钥传播及加密通信。
知识拓展:签名是对原数据的 hash 值进行签名,而不是直接对原数据进行签名。这样做是为了减小数据的传输体积。

8、TCP/IP协议族、HTTP协议、TCP协议、UDP协议、IP协议、Socket之间的关系?
参考文章
Ⅰ、TCP/IP协议族是一个网络通信模型,为互联网的基础通信架构,它并不只是包含TCP协议和IP协议,只是因为这两个协议很重要,所以才用它们来命名。通常TCP/IP协议族被分为四层:应用层(HTTP协议)、传输层(TCP协议 | UDP协议)、网络层(IP协议)、数据链路层(以太网协议等)。
Ⅱ、HTTP连接是基于TCP协议的可靠传输协议,同时也是请求响应模式且无状态的协议。(Http 1.1 之后可以通过设置 Keep-Alive请求头将 Http 转变成长连接模式,所以此时的 Http 是有状态的。)
Ⅲ、Socket连接既可以基于TCP协议,也可以基于UDP协议。前者每次建立连接都要执行TCP的三次握手过程,每次断开连接都要执行四次挥手过程。后者没有三次握手和四次挥手的过程。

另外,笔者有一个问题是 Http 请求发送前会经历握手和挥手操作吗?
对于这个问题,我在知乎上发现有人有同样的疑惑,具体请点击查看,把链接中的高赞回答过一遍,对于这个问题的答案也就清晰。

Ⅳ、TCP协议(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来,同时,结束对话也需要四次挥手过程。
V、UDP协议(User Data Protocol,用户数据报协议)在传输数据时不建立连接,因此也就不需要维护连接状态。UDP是面向报文的。发送方的UDP对应用程序交下来的报文, 在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界, 因此,应用程序需要选择合适的报文大小。
Ⅵ、总结一下就是,TCP/IP协议族是一个总称,它包含了HTTP协议、TCP协议、UDP协议、IP协议。TCP协议、UDP协议是两种不同的传输层协议。Socket是一个为了便于使用 TCP/UDP 而提供的API接口规范,而Http是一个应用层协议,Http的下一层基于TCP协议,它和Socket没有联系。在 Http 连接中,只有客户端发起请求后服务端才会响应,服务端是无法主动向客户端发消息的,而Socket连接中,通信双方发送消息并没有先后的限制,通信双方中的任何一方可以随时向另一方发送消息。最后,笔者也认为既然 Socket 是一个对传输层协议的接口封装,而传输层的上个步骤是来自于应用层的(这里就是Http协议了),所以可以说 Sockect 的实现是依赖于上层http协议的。(应用层协议还有一个WebSocke协议支持双向主动发送消息给对方,它和 Http协议 的区别可以参考这个链接

9、HMAC 是什么 以及 Https 建立连接过程中产生的 mac secrete 有什么用?
关于 HMAC 的定义可以看这篇文章,所以我得到结论是 HMAC 不仅可以验证数据的完整性,同时还能保证数据来自于可信的对象(加大破解难度)。而 mac secrete 实际上充当了 HMAC 计算过程中的 key 。

10、HTTPS必须在每次请求中都要先在SSL层进行握手传递秘钥吗?
参考知乎这个链接下面答主“车小胖”的回答。

11、相同的请求,http发送第一次三次握手,第二次还会握手三次吗?
请参考这个链接下面的回答。

2 自定义 View 相关

1、canvas 中 save()和 saveLayer()区别
参考链接>>

2、自定义 View 时拿到 View 属性值的两种方式
方式一

1
2
TypedArray typedArray =context.obtainStyledAttributes(attrs,控件在 R.styleable.styleable 文件中的命名【随意】);
typedArray.getXXX(R.styleable.styleable文件中的控件名称_控件属性名, defaultValue);

方式二

1
2
TypedArray typedArray =context.obtainStyledAttributes(attrs,由控件属性组成的数组【如{android.R.attr.layout_width,R.attr.***}】);
typedArray.getXXX(属性在数组中的引索, defaultValue);

注意,对于方式二,obtainStyledAttributes 的第二个参数必须是由组成该控件的属性生成的数组,可以是系统自带的,如:android.R.attr.layout_width,也可以是在 styleable 文件自定义的属性,如:R.attr.***。

3、Android 动画选择问题
优先考虑使用属性动画、View 动画、或者他们的衍生版本动画。如果实现起来复杂,才考虑使用过渡动画MotionLayout 动画

注意:过渡动画使用TransitionManager#go()方式时,需要重新绑定数据(因为 View 会被重新添加),TransitionManager#beginDelayedTransition()方式和 MotionLayout 动画不需要重新绑定数据。