美文网首页面试面试
[Android] 面试题总结-猎趣-Android部分

[Android] 面试题总结-猎趣-Android部分

作者: 暗影飞客 | 来源:发表于2017-03-26 15:11 被阅读95次

    前言

    昨天(很久之前 = =),很意外的接到了猎趣的电话,直奔主题就开始面试了,我都不知道我投过这家公司,后来才知道,是朋友推荐的。面试官人很好,问的问题分了 Java,Android 两类,从简单到深入,一点一点来,事后,我觉得这是很难得的经历,打算记录下来,以备后用。

    Android 问题

    • Activity 生命周期,以及简单分析一下,从 A 跳转到 B,在从 B(点击虚拟 Back 键)回到 A ,Activity A,B,分别执行了哪些方法?
    • 简要描述一下 Activity 的启动模式。
    • 你是怎么理解 Android 的 Android 异步消息处理机制,(如果基本回答出来了,会继续问你,对于 Looper 的理解,以及,MessageQueue 是什么时候创建的?)
    • 说一说,Window,Activity,View 三者的关系。
    • 说一下,你知道的几种常用动画类型,及其本质的区别。
    • 实现 View 的滑动,有哪几种方法?(如果你回答出了,ScrollTo(),和ScrollBy(),会问你这俩的区别,以及都继承自什么?)

    下面我一个一个整理资料,为自己做一个总结。

    1, Activity 生命周期

    onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy();
    还有一个 onRestart();这个基本没有什么问题,额外提一句 ** onNewIntent() ** 虽然不属于生命周期,但是有的公司面试,也会问到。
    接下来是,Activity A,B,分别执行了哪些方法?顺序如下:

    • 启动 A : onCreate() —> onStart() —> onResume(), A 进入运行状态。
    • 跳转至 B :
      1. A 先执行:onPause()
      2. B 再执行:onCreate() -> onStart() -> onResume()
      3. A 再执行:onStop()
    • 从 B 返回 A:
      1. B 先执行:onPause()
      2. A 再执行:onRestart() -> onStart() -> onResume()
      3. B 再执行:onStop() -> onDestroy()
    2,Activity 的 4 种启动模式

    android:launchMode="standard | singleTop | singleTask | singleInstance"
    先简单描述一下 Activity 任务栈:任务栈是一种后进先出的结构,每个 APP 默认只有一个栈,以APP的包名来命名。

    • standard : 标准模式,每次启动 Activity 都会创建一个新的实例,并且将其压入任务栈栈顶,不管这个 Activity 是否已经存在。每次 onCreate() -> onStart() -> onResume() 都会执行;
    • singleTop : 栈顶复用模式,跳转前,会先检查新的 Activity 是否已在栈顶,如果在,就不会创建新的实例,只会调用 onNewIntent() 方法;反之,如果不在栈顶, 则与 standard 模式一样;
    • singleTask:栈内复用模式,顾名思义,就是要保证栈内只有一个实例存在。跳转前,会先检查栈内是否已存在该实例,若存在,则会将其上方的所有实例清除掉,并调用 onNewIntent() 方法,使其出现在栈顶;
    • singleInstance :和 singleTask 很像,也有单例的作用,不同的是,会单独创建一个新的任务栈,归 singleInstance activity 独有。这种模式应用场景非常少,比如 “ 呼叫来电界面 ” 和 “ QQ 等第三方登录界面 ”。
    3,异步消息处理机制

    关于这个问题,我就不献丑了,我也是仔细阅读了 鸿洋 郭霖 大神的博客,才差不多懂了,双手奉上链接:

    Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
    Android异步消息处理机制完全解析,带你从源码的角度彻底理解

    在此之前,我一直认为,Looper 就是一个 while(true) 的循环体,真是尴尬 = =!
    在这里总结一下,防止自己又忘了:
    Looper 内部有两个重要的方法:prepare() 和 loop();

    • prepare() :准备,就绪的意思,作用为,保证保证一个线程中只有一个 Looper 实例;
    • Looper():构造方法,创造了 MessageQueue(消息队列);
    • loop():不断从 MessageQueue 中去取消息,交给消息的 target 属性(即,Handler)的 dispatchMessage() 去处理。

    另外,面试官还问我,子线程中能不能创建 Handler,一脸懵逼 = =

    // 这是官方的标准写法
    class LooperThread extends Thread {  
          public Handler mHandler;  
          public void run() {  
              Looper.prepare(); // 没有这句话,会报错。
      
              mHandler = new Handler() {  
                  public void handleMessage(Message msg) {  
                      // process incoming messages here  
                  }  
              };  
      
              Looper.loop();  
          }  
      }
    
    4, Window,Activity,View

    坦白说,这个是我从来没有研究过的问题,被问到时,第一反应是懵逼 = =,但是也不能直接说不知道,真尴尬,瞎扯了一会儿,然后面试官说,回答错了,我坦率地问了一句,“能否简单给我讲一下这个知识点吗?我真的很想知道!”,没想到面试官真的回答,我很惊讶,对这个公司的印象分,一下子上升了好大一截 ^ ^
    时间过去了快2个礼拜,我只隐约记得,说:Window 是 容器;View 是视图,画布;而 Activity 可以看作是控制器,将 View 和 Window 关联在一起,这三者的关系有点像
    MVC,你去读一读 setContentView() 的源码,就知道了。
    不得不说,我阅读源码的能力,很是很弱的 = =,于是乎,我借鉴了以下文章:

    理清Activity、View及Window之间关系
    Activity、View、Window的理解

    特别是后一篇,是我极偶然看到的(已经忘记是怎么搜到的了),大家有兴趣自己去看,我只简单总结一下:

    1. Window:一个 App 中有多个 Window,大小可自定义,作为盛放
      View 的容器;
    2. View:UI组件;
    3. Avtivity:关联 Window 和 View 的存在,用于控制 Window 下的 View-Tree;
    4. 不知道这个形容是否准确,但是容易理解和记忆吧 = =
      系统 <====> Window <====> Activity <====> View
      国家 <====> 房地产商 <====> 物业 <====> 居民
      ** 国家分配地皮给房地产商用以建造房屋,房地产商利用物业去管理居住在此的居民。 **
    5,动画

    关于这个,我只是会用而已,强烈建议,仔细阅读以下** 郭霖大神 **的文章,我陆陆续续看完了,也实践过,但是不经常用,就又忘记了 = =

    Android属性动画完全解析(上),初识属性动画的基本用法
    Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
    Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法

    简单回答,面试问题:
    三种:逐帧动画(frame-by-frame animation),补间动画(tweened animation),和属性动画(property animation)。
    区别:补间动画,只是重新绘制了而已,其属性并未改变;属性动画,则是直接改变了其属性。

    6,实现 View 滑动的几种方式(随手指滑动)

    随手指滑动,基本都是用到 onTouchEvent() 这个我就不多说了,我知道的有以下几种方式:

    • layout(left, top, right, bottom)
    • offsetLeftAndRight(x)offsetTopAndBottom(y),其实就是对 layout 做了一层封装而已;
    • setLayoutParams(lp) 这个,在做 View 位置微调的时候用过;
    • scrollTo()scrollBy() 这个,稍微麻烦一点,我多说两句:
      • 顾名思义,To 就是移动到某个坐标点,By 不好直译,作用是,在原有位置在添加一个偏移量;
      • View.scrollTo() or View.scrollBy(),** 作用对象是,View 的内容 **,如 TextView 移动的是文字;
      • ViewGroup.scrollTo() or ViewGroup.scrollBy(),** 作用的对象是,所有子 View **;
    • 属性动画咯~ 个人感觉最好用,最容易~ 嘿嘿

    ** 以下是我所不知道的,连听都没听说过,真是孤陋寡闻啊 = = **

    • Scroller,通过 Scroller 类来实现一些平滑的动画效果,可以设置动画时间等;
    • ViewDragHelper,经典例子就是,侧滑菜单;

    哦,忘记了说了,scrollTo()scrollBy() 分别继承自什么?面试官好坏,还挖坑 = =,“ 分别 ”,明明都继承自 View 类,哼~
    再提一句,scrollBy() 内部调用了 scrollTo()

    后记

    这一篇拖得比较久,快两个礼拜了,真是抱歉,拖延症犯了 = =
    主要原因了,我从西安去北京了~,原因是什么,大家应该猜到了,嘻嘻,没错,我收到 Offer 了,整体来说,全凭运气吧,我总觉得是因为,在面试过程中,我问面试官了一句,** “ 能否简单给我讲一下这个知识点吗?我真的很想知道!” **,多么红果果的求知欲,哈哈~
    说实话,真的是运气使然,要感谢我的好基友,涛子~ 嘿嘿
    明天就要正式去猎趣上班啦~ 跪求不要一日游~

    相关文章

      网友评论

        本文标题:[Android] 面试题总结-猎趣-Android部分

        本文链接:https://www.haomeiwen.com/subject/oynlnttx.html