前言

昨天(很久之前 = =),很意外的接到了猎趣的电话,直奔主题就开始面试了,我都不知道我投过这家公司,后来才知道,是朋友推荐的。面试官人很好,问的问题分了 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 了,整体来说,全凭运气吧,我总觉得是因为,在面试过程中,我问面试官了一句,** “ 能否简单给我讲一下这个知识点吗?我真的很想知道!” **,多么红果果的求知欲,哈哈~
说实话,真的是运气使然,要感谢我的好基友,涛子~ 嘿嘿
明天就要正式去猎趣上班啦~ 跪求不要一日游~

更多相关文章

  1. Android:EditText属性大全
  2. 【Android自定义View实战】之仿QQ运动步数圆弧及动画,Dylan计步中
  3. 第十五章 消息循环模型 - 草稿
  4. Android:用Handler实现异步处理功能
  5. android布局文件详解
  6. Android为ToolBar设置沉浸式状态栏及其相关问题处理
  7. Android仿百度外卖自定义下拉刷新效果
  8. Android组合控件实现功能强大的自定义控件
  9. [置顶] Intent filter 关于Action、Category属性详解---附带实例

随机推荐

  1. Android通过http协议POST传输方式(输出流
  2. 善用Android预定义样式
  3. android 将图片转换成黑白图片
  4. Android(安卓)SDK 源码解析项目
  5. Android(安卓)WebView相关属性
  6. Android的WindowManager解析
  7. Android(安卓)layout
  8. Android布局概览
  9. android设置背景半透明效果
  10. 在android里面使用自定义字体