1.Android系統(tǒng)架構(gòu)由哪幾部分組成?
Android的系統(tǒng)架構(gòu)和其操作系統(tǒng)一樣,采用了分層的架構(gòu)。Android分為四個(gè)層,從高層到低層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫層和Linux內(nèi)核層。
一、應(yīng)用程序
Android會(huì)同一系列核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯(lián)系人管理程序等。所有的應(yīng)用程序都是使用JAVA語言編寫的。
二、應(yīng)用程序框架
開發(fā)人員也可以完全訪問核心應(yīng)用程序所使用的API框架。該應(yīng)用程序的架構(gòu)設(shè)計(jì)簡(jiǎn)化了組件的重用;任何一個(gè)應(yīng)用程序都可以發(fā)布它的功能塊并且任何其它的應(yīng)用程序都可以使用其所發(fā)布的功能塊(不過得遵循框架的安全性)。同樣,該應(yīng)用程序重用機(jī)制也使用戶可以方便的替換程序組件。
三、系統(tǒng)運(yùn)行庫
Android 包含一些C/C++庫,這些庫能被Android系統(tǒng)中不同的組件使用。它們通過 Android 應(yīng)用程序框架為開發(fā)者提供服務(wù)。
四、Linux內(nèi)核層
Android內(nèi)核是基于Linux 內(nèi)核的修改的內(nèi)核版本,它提供了用于支持Android平臺(tái)的設(shè)備驅(qū)動(dòng)。
2.什么是MVC模式?Android開發(fā)中是否用到了MVC模式?
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設(shè)計(jì)創(chuàng)建 Web 應(yīng)用程序的模式:[1]
Model(模型)表示應(yīng)用程序核心(比如數(shù)據(jù)庫記錄列表)。
View(視圖)顯示數(shù)據(jù)(數(shù)據(jù)庫記錄)。
Controller(控制器)處理輸入(寫入數(shù)據(jù)庫記錄)。
V層:應(yīng)用層中處理數(shù)據(jù)顯示的部分,XML布局可以視為V層,顯示Model層的數(shù)據(jù)結(jié)果。 C層:在Android中,Activity處理用戶交互問題,因此可以認(rèn)為Activity是控制器,Activity讀取V視圖層的數(shù)據(jù)(eg.讀取當(dāng)前EditText控件的數(shù)據(jù)),控制用戶輸入(eg.EditText控件數(shù)據(jù)的輸入),并向Model發(fā)送數(shù)據(jù)請(qǐng)求(eg.發(fā)起網(wǎng)絡(luò)請(qǐng)求等)。
3.請(qǐng)簡(jiǎn)單解釋一下Handler通信機(jī)制。
? ?1.handler消息處理器,負(fù)責(zé)處理消息。從新建線程中向主線程發(fā)送消息
? ?2.Message消息,包含消息id、被處理的對(duì)象
? ?3.MessageQueue消息隊(duì)列,存放handler發(fā)送的Message
? ?4.Looper消息泵,不間斷的從MessageQueue中抽取消息
4.ListView如何優(yōu)化?(復(fù)用,滑動(dòng)流暢等)
1. ListView需要設(shè)置adapter,它的item是通過adapter的方法getView(int position, View convertView, ViewGroup parent)獲得的。
2. ListView中只有第一屏的item需要新建,它的引用會(huì)被存在RecycleBin對(duì)象內(nèi),在拖動(dòng)時(shí)后面的item實(shí)際上是重從了之前創(chuàng)建的item。
3. 根據(jù)上述,ListView在需要顯示item時(shí),最開始第一屏?xí)r,getView(int position, View convertView, ViewGroup parent)的第二個(gè)參數(shù)為null,顯示第二屏或者回滾顯示第一屏?xí)r,getView(int position, View convertView, ViewGroup parent)第二個(gè)參數(shù)是一個(gè)原來緩存的item,我們只需要在getView中把它內(nèi)部數(shù)據(jù)更新即可。
4. 如果item結(jié)構(gòu)比較復(fù)雜,在更新一個(gè)已有的item內(nèi)部數(shù)據(jù)的時(shí)候,查找item內(nèi)部每一個(gè)元素也需要占用不少資源,所以,可以把這些內(nèi)部元素的引用緩存起來,直接對(duì)其賦值,最有效的方法是把這些引用存到對(duì)應(yīng)的item中,比較好的方法是使用setTag()方法。
據(jù)上四條,可得出:
1. 在adapter的getView(int position, View convertView, ViewGroup parent)方法中,每次都new一個(gè)新的View返回,是性能最差的,浪費(fèi)了ListView巧妙設(shè)計(jì)的一片苦心。
2. 如果item內(nèi)部元素簡(jiǎn)單,getView中如果傳進(jìn)來的view不為空,直接為其賦值即可。
3. 如果item內(nèi)部元素復(fù)雜,可以使用Google IO 大會(huì)中討論的方法優(yōu)化(如下):
publicView getView(intposition, View convertView, ViewGroup parent) {
? ?ViewHolder holder;
? ?if (convertView == null) {
? ? ? ?convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
? ? ? ?holder = new ViewHolder();
? ? ? ?holder.icon1 = (ImageView) convertView.findViewById(R.id.icon1);
? ? ? ?holder.text1 = (TextView) convertView.findViewById(R.id.text1);
? ? ? ?convertView.setTag(holder);
? ?}
? ?else{
? ? ? ?holder = (ViewHolder)convertView.getTag();
? ?}
? ?holder.icon1.setImageResource(R.drawable.icon);
? ?holder.text1.setText(mData[position]);
? ?return holder;
}
static class ViewHolder {
? ?TextView text1;
? ?ImageView icon1;
}
5.Activity啟動(dòng)的四種模式?
. standard
模式啟動(dòng)模式,每次激活A(yù)ctivity時(shí)都會(huì)創(chuàng)建Activity,并放入任務(wù)棧中。
. singleTop
如果在任務(wù)的棧頂正好存在該Activity的實(shí)例, 就重用該實(shí)例,否者就會(huì)創(chuàng)建新的實(shí)例并放入棧頂(即使棧中已經(jīng)存在該Activity實(shí)例,只要不在棧頂,都會(huì)創(chuàng)建實(shí)例)。
. singleTask
如果在棧中已經(jīng)有該Activity的實(shí)例,就重用該實(shí)例(會(huì)調(diào)用實(shí)例的onNewIntent())。重用時(shí),會(huì)讓該實(shí)例回到棧頂,因此在它上面的實(shí)例將會(huì)被移除棧。如果棧中不存在該實(shí)例,將會(huì)創(chuàng)建新的實(shí)例放入棧中。
. singleInstance
在一個(gè)新棧中創(chuàng)建該Activity實(shí)例,并讓多個(gè)應(yīng)用共享改棧中的該Activity實(shí)例。一旦改模式的Activity的實(shí)例存在于某個(gè)棧中,任何應(yīng)用再激活改Activity時(shí)都會(huì)重用該棧中的實(shí)例,其效果相當(dāng)于多個(gè)應(yīng)用程序共享一個(gè)應(yīng)用,不管誰激活該Activity都會(huì)進(jìn)入同一個(gè)應(yīng)用中。
6.簡(jiǎn)要描述觸摸事件的分發(fā)機(jī)制

7.Material Design的特點(diǎn),控件等
Material Design是Google推出的一個(gè)全新的設(shè)計(jì)語言,它的特點(diǎn)就是擬物扁平化。
Material Design包含了很多內(nèi)容,我大致把它分為四部分:
主題和布局——ANDROID L——Material Design詳解(主題和布局)
視圖和陰影——ANDROID L——Material Design詳解(視圖和陰影)
UI控件——ANDROID L——Material Design詳解(UI控件)
動(dòng)畫——ANDROID L——Material Design詳解(動(dòng)畫篇)
RecyclerView,CardView
RecyclerView這個(gè)控件是一個(gè)可以裝載大量的視圖集合,并且可以非常效率的進(jìn)行回收和滾動(dòng)。當(dāng)你list中的元素經(jīng)常動(dòng)態(tài)改變時(shí)可以使用RecyclerView控件。
RecyclerView非常容易使用,它提供了如下兩個(gè)功能:
為每個(gè)條目位置提供了layout管理器(RecyclerView.setLayoutManager)
為每個(gè)條目設(shè)置了操作動(dòng)畫(RecyclerView.setItemAnimator)
CardView繼承自FrameLayout,允許你在card視圖中顯示信息. CardView也可以設(shè)置陰影和圓角。(其實(shí)現(xiàn)在很多應(yīng)用都自定義了Card視圖,Google這回將card視圖作為基本控件,可以拿來直接使用了)
Layout中為CardView設(shè)置圓角使用card_view:cardCornerRadius屬性
代碼中為CardView設(shè)置圓角使用CardView.setRadius方法
為CardView設(shè)置背景顏色使用card_view:cardBackgroundColor屬性
8.在什么情況下BroadcastReceiver接收不到廣播?
9.Android中有哪幾種布局,分別有什么特點(diǎn)
10.service的生命周期(start和bind的區(qū)別)
11.serivice和IntentService有什么區(qū)別?
主要用于后臺(tái)服務(wù)當(dāng)應(yīng)用程序被掛到后臺(tái)的時(shí)候,為了保證應(yīng)用某些組件仍然可以工作而引入了Service這個(gè)概念,那么這里面要強(qiáng)調(diào)的是Service不是獨(dú)立的進(jìn)程,也不是獨(dú)立的線程,它是依賴于應(yīng)用程序的主線程的,在更多時(shí)候不建議在Service中編寫耗時(shí)的邏輯和操作,否則會(huì)引起ANR。這時(shí)需要引入IntentService,IntentService是繼承Service的,那么它包含了Service的全部特性,當(dāng)然也包含service的生命周期,那么與service不同的是,IntentService在執(zhí)行onCreate操作的時(shí)候,內(nèi)部開了一個(gè)線程,去執(zhí)行你的耗時(shí)操作。
IntentService:異步處理服務(wù),新開一個(gè)線程:handlerThread在線程中發(fā)消息,然后接受處理完成后,會(huì)清理線程,并且關(guān)掉服務(wù)。
IntentService有以下特點(diǎn):
(1) ?它創(chuàng)建了一個(gè)獨(dú)立的工作線程來處理所有的通過onStartCommand()傳遞給服務(wù)的intents。
(2) ?創(chuàng)建了一個(gè)工作隊(duì)列,來逐個(gè)發(fā)送intent給onHandleIntent()。
(3) ?不需要主動(dòng)調(diào)用stopSelft()來結(jié)束服務(wù)。因?yàn)?,在所有的intent被處理完后,系統(tǒng)會(huì)自動(dòng)關(guān)閉服務(wù)。
(4) ?默認(rèn)實(shí)現(xiàn)的onBind()返回null
(5) ?默認(rèn)實(shí)現(xiàn)的onStartCommand()的目的是將intent插入到工作隊(duì)列中
12.如果有多個(gè)Activity啟動(dòng)了service,怎么獲取被啟動(dòng)了多少次?(onStartCommend)
13.什么是ANR,如何避免ANR?
在Android上,如果你的應(yīng)用程序有一段時(shí)間響應(yīng)不移靈敏,系統(tǒng)會(huì)向用戶提示“應(yīng)用程序無響應(yīng)”(ANR:application Not Responding)對(duì)話框。因此,在程序里對(duì)響應(yīng)性能的設(shè)計(jì)很重要,這樣,系統(tǒng)不會(huì)顯示ANR給用戶。
首先來研究下為什么它會(huì)在android的應(yīng)用程序里發(fā)生和如何最佳構(gòu)建應(yīng)用程序來避免ANR.
android應(yīng)用程序通常是運(yùn)行在一個(gè)單獨(dú)的線程(例如:main)里,這就意味你的應(yīng)用程序所做的事情如果在主線程里占用了大長(zhǎng)時(shí)間的話,就會(huì)引發(fā)ANR對(duì)話框,因?yàn)槟愕膽?yīng)用程序并沒有給自己機(jī)會(huì)來處理輸入事件或者Intent廣播。
因此,運(yùn)行在主線程里的任何訪求都盡可能少做事情。特別是,activity應(yīng)該在它的關(guān)鍵生命周期方法(onCreate()和onResume())里盡可能少的去作創(chuàng)建操作。潛在的耗時(shí)操作,例如網(wǎng)絡(luò)或數(shù)據(jù)庫操作,或者高耗時(shí)的計(jì)算如改變位圖尺寸,應(yīng)該在子線程里(或者以數(shù)據(jù)庫操作為例,通過異步請(qǐng)求的方式)來完成。然而,不是說你的主線程阻塞在那里等待子線程的完成---也不是調(diào)用Thread.wait()或者Thread.sleep()。替代的方法是:主線程應(yīng)該為子線程提供一個(gè)Handler,以便完成時(shí)能夠提交給主線程。以這種方式設(shè)計(jì)你的應(yīng)用程序,將能保證你的主線程保持對(duì)輸入的響應(yīng)性并能避免由5秒輸入事件的超時(shí)引發(fā)的ANR對(duì)話框。這種做法應(yīng)該在其它顯示UI的線程里效仿,因?yàn)樗鼈兌际芟嗤某瑫r(shí)影響。
IntentReceiver執(zhí)行時(shí)間的特殊限制意味著它應(yīng)該做:在后臺(tái)里做小的、瑣碎的工作,如保存設(shè)定或注冊(cè)一個(gè)Notification。和在主線程里調(diào)用的其它方法一樣,應(yīng)用程序應(yīng)該避免在BroadcastReceiver里做耗時(shí)的操作或計(jì)算,但也不是在子線程里做這些任務(wù)(因?yàn)锽roadcastReceiver的生命周期短),替代的是,如果響應(yīng)Intent廣播需要執(zhí)行一個(gè)耗時(shí)的動(dòng)作的話,應(yīng)用程序應(yīng)該啟動(dòng)一個(gè)Service。順便提及一句,你也應(yīng)該避免在Intent Receiver里啟動(dòng)一個(gè)Activity,因?yàn)樗鼤?huì)創(chuàng)建一個(gè)新的畫面,并從當(dāng)前用戶正在運(yùn)行的程序上搶奪焦點(diǎn)。如果你的應(yīng)用程序在響應(yīng)Intent廣播時(shí)需要向用戶展示什么,你應(yīng)該使用Notification Manager來實(shí)現(xiàn)。
一般來說,在應(yīng)用程序里,100到200ms是用戶能感知阻滯的時(shí)間閾值,下面總結(jié)了一些技巧來避免ANR,并有助于讓你的應(yīng)用程序看起來有響應(yīng)性。
如果你的應(yīng)用程序?yàn)轫憫?yīng)用戶輸入正在后臺(tái)工作的話,可以顯示工作的進(jìn)度(ProgressBar和ProgressDialog對(duì)這種情況來說很有用)。特別是游戲,在子線程里做移動(dòng)的計(jì)算。如果你的程序有一個(gè)耗時(shí)的初始化過程的話,考慮可以顯示一個(gè)Splash Screen或者快速顯示主畫面并異步來填充這些信息。在這兩種情況下,你都應(yīng)該顯示正在進(jìn)行的進(jìn)度,以免用戶認(rèn)為程序被凍結(jié)了。
14.加載圖片時(shí)出現(xiàn)OOM,你是這么處理的?
1、 不要加載原始大圖,根據(jù)顯示控件進(jìn)行比例縮放后加載其縮略圖。
2、 不要在主線程中加載圖片,主要在listview和gridview中使用異步加載圖片是要注意處理圖片錯(cuò)位和無用線程的問題。
3、 使用緩存,根據(jù)實(shí)際情況確定是否使用雙緩存和緩存大小。
15.ViewPager如何取消預(yù)加載?
懶加載
@Override
public void onActivityCreated(Bundle savedInstanceState) {
? ?if (getUserVisibleHint() && mPullToRefreshGridView.getVisibility() != View.VISIBLE) {
? ? ? ?initData();
? ?}
? ?super.onActivityCreated(savedInstanceState);
}
16.ListView的item有不同的布局怎么處理(多type,getItemType)
17.分頁加載機(jī)制
18.在觸摸事件中,如果父控件攔截了子控件的觸摸事件,子控件onTouchEvent方法中會(huì)傳入消息嗎?(ACTION_CANCEL)
19.Android中的動(dòng)畫分為哪幾種?
android支持兩種動(dòng)畫模式,tween animation,frame animation
View Animation(Tween Animation):補(bǔ)間動(dòng)畫,給出兩個(gè)關(guān)鍵幀,通過一些算法將給定屬性值在給定的時(shí)間內(nèi)在兩個(gè)關(guān)鍵幀間漸變。
View animation只能應(yīng)用于View對(duì)象,而且只支持一部分屬性,這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng)、放大、縮小以及產(chǎn)生透明度的變化.
另一種Frame動(dòng)畫,傳統(tǒng)的動(dòng)畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影
20.Fragment的生命周期,分別會(huì)在什么時(shí)候調(diào)用?

Fragment生命周期分析:
當(dāng)一個(gè)fragment被創(chuàng)建的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài):
onAttach() //當(dāng)fragment被加入到activity時(shí)調(diào)用(在這個(gè)方法中可以獲得所在的activity)
onCreate()
onCreateView() //當(dāng)activity要得到fragment的layout時(shí),調(diào)用此方法,fragment在其中創(chuàng)建自己的layout(界面)
onActivityCreated() //當(dāng)activity的onCreated()方法返回后調(diào)用此方法
當(dāng)這個(gè)fragment對(duì)用戶可見的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài):
onStart()
onResume()
當(dāng)這個(gè)fragment進(jìn)入“后臺(tái)模式”的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài):
onPause()
onStop()
當(dāng)這個(gè)fragment被銷毀了(或者持有它的activity被銷毀了),它會(huì)經(jīng)歷以下狀態(tài):
onPause()
onStop()
onDestroyView() // 當(dāng)fragment中的視圖被移除的時(shí)候,調(diào)用這個(gè)方法
onDestroy()
onDetach() //當(dāng)fragment和activity分離的時(shí)候,調(diào)用這個(gè)方法
一旦activity進(jìn)入resumed狀態(tài)(也就是running狀態(tài)),你就可以自由地添加和刪除fragment了。因此,只有當(dāng)activity在resumed狀態(tài)時(shí),fragment的生命周期才能獨(dú)立的運(yùn)轉(zhuǎn),其它時(shí)候是依賴于activity的生命周期變化的。
21.HttpClient和HttpUrlConnection有什么區(qū)別?
大多數(shù)的Android應(yīng)用程序都會(huì)使用HTTP協(xié)議來發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù),而Android中主要提供了兩種方式來進(jìn)行HTTP操作,HttpURLConnection和HttpClient。這兩種方式都支持HTTPS協(xié)議、以流的形式進(jìn)行上傳和下載、配置超時(shí)時(shí)間、IPv6、以及連接池等功能。