android面试点总结

http和https得区别:

简单回答:
HTTP是明文传输的,传输过程中容易被拦截、修改或者伪造请求;HTTPS则是在HTTP基础
上进行进行了一些信息保护,相比HTTP来说更为安全。
http是什么:http是一种超文本传输协议,它是一个在计算机世界专门在两点之间传输文字,图片,视频,音频等超文本数据的约定和规范
http的原理:
1,客户端浏览器通过网络与服务器建立链接(通过tcp实现,一般端口号为80),建立链接后客户端可发送请求给服务器(请求格式为:统一资源标识符(URL),协议版本号,后边是MIME信息包括请求修饰符,客户机信息和许可内容)
2,服务器接收到请求之后会返回一定的相应(其格式为一个状态行,包括信息的协议版本号,一个成功或者错误的代码,后边是MIME信息包括服务器信息,实体信息和可能的内容)
HTTP的缺点
1,使用明文通信,一些重要的内容会被窃听(密码)
2,不能验证对方的身份,可能是伪造的信息
3,无法验证报文的完整性,有可能已经被修改
HTTPS如何解决HTTP的问题

  • HTTPS只是在HTTP基础上增加了加密处理,认证机制和完整性保护,即 HTTPS=HTTP+加密+认证+完整性保护.
    • 加密,HTTPS通过对数据加密来使其免受窃听者对数据的监听,这就意味着当用户在浏览网页时,没有人能够监听他和网站之间的信息互换,或者跟踪用户的活动,访问记录等,从而窃取用户信息
    • 数据一致性,数据在传输的过程中不会被窃听者所修改,用户发送的数据会完整的传输到服务器端,保证用户发的是什么,服务器接收的就是什么
    • 身份认证,是指确认对方的真实身份,也就是证明你是你(可以比作是人脸识别) ,它可以防止中间人攻击并建立用户信任
      *HTTPS不是应用层的一种新协议,只是HTTP协议的改进(HTTP协议中的部分通信接口被ssl/tls代替),通常HTTP直接与TCP进行通信,当使用ssl协议则先与ssl通行,再由ssl和tcp通信
      *HTTPS在HTTP的基础上增加了ssl协议;

HTTPS的原理:

1,客户使用https的URL访问web服务器,要求与web服务器建立ssl链接
2,web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端
3,客户端的浏览器与web服务器开始协商ssl链接的安全等级,也就是信息加密的等级
4,客户端的浏览器根据双方同意的安全等级,建立回话密钥,然后利用网站的公钥将会话加密,并传送给网站.
5,web服务器利用自己的私钥解密出会话密钥
6,web服务器利用会话加密与客户端之间通信

区别:

  • 1,http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
  • 2,http和https使用的是完全不同的链接方式,用的端口也不一样,前者是80 ,后者是443.
  • 3,http的链接很简单,是无状态的,https协议是由SSL+Http协议构建的可进行加密传输,身份认证的网络协议,比http协议安全.(无状态的意思是其数据包的发送,传输和接收都是相互独立的,无链接的意思是指通信双方都不长久的维持对方的任何信息.)

android消息机制

消息机制指Handler、Looper、MessageQueue、Message之间如何工作的。

  • handler是用来处理消息和接收消息的中间者,handler的创建会伴随着handler中产生looper和MessageQueue,handler依赖于looper,looper依赖于MessageQueue,所以在子线程中使用handler抛出异常是因为子线程中没有初始化looper对象,而主线程中looper是在ActivityThread中已经初始化过了,所以能直接在主线程中能拿到Handler。

  • Looper是用来轮询消息,说白了就是通过loop方法实现死循环,有消息的时候,通过MessageQueue.next方法取出message,没有消息的时候,线程处于阻塞的状态。在有消息的时候获取到消息,将消息交给了handler,handler会根据消息中有没有callback,如果有callback会直接callback,否则通过handleMessage处理。

  • MessageQueue是一个单链表结构来存储Message,每次通过next方法取出Message消息后,取完之后将message.next给当前的message,再将message.next=null,实际上就是移除当前的message。但是在looper里面每次在next取出message后,放到了message的sPool里面,缓存起来方便使用。

  • Message就没什么好说的,主要存储平常经常用的obj和what信息,以及我们不用关心的target和callback等。

这里会问到,一个线程会有几个Looper,几个Handler,以及Looper会存在线程哪里?

一个线程一个Looper,可以有多个Handler,Looper会存在线程的ThreadLocal对象里,该对象是线程的缓存区

1.requestLayout和invalidate的区别

1 requestLayout会标记View的mPrivateFlags的PFLAG_FORCE_LAYOUT,并且逐层向上调用,标记父View的标记位,最终调用ViewRootImpl的requestLayot

2 ViewRootImpl的RequestLayout方法会调用scheduleTraversals方法,最终调用measure,layout,draw三个过程

3 invalidate方法会设置PFLAG_DIRTY标记位, 并且循环向上调用,最终调用ViewRootImpl的invalidateChildParent方法,在该方法中,合并所有dirty区域,
并且调用scheduleTraversals方法,因为没有设置PFLAG_FORCE_LAYOUT标记位,因此不会measure和layout,只会draw

总结:requestLayout会重新measure,layout,draw整个View树
invalidate只会重新draw需要重新绘制的区域,不会measure和layout

2.Service和IntentService的对比

Service默认是运行在App运行的进程的主线程中,我们不能在里面做耗时操作。

IntentService是Service的子类,它会创建一个工作线程来处理所有的Intent请求。执行完一个Intent对象的请求后,如果没有新的Intent请求到达、 则会自动停止Service不用你去调用stopService方法
IntentService处理事务时是采用handler方式,创建了一个名为ServiceHandler的内部Handler,并把它直接绑定HandlerThread,ServiceHandler把处理Intent所对应的事务都封装到onHanderIntent方法中,我们可以直接实现onHanderIntent方法再里面根据Intent的不同进行不同处理

3.说一说你对Http的理解

1,首先我们笼统的理解http协议就是客户端请求web服务器的一个协(固定模式),即(客户端)请求->(服务器端)返回数据。
2,请求->返回数据,这并不简单,http是建立在tcp/ip协议之上的。这个过程是需要经历 建立链接->数据交互->关闭连接
3,简单的理解就是,tcp/ip协议就是帮我们在网络中,将两台计算机建立起连接,如:A计算机要访问B计算机上的资源,所以先通过tcp/ip协议建立连接(A与B之间建立交流通道)
4,tcp/ip建立连接,要经过三次握手/四次挥手(三次握手/四次挥手可以简单理解为一种算法)
5,建立连接后/就需要传递数据
6,数据交互后,连接就需要断开(四次挥手)其实也就是一种算法,跟三次握手类似
7,每次请求都要进行连接/断开,所以我们常常听到http是无连接和无状态的

java类加载机制

类从被加载到jvm中开始,到卸载为止,整个生命周期包括:加载,验证,准备,解析,初始化,使用和卸载七个阶段。
其中类加载机制包括 加载,验证,准备,解析,初始化等五个阶段。
类的加载过程:

  • 1,通过类加载器,加载.class文件到内存中去
  • 2,将读取到.class数据存储到运行时内存区的方法区
  • 3,然后将其转换为一个目标类型对应的java.lang.class对象实例,这个class对象在日后就会作为方法区中该类各种数据的入口

Touch事件传递机制

一个完整的touch事件,由一个down事件,n个move事件,一个up事件组成
Touch事件一般的传递流程 Activity---->windown(唯一实现类是PhoneWindow)--->顶级View(DecorView)---->ViewGroup--->View
监听Touch事件有两种方式:setOnTouchListener和直接重写三个方法
(dispachTouchEvent,onInterceptTouchEvent,onTouchEvent)。
setOnTouchListener:
该方式监听Touch事件,优先级较高,如果在onTouchListener的onTouch方法中return true的话,那么onTouchEvent方法是接收不到该Touch事件的,而且因为onClickListener中的onClick方法实际上是在onTouchEvent中被调用的
所以如果Touch事件走不到onTouchEvent方法的话,点击事件也不会生效

//绑定控件
ImageView imgfire=findViewById(R.id.imgfire);

//触摸监听事件
imgfire.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.e("xxx","按下");
            break;
        case MotionEvent.ACTION_UP:
            Log.e("xxx","抬起");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.e("xxx","移动");
            break;
    }
    return true;
}

});

直接重写三个方法:

  • dispatchTouchEvent:该方法表示对事件进行分发,在这个方法中我们一般return super.dispatchTouchEvent,将该事件分发下去。

  • onInterceptTouchEvent:该方法表示对Touch事件进行拦截,该方法是ViewGroup特有的,View没有。在ViewGroup中如果
    onInterceptTouchEvent返回true,表示将该事件拦截,那么事件将传递
    给该ViewGroup的onTouchEvent方法来处理,如果onInterceptTouchEvent返回false表示不拦截,那么该事件将传递给子View的dispatchTouchEvent来进行分发

  • onTouchEvent:在dispatchTouchEvent方法中调用,用来处理点击事件,反馈结果表示是否消耗当前事件,如果不消耗,则在同一事件序列中,当前View无法再次接受事件;

MVC、MVP与MVVM之间的对比分析?

  • MVC:PC时代就有的架构方案,在Android上也是最早的方案,Activity/Fragment这些上帝角色既承担了V的角色,也承担了C的角色,小项目开发起来十分顺手,大项目就会遇到
    耦合过重,Activity/Fragment类过大等问题。
  • MVP:为了解决MVC耦合过重的问题,MVP的核心思想就是提供一个Presenter将视图逻辑I和业务逻辑相分离,达到解耦的目的。
  • MVVM:使用ViewModel代替Presenter,实现数据与View的双向绑定,这套框架最早使用的data-binding将数据绑定到xml里,这么做在大规模应用的时候是不行的,不过数据绑定是
    一个很有用的概念,后续Google又推出了ViewModel组件与LiveData组件。ViewModel组件规范了ViewModel所处的地位、生命周期、生产方式以及一个Activity下多个Fragment共享View
    Model数据的问题。LiveData组件则提供了在Java层面View订阅ViewModel数据源的实现方案。

说一说你对java中泛型的理解:

1 什么是泛型?使用泛型的好处是什么?

Java泛型是在JDK5引入的新特性,它提供了编译时类型安全检测机制。该机制允许程序员在编译时检测到非法的类型,泛型的本质是参数类型。
使用泛型的好处:
1 泛型可以增强编译时错误检测,减少因类型问题引发的运行时异常。
2 泛型可以避免类型转换。
3 泛型可以泛型算法,增加代码复用性。

2 Java中泛型的分类?

Java中的泛型分为三种,泛型类,泛型接口,泛型方法。

对象的创建过程

类加载->检查加载->分配内存->内存空间初始化-设置值->对象初始化

你可能感兴趣的:(android面试点总结)