前言
昨天(很久之前 = =)哲鸳,很意外的接到了獵趣的電話,直奔主題就開始面試了盔憨,我都不知道我投過這家公司徙菠,后來才知道,是朋友推薦的郁岩。面試官人很好婿奔,問的問題分了 Java,Android 兩類问慎,從簡單到深入萍摊,一點一點來,事后如叼,我覺得這是很難得的經(jīng)歷冰木,打算記錄下來,以備后用。
Android 問題
- Activity 生命周期踊沸,以及簡單分析一下歇终,從 A 跳轉(zhuǎn)到 B,在從 B(點擊虛擬 Back 鍵)回到 A 逼龟,Activity A评凝,B,分別執(zhí)行了哪些方法审轮?
- 簡要描述一下 Activity 的啟動模式肥哎。
- 你是怎么理解 Android 的 Android 異步消息處理機制,(如果基本回答出來了疾渣,會繼續(xù)問你,對于 Looper 的理解崖飘,以及榴捡,MessageQueue 是什么時候創(chuàng)建的?)
- 說一說朱浴,Window吊圾,Activity,View 三者的關(guān)系翰蠢。
- 說一下项乒,你知道的幾種常用動畫類型,及其本質(zhì)的區(qū)別梁沧。
- 實現(xiàn) View 的滑動檀何,有哪幾種方法?(如果你回答出了廷支,ScrollTo()频鉴,和ScrollBy(),會問你這倆的區(qū)別恋拍,以及都繼承自什么垛孔?)
下面我一個一個整理資料,為自己做一個總結(jié)施敢。
1周荐, Activity 生命周期
onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy();
還有一個 onRestart()僵娃;這個基本沒有什么問題概作,額外提一句 ** onNewIntent() ** 雖然不屬于生命周期,但是有的公司面試悯许,也會問到仆嗦。
接下來是,Activity A先壕,B瘩扼,分別執(zhí)行了哪些方法谆甜?順序如下:
- 啟動 A : onCreate() —> onStart() —> onResume(), A 進入運行狀態(tài)集绰。
- 跳轉(zhuǎn)至 B :
- A 先執(zhí)行:onPause()
- B 再執(zhí)行:onCreate() -> onStart() -> onResume()
- A 再執(zhí)行:onStop()
- 從 B 返回 A:
- B 先執(zhí)行:onPause()
- A 再執(zhí)行:onRestart() -> onStart() -> onResume()
- B 再執(zhí)行:onStop() -> onDestroy()
2规辱,Activity 的 4 種啟動模式
android:launchMode="standard | singleTop | singleTask | singleInstance"
先簡單描述一下 Activity 任務(wù)棧:任務(wù)棧是一種后進先出的結(jié)構(gòu),每個 APP 默認(rèn)只有一個棧栽燕,以APP的包名來命名罕袋。
-
standard
: 標(biāo)準(zhǔn)模式,每次啟動 Activity 都會創(chuàng)建一個新的實例碍岔,并且將其壓入任務(wù)棧棧頂浴讯,不管這個 Activity 是否已經(jīng)存在。每次onCreate() -> onStart() -> onResume()
都會執(zhí)行蔼啦; -
singleTop
: 棧頂復(fù)用模式榆纽,跳轉(zhuǎn)前,會先檢查新的 Activity 是否已在棧頂捏肢,如果在奈籽,就不會創(chuàng)建新的實例,只會調(diào)用onNewIntent()
方法鸵赫;反之衣屏,如果不在棧頂洞拨, 則與 standard 模式一樣膊爪; -
singleTask
:棧內(nèi)復(fù)用模式碱工,顧名思義争占,就是要保證棧內(nèi)只有一個實例存在键菱。跳轉(zhuǎn)前霎迫,會先檢查棧內(nèi)是否已存在該實例孤紧,若存在亿遂,則會將其上方的所有實例清除掉卖局,并調(diào)用 onNewIntent() 方法斧蜕,使其出現(xiàn)在棧頂; -
singleInstance
:和singleTask
很像砚偶,也有單例的作用批销,不同的是,會單獨創(chuàng)建一個新的任務(wù)棧染坯,歸 singleInstance activity 獨有均芽。這種模式應(yīng)用場景非常少,比如 “ 呼叫來電界面 ” 和 “ QQ 等第三方登錄界面 ”单鹿。
3掀宋,異步消息處理機制
關(guān)于這個問題,我就不獻丑了,我也是仔細閱讀了 鴻洋 郭霖 大神的博客劲妙,才差不多懂了湃鹊,雙手奉上鏈接:
Android 異步消息處理機制 讓你深入理解 Looper、Handler镣奋、Message三者關(guān)系
Android異步消息處理機制完全解析币呵,帶你從源碼的角度徹底理解
在此之前,我一直認(rèn)為侨颈,Looper 就是一個 while(true) 的循環(huán)體余赢,真是尷尬 = =!
在這里總結(jié)一下哈垢,防止自己又忘了:
Looper 內(nèi)部有兩個重要的方法:prepare() 和 loop()妻柒;
- prepare() :準(zhǔn)備,就緒的意思温赔,作用為蛤奢,保證保證一個線程中只有一個 Looper 實例;
- Looper():構(gòu)造方法陶贼,創(chuàng)造了 MessageQueue(消息隊列);
- loop():不斷從 MessageQueue 中去取消息待秃,交給消息的 target 屬性(即拜秧,Handler)的 dispatchMessage() 去處理。
另外章郁,面試官還問我枉氮,子線程中能不能創(chuàng)建 Handler,一臉懵逼 = =
// 這是官方的標(biāo)準(zhǔn)寫法
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
坦白說,這個是我從來沒有研究過的問題肩钠,被問到時泣港,第一反應(yīng)是懵逼 = =,但是也不能直接說不知道价匠,真尷尬当纱,瞎扯了一會兒,然后面試官說踩窖,回答錯了坡氯,我坦率地問了一句,“能否簡單給我講一下這個知識點嗎?我真的很想知道箫柳!”手形,沒想到面試官真的回答,我很驚訝滞时,對這個公司的印象分叁幢,一下子上升了好大一截 ^ ^
時間過去了快2個禮拜,我只隱約記得坪稽,說:Window 是 容器曼玩;View 是視圖,畫布窒百;而 Activity 可以看作是控制器黍判,將 View 和 Window 關(guān)聯(lián)在一起,這三者的關(guān)系有點像
MVC篙梢,你去讀一讀 setContentView()
的源碼顷帖,就知道了。
不得不說渤滞,我閱讀源碼的能力贬墩,很是很弱的 = =,于是乎妄呕,我借鑒了以下文章:
理清Activity陶舞、View及Window之間關(guān)系
Activity、View绪励、Window的理解
特別是后一篇肿孵,是我極偶然看到的(已經(jīng)忘記是怎么搜到的了),大家有興趣自己去看疏魏,我只簡單總結(jié)一下:
- Window:一個 App 中有多個 Window停做,大小可自定義,作為盛放
View 的容器大莫; - View:UI組件蛉腌;
- Avtivity:關(guān)聯(lián) Window 和 View 的存在,用于控制 Window 下的 View-Tree葵硕;
- 不知道這個形容是否準(zhǔn)確眉抬,但是容易理解和記憶吧 = =
系統(tǒng) <====> Window <====> Activity <====> View
國家 <====> 房地產(chǎn)商 <====> 物業(yè) <====> 居民
** 國家分配地皮給房地產(chǎn)商用以建造房屋,房地產(chǎn)商利用物業(yè)去管理居住在此的居民懈凹。 **
5蜀变,動畫
關(guān)于這個,我只是會用而已介评,強烈建議库北,仔細閱讀以下** 郭霖大神 **的文章爬舰,我陸陸續(xù)續(xù)看完了,也實踐過寒瓦,但是不經(jīng)常用情屹,就又忘記了 = =
Android屬性動畫完全解析(上),初識屬性動畫的基本用法
Android屬性動畫完全解析(中)杂腰,ValueAnimator和ObjectAnimator的高級用法
Android屬性動畫完全解析(下)垃你,Interpolator和ViewPropertyAnimator的用法
簡單回答,面試問題:
三種:逐幀動畫(frame-by-frame animation)喂很,補間動畫(tweened animation)惜颇,和屬性動畫(property animation)。
區(qū)別:補間動畫少辣,只是重新繪制了而已凌摄,其屬性并未改變;屬性動畫漓帅,則是直接改變了其屬性锨亏。
6,實現(xiàn) View 滑動的幾種方式(隨手指滑動)
隨手指滑動忙干,基本都是用到 onTouchEvent()
這個我就不多說了器予,我知道的有以下幾種方式:
-
layout(left, top, right, bottom)
; -
offsetLeftAndRight(x)
和offsetTopAndBottom(y)
捐迫,其實就是對layout
做了一層封裝而已劣摇; -
setLayoutParams(lp)
這個,在做 View 位置微調(diào)的時候用過弓乙; -
scrollTo()
和scrollBy()
這個,稍微麻煩一點钧惧,我多說兩句:- 顧名思義暇韧,To 就是移動到某個坐標(biāo)點,By 不好直譯浓瞪,作用是懈玻,在原有位置在添加一個偏移量;
- View.scrollTo() or View.scrollBy()乾颁,** 作用對象是涂乌,View 的內(nèi)容 **,如 TextView 移動的是文字英岭;
- ViewGroup.scrollTo() or ViewGroup.scrollBy()湾盒,** 作用的對象是,所有子 View **诅妹;
- 屬性動畫咯~ 個人感覺最好用罚勾,最容易~ 嘿嘿
** 以下是我所不知道的毅人,連聽都沒聽說過,真是孤陋寡聞啊 = = **
-
Scroller
尖殃,通過 Scroller 類來實現(xiàn)一些平滑的動畫效果丈莺,可以設(shè)置動畫時間等; -
ViewDragHelper
送丰,經(jīng)典例子就是缔俄,側(cè)滑菜單;
哦器躏,忘記了說了俐载,scrollTo()
和 scrollBy()
分別繼承自什么?面試官好壞邀桑,還挖坑 = =瞎疼,“ 分別 ”,明明都繼承自 View 類壁畸,哼~
再提一句贼急,scrollBy()
內(nèi)部調(diào)用了 scrollTo()
;
后記
這一篇拖得比較久捏萍,快兩個禮拜了太抓,真是抱歉,拖延癥犯了 = =
主要原因了令杈,我從西安去北京了~走敌,原因是什么,大家應(yīng)該猜到了逗噩,嘻嘻掉丽,沒錯,我收到 Offer 了异雁,整體來說捶障,全憑運氣吧,我總覺得是因為纲刀,在面試過程中项炼,我問面試官了一句,** “ 能否簡單給我講一下這個知識點嗎示绊?我真的很想知道锭部!” **,多么紅果果的求知欲面褐,哈哈~
說實話拌禾,真的是運氣使然,要感謝我的好基友盆耽,濤子~ 嘿嘿
明天就要正式去獵趣上班啦~ 跪求不要一日游~