移动开发最新Android-开发经验分享:挺重要的网络基础,Android阿里等大厂面试题汇总

资源分享

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

无连接的含义是http约定了每次连接只处理一个请求,一次请求完成后就断开连接,这样主要是为了缓解服务器的压力,减小连接对服务器资源的占用。我的理解是,建立连接实际上是运输层的事,面向应用层的http来说的话,它就是无连接的,因为上层对下层无感知。

无状态的指每个请求之间都是独立的,对于之前的请求事务没有记忆的能力。所以就出现了像Cookie这种,用来保存一些状态的东西。

二、请求报文与响应报文

这里主要简单说一下请求报文和响应报文的格式:

请求报文:

响应报文:

关于Get和Post:我们都熟知的关于Get和Post的区别大致有以下几点:

Get会把请求参数都拼接在url后面,最终显示在地址栏,而Post则会把请求参数数据放进请求体中,不会再地址栏显示出来
传递参数的长度限制

问题:

对于第一点,如果是在浏览器里把隐私数据暴露在地址栏上确实不妥,但是如果是在App开发中呢,没有地址栏的概念,那么这一点是不是还会成为选择post还是get的制约条件。

对于第二点,长度的限制应该是浏览器的限制,跟get本身无关,如果是在App开发中,这一点是否也可以忽略。

三、HTTP的缓存机制

之所以想介绍以下Http的缓存机制,是因为Okhttp中对于网络请求缓存这一块就是利用了Http的的缓存机制,而不是像Volley等框架那样客户端完全自己写一套缓存策略自己玩。

Http的缓存主要利用header里的两个字段来控制:

  1. Cache-control主要包含以及几个字段:

private:则只有客户端可以缓存
public:客户端和代理服务器都可以缓存
max-age:缓存的过期时间
no-cache:需要使用对比缓存来验证缓存数据
no-store:所有内存都不会进行缓存

实际上就是在这里面设置了一个缓存策略,由服务端第一次通过header下发给客户端,可以看到:

max-age即缓存过期的时间,则之后再次请求,如果没有超过缓存失效的时间则可以直接使用缓存。

no-cache:表示需要使用对比缓存来验证缓存数据,如果这个字段是打开的,则就算max-age缓存没有失效,则还是需要发起一次请求向服务端确认一下资源是否有更新,是否需要重新请求数据,至于怎么做对比缓存,就是下面要说的Etag的作用。如果服务端确认资源没有更新,则返回304,取本地缓存即可,如果有更新,则返回最新的资源。

no-store:这个字段打开,则不会进行缓存,也不会取缓存。

2.ETag:即用来进行对比缓存,Etag是服务端资源的一个标识码

当客户端发送第一次请求时服务端会下发当前请求资源的标识码Etag,下次再请求时,客户端则会通过header里的If-None-Match将这个标识码Etag带上,服务端将客户端传来的Etag与最新的资源Etag做对比,如果一样,则表示资源没有更新,返回304。

通过Cache-control和Etag的配合来实现Http的缓存机制。

四、Cookie

上面说了Http协议是无状态的,而Cookie就是用来在本地缓存记住一些状态的,一个Cookie一般都包含domin(所属域)、path、Expires(过期时间)等几个属性。服务端可以通过在响应头里的set-cookies来将状态写入客户端的Cookie里。下次客户端发起请求时可以将Cookie带上。

Android开发中遇到的问题及解决:

说起Cookie,一般如果平常只是做App开发,比较不经常遇到,但是如果是涉及到WebView的需求,则有可能会遇到。

下面就说一下我在项目里遇到过的一个关于WebView Cookie的揪心往事:需求是这样的,加载的WebView中的H5页面需要是已登录状态的,所以我们需要在原生页面登录后,手动将ticket写入WebView的Cookie,之后WebView里加载的H5页面带着Cookie里的ticket给服务端验证通过就好了。

但是遇到一个问题:通过Chrome inspect调试WebView,手动写的Cookie确实是已经写进去了,但是发起请求的时候,Cookie就是没有带上,导致请求验证失败,之后通过排查,是WebView的属性默认关闭引起,通过下面的代码设置打开即可:

CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.setAcceptThirdPartyCookies(mWebView, true);
} else {
cookieManager.setAcceptCookie(true);
}

五、Https

我们都知道Https保证了我们数据传输的安全,Https=Http+Ssl,之所以能保证安全主要的原理就是利用了非对称加密算法,平常用的对称加密算法之所以不安全,是因为双方是用统一的密匙进行加密解密的,只要双方任意一方泄漏了密匙,那么其他人就可以利用密匙解密数据。

而非对称加密算法之所以能实现安全传输的核心精华就是:公钥加密的信息只能用私钥解开,私钥加密的信息只能被公钥解开。

1.简述非对称加密算法为什么安全:

服务端申请CA机构颁发的证书,则获取到了证书的公钥和私钥,私钥只有服务器端自己知道,而公钥可以告知其他人,如可以把公钥传给客户端,这样客户端通过服务端传来的公钥来加密自己传输的数据,而服务端利用私钥就可以解密这个数据了。由于客户端这个用公钥加密的数据只有私钥能解密,而这个私钥只有服务端有,所以数据传输就安全了。

上面只是简单说了一下非对称加密算法是如何保证数据安全的,实际上Https的工作过程远比这要复杂(篇幅限制这里就不细说了,网上有很多相关文章):

一个是客户端还需要验证服务端传来的CA证书的合法性、有效性,因为存在传输过程CA证书被人调包的风险,涉及到客户端如何验证服务器证书的合法性的问题,保证通信双方的身份合法。
另一个是非对称算法虽然保证了数据的安全,但是效率相对于对称算法来说比较差,如何来优化,实现既保证了数据的安全,又提高了效率。

2.客户端如何验证证书的合法性:

首先CA证书一般包括以下内容:

证书的颁发机构以及版本
证书的使用者
证书的公钥
证书有效时间
证书的数字签名Hash值以及签名Hash算法(这个数字签名Hash值是用证书的私钥加密过的值)
等等

客户端验证服务端传过来的证书的合法性是通过:先利用获取到的公钥来解密证书中的数字签名Hash值1(因为它是利用私钥加密的嘛),然后在利用证书里的签名Hash算法生成一个Hash值2,如果两个值相等,则表示证书合法,服务器端可以被信任。

Android开发中遇到的问题及解决:

顺便说一个在项目开发中使用Android WebView加载公司测试服务器上网页证书过期导致网页加载不出来白屏的问题:

解决方案就是测试环境下暂时忽略SSL的报错,这样就可以把网页加载出来,当然在生产上不要这么做,一个是会有安全问题,一个是google play应该审核也不会通过。 重写WebViewClient的onReceivedSslError():

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

if (ContextHolder.sDebug) {
handler.proceed();
return;
}
super.onReceivedSslError(view, handler, error);
}

六、Http 2.0

Okhttp支持配置使用Http 2.0协议,Http2.0相对于Http1.x来说提升是巨大的,主要有以下几点:

二进制格式:http1.x是文本协议,而http2.0是二进制以帧为基本单位,是一个二进制协议,一帧中除了包含数据外同时还包含该帧的标识:Stream Identifier,即标识了该帧属于哪个request,使得网络传输变得十分灵活。
多路复用:一个很大的改进,原先http1.x一个连接一个请求的情况有比较大的局限性,也引发了很多问题,如建立多个连接的消耗以及效率问题。

http1.x为了解决效率问题,可能会尽量多的发起并发的请求去加载资源,然而浏览器对于同一域名下的并发请求有限制,而优化的手段一般是将请求的资源放到不同的域名下来突破这种限制。

而http2.0支持的多路复用可以很好的解决这个问题,多个请求共用一个TCP连接,多个请求可以同时在这个TCP连接上并发,一个是解决了建立多个TCP连接的消耗问题,一个也解决了效率的问题。

那么是什么原理支撑多个请求可以在一个TCP连接上并发呢?基本原理就是上面的二进制分帧,因为每一帧都有一个身份标识,所以多个请求的不同帧可以并发的无序发送出去,在服务端会根据每一帧的身份标识,将其整理到对应的request中。

header头部压缩:主要是通过压缩header来减少请求的大小,减少流量消耗,提高效率。因为之前存在一个问题是,每次请求都要带上header,而这个header中的数据通常是一层不变的。
支持服务端推送

3 TCP相关

TCP面向连接,提供可靠的数据传输。在这一层,我们通常都是通过Socket Api来操作TCP,建立连接等等。

一、三次握手建立连接

第一次:发送SNY=1表示此次握手是请求建立连接的,然后seq生成一个客户端的随机数X

第二次:发送SNY=1,ACK=1表示是回复请求建立连接的,然后ack=客户端的seq+1(这样客户端收到后就能确认是之前想要连接的那个服务端),然后把服务端也生成一个代表自己的随机数seq=Y发给客户端。

第三次:ACK=1。 seq=客户端随机数+1,ack=服务端随机数+1(这样服务端就知道是刚刚那个客户端了)

为什么建立连接需要三次握手?

首先非常明确的是两次握手是最基本的,第一次握手,C端发了个连接请求消息到S端,S端收到后S端就知道自己与C端是可以连接成功的,但是C端此时并不知道S端是否接收到这个消息,所以S端接收到消息后得应答,C端得到S端的回复后,才能确定自己与S端是可以连接上的,这就是第二次握手。

C端只有确定了自己能与S端连接上才能开始发数据。所以两次握手肯定是最基本的。

那么为什么需要第三次握手呢?假设一下如果没有第三次握手,而是两次握手后我们就认为连接建立,那么会发生什么?

第三次握手是为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误

具体情况就是:

C端发出去的第一个网络连接请求由于某些原因在网络节点中滞留了,导致延迟,直到连接释放的某个时间点才到达S端,这是一个早已失效的报文,但是此时S端仍然认为这是C端的建立连接请求第一次握手,于是S端回应了C端,第二次握手。

如果只有两次握手,那么到这里,连接就建立了,但是此时C端并没有任何数据要发送,而S端就会傻傻的等待着,造成很大的资源浪费。所以需要第三次握手,只有C端再次回应一下,就可以避免这种情况。

二、四次握手断开连接

经过上面的建立连接图的解析,这个图应该不难看懂,这里主要有一个问题:

为什么比建立连接时多了一次握手?

可以看到这里服务端的ACK(回复客户端)和FIN(终止)消息并不是同时发出的,而是先ACK,然后再FIN,这也很好理解,当客户端要求断开连接时,此时服务端可能还有未发送完的数据,所以先ACK,然后等数据发送完再FIN。这样就变成了四次握手了。

上面讲了TCP建立连接和断开连接的过程,TCP最主要的特点就是提供可靠的传输,那么他是如何保证数据传输是可靠的呢,这就是下面要讲的滑动窗口协议

三、滑动窗口协议

滑动窗口协议是保证TCP的可靠传输的根本,因为发送窗口只有收到确认帧才会向后移动窗口继续发送其他帧。

下面举个例子:假如发送窗口是3帧

一开始发送窗口在前3帧[1,2,3],则前3帧是可以发送的,后面的则暂时不可以发送,比如[1]帧发送出去后,收到了来自接收方的确认消息,则此时发送窗口才可以往后移1帧,发送窗口来到[2,3,4],同样只有发送窗口内的帧才可以被发送,一次类推。

最后的最后

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的

最后,互联网不存在所谓的寒冬,只是你没有努力罢了!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: android面试大厂必考174是一道比较常见的面试,主要考察对Android基础知识的掌握和应用能力。 174是关于Android中Activity的生命周期的问。Activity是Android应用的基本组件之一,了解和掌握它的生命周期是开发Android应用的基本要求。 Activity的生命周期包括以下几个常用方法:onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等。这些方法分别在Activity的不同阶段被调用,用于管理Activity的状态和响应用户的操作。 在回答174时,可以从以下几个方面回答: 1. 对于Activity的生命周期的理解:就是回答上述的onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等方法的作用和调用顺序。 2. 对于Activity状态的切换:从后台到前台、从前台到后台时,Activity的生命周期方法的调用顺序是什么。 3. Activity被销毁的场景:Activity被销毁的场景有哪些,例如用户主动退出、内存不足等。 4. 懂得如何管理Activity的状态和数据:例如在onSaveInstanceState()、onRestoreInstanceState()等方法中保存和恢复Activity的状态和数据。 5. 扩展性问:除了上述常用方法外,你还知道其他的Activity生命周期相关的方法吗?它们有什么作用? 通过以上几个方面的回答,可以较全面地回答174。同时,结合自己在实际开发中的经验和实践,给出一些实际的例子和场景,能够更好地展示自己的理解和应用能力,提升面试效果。 ### 回答2: Android面试中,174是一个必考的问,考察的是对于RecyclerView中的Item动画的理解和实践经验。 RecyclerView是Android中常用的列表型控件,能够高效地展示大量数据。为了提升用户体验,我们可以为RecyclerView中的Item添加动画效果,使界面更加生动。 在实现RecyclerView的Item动画时,我们可以使用Android提供的默认动画效果,比如淡入淡出、平移、缩放、旋转等,也可以使用属性动画自定义动画效果。 当我们需要自定义动画效果时,可以通过RecyclerView.ItemAnimator类来实现。我们需要重写四个方法: 1. canReuseUpdatedViewHolder():判断是否可以复用已更新的ViewHolder。 2. animateAdd():为添加的Item添加动画效果。 3. animateMove():为移动的Item添加动画效果。 4. animateRemove():为删除的Item添加动画效果。 在实现这些方法时,我们可以使用属性动画,通过修改Item的属性值来实现平移、缩放等效果。同时,还可以配合插值器(Interpolator)来调整动画的速度曲线。 除了自定义动画效果外,我们还可以通过RecyclerView.ItemDecoration类来实现对Item的装饰效果,比如分割线、间隔等。这样可以让RecyclerView的布局更加美观和易读。 总结起来,动画在Android应用开发中起着重要的作用,可以提升用户体验。在面试中,了解RecyclerView的Item动画实现原理和实践经验是必备的。我们需要熟练掌握默认动画效果的使用,同时能够自定义动画效果,并且理解RecyclerView.ItemAnimator和RecyclerView.ItemDecoration的用法。 ### 回答3: Android面试大厂必考的174主要针对Android开发相关的知识、技术和经验进行考察。下面我将对其中一些常见的问进行回答。 1. 请介绍一下Activity的生命周期。 Activity的生命周期包括:onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()和onDestroy()。onCreate()在Activity被创建时调用,用于初始化Activity的状态和布局;onStart()在Activity可见但未获取焦点时调用;onResume()在Activity获取焦点时调用,此时Activity处于运行状态;onPause()在Activity失去焦点、但仍可见时调用,通常用于保存数据或释放资源;onStop()在Activity不再可见时调用,可以做一些清理工作;onRestart()在Activity重新展示时调用;onDestroy()在Activity被销毁时调用。 2. 请说明Android中的四种存储方式。 Android中的四种存储方式分别为:SharedPreferences、文件存储、数据库存储和网络存储。 - SharedPreferences是一种轻量级的存储方式,用于存储少量的键值对数据,适用于存储一些简单的配置信息。 - 文件存储用于存储大量的非结构化数据,可以使用FileOutputStream和FileInputStream进行读写操作。 - 数据库存储使用SQLite数据库来持久化保存结构化数据,可以通过SQLiteOpenHelper来创建和管理数据库。 - 网络存储通过与服务器进行通信,将数据存储在服务器上,常见的方式有HTTP请求和WebSocket。 3. 请解释一下Android中的消息机制。 Android中的消息机制主要用于不同组件之间的通信和线程间的通信。它基于“消息队列”和“消息循环”的概念,核心类为Handler、Message和Looper。 - Handler:Handler负责发送和处理消息,通过sendMessage()方法发送消息,通过handleMessage()方法处理消息。 - Message:Message对象封装了消息的内容,包括消息类型和数据。 - Looper:Looper用于管理MessageQueue,不断从MessageQueue中取出消息并将其分发到对应的Handler进行处理。 通过使用消息机制,可以实现不同线程之间的通信,例如在子线程中下载数据完成后,使用Handler将结果传递给主线程进行UI更新。 以上是对部分Android面试大厂必考的174的回答,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值