前言
昨天(很久之前 = =),很意外的接到了猎趣的电话,直奔主题就开始面试了,我都不知道我投过这家公司,后来才知道,是朋友推荐的。面试官人很好,问的问题分了 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 :
- A 先执行:onPause()
- B 再执行:onCreate() -> onStart() -> onResume()
- A 再执行:onStop()
- 从 B 返回 A:
- B 先执行:onPause()
- A 再执行:onRestart() -> onStart() -> onResume()
- 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()
的源码,就知道了。
不得不说,我阅读源码的能力,很是很弱的 = =,于是乎,我借鉴了以下文章:
特别是后一篇,是我极偶然看到的(已经忘记是怎么搜到的了),大家有兴趣自己去看,我只简单总结一下:
- Window:一个 App 中有多个 Window,大小可自定义,作为盛放
View 的容器; - View:UI组件;
- Avtivity:关联 Window 和 View 的存在,用于控制 Window 下的 View-Tree;
- 不知道这个形容是否准确,但是容易理解和记忆吧 = =
系统 <====> 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 了,整体来说,全凭运气吧,我总觉得是因为,在面试过程中,我问面试官了一句,** “ 能否简单给我讲一下这个知识点吗?我真的很想知道!” **,多么红果果的求知欲,哈哈~
说实话,真的是运气使然,要感谢我的好基友,涛子~ 嘿嘿
明天就要正式去猎趣上班啦~ 跪求不要一日游~
网友评论