1.Android系統(tǒng)架構(gòu)由哪幾部分組成?
Android的系統(tǒng)架構(gòu)和其操作系統(tǒng)一樣,采用了分層的架構(gòu)巢块。Android分為四個層用僧,從高層到低層分別是應用程序?qū)印贸绦蚩蚣軐蛹已帷⑾到y(tǒng)運行庫層和Linux內(nèi)核層。
一、應用程序
Android會同一系列核心應用程序包一起發(fā)布作儿,該應用程序包包括客戶端,SMS短消息程序馋劈,日歷攻锰,地圖,瀏覽器妓雾,聯(lián)系人管理程序等娶吞。所有的應用程序都是使用JAVA語言編寫的。
二械姻、應用程序框架
開發(fā)人員也可以完全訪問核心應用程序所使用的API框架妒蛇。該應用程序的架構(gòu)設計簡化了組件的重用;任何一個應用程序都可以發(fā)布它的功能塊并且任何其它的應用程序都可以使用其所發(fā)布的功能塊(不過得遵循框架的安全性)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件绣夺。
三吏奸、系統(tǒng)運行庫
Android 包含一些C/C++庫,這些庫能被Android系統(tǒng)中不同的組件使用乐导。它們通過 Android 應用程序框架為開發(fā)者提供服務苦丁。
四、Linux內(nèi)核層
Android內(nèi)核是基于Linux 內(nèi)核的修改的內(nèi)核版本物臂,它提供了用于支持Android平臺的設備驅(qū)動旺拉。
2.什么是MVC模式?Android開發(fā)中是否用到了MVC模式棵磷?
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創(chuàng)建 Web 應用程序的模式:[1]
Model(模型)表示應用程序核心(比如數(shù)據(jù)庫記錄列表)蛾狗。
View(視圖)顯示數(shù)據(jù)(數(shù)據(jù)庫記錄)。
Controller(控制器)處理輸入(寫入數(shù)據(jù)庫記錄)仪媒。
V層:應用層中處理數(shù)據(jù)顯示的部分沉桌,XML布局可以視為V層,顯示Model層的數(shù)據(jù)結(jié)果算吩。 C層:在Android中留凭,Activity處理用戶交互問題,因此可以認為Activity是控制器偎巢,Activity讀取V視圖層的數(shù)據(jù)(eg.讀取當前EditText控件的數(shù)據(jù))蔼夜,控制用戶輸入(eg.EditText控件數(shù)據(jù)的輸入),并向Model發(fā)送數(shù)據(jù)請求(eg.發(fā)起網(wǎng)絡請求等)压昼。
3.請簡單解釋一下Handler通信機制求冷。
? ?1.handler消息處理器,負責處理消息窍霞。從新建線程中向主線程發(fā)送消息
? ?2.Message消息匠题,包含消息id、被處理的對象
? ?3.MessageQueue消息隊列但金,存放handler發(fā)送的Message
? ?4.Looper消息泵韭山,不間斷的從MessageQueue中抽取消息
4.ListView如何優(yōu)化?(復用傲绣,滑動流暢等)
1. ListView需要設置adapter,它的item是通過adapter的方法getView(int position, View convertView, ViewGroup parent)獲得的掠哥。
2. ListView中只有第一屏的item需要新建,它的引用會被存在RecycleBin對象內(nèi)秃诵,在拖動時后面的item實際上是重從了之前創(chuàng)建的item。
3. 根據(jù)上述塞琼,ListView在需要顯示item時菠净,最開始第一屏時,getView(int position, View convertView, ViewGroup parent)的第二個參數(shù)為null,顯示第二屏或者回滾顯示第一屏時,getView(int position, View convertView, ViewGroup parent)第二個參數(shù)是一個原來緩存的item,我們只需要在getView中把它內(nèi)部數(shù)據(jù)更新即可毅往。
4. 如果item結(jié)構(gòu)比較復雜牵咙,在更新一個已有的item內(nèi)部數(shù)據(jù)的時候,查找item內(nèi)部每一個元素也需要占用不少資源攀唯,所以洁桌,可以把這些內(nèi)部元素的引用緩存起來,直接對其賦值侯嘀,最有效的方法是把這些引用存到對應的item中另凌,比較好的方法是使用setTag()方法。
據(jù)上四條戒幔,可得出:
1. 在adapter的getView(int position, View convertView, ViewGroup parent)方法中吠谢,每次都new一個新的View返回,是性能最差的诗茎,浪費了ListView巧妙設計的一片苦心工坊。
2. 如果item內(nèi)部元素簡單,getView中如果傳進來的view不為空敢订,直接為其賦值即可王污。
3. 如果item內(nèi)部元素復雜,可以使用Google IO 大會中討論的方法優(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啟動的四種模式楚午?
. standard
模式啟動模式昭齐,每次激活Activity時都會創(chuàng)建Activity,并放入任務棧中醒叁。
. singleTop
如果在任務的棧頂正好存在該Activity的實例司浪, 就重用該實例,否者就會創(chuàng)建新的實例并放入棧頂(即使棧中已經(jīng)存在該Activity實例把沼,只要不在棧頂啊易,都會創(chuàng)建實例)。
. singleTask
如果在棧中已經(jīng)有該Activity的實例饮睬,就重用該實例(會調(diào)用實例的onNewIntent())租谈。重用時,會讓該實例回到棧頂捆愁,因此在它上面的實例將會被移除棧割去。如果棧中不存在該實例,將會創(chuàng)建新的實例放入棧中昼丑。
. singleInstance
在一個新棧中創(chuàng)建該Activity實例呻逆,并讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在于某個棧中菩帝,任何應用再激活改Activity時都會重用該棧中的實例咖城,其效果相當于多個應用程序共享一個應用茬腿,不管誰激活該Activity都會進入同一個應用中。
6.簡要描述觸摸事件的分發(fā)機制
7.Material Design的特點宜雀,控件等
Material Design是Google推出的一個全新的設計語言切平,它的特點就是擬物扁平化。
Material Design包含了很多內(nèi)容辐董,我大致把它分為四部分:
主題和布局——ANDROID L——Material Design詳解(主題和布局)
視圖和陰影——ANDROID L——Material Design詳解(視圖和陰影)
UI控件——ANDROID L——Material Design詳解(UI控件)
動畫——ANDROID L——Material Design詳解(動畫篇)
RecyclerView悴品,CardView
RecyclerView這個控件是一個可以裝載大量的視圖集合,并且可以非常效率的進行回收和滾動简烘。當你list中的元素經(jīng)常動態(tài)改變時可以使用RecyclerView控件苔严。
RecyclerView非常容易使用,它提供了如下兩個功能:
為每個條目位置提供了layout管理器(RecyclerView.setLayoutManager)
為每個條目設置了操作動畫(RecyclerView.setItemAnimator)
CardView繼承自FrameLayout夸研,允許你在card視圖中顯示信息. CardView也可以設置陰影和圓角邦蜜。(其實現(xiàn)在很多應用都自定義了Card視圖,Google這回將card視圖作為基本控件亥至,可以拿來直接使用了)
Layout中為CardView設置圓角使用card_view:cardCornerRadius屬性
代碼中為CardView設置圓角使用CardView.setRadius方法
為CardView設置背景顏色使用card_view:cardBackgroundColor屬性
8.在什么情況下BroadcastReceiver接收不到廣播悼沈?
9.Android中有哪幾種布局,分別有什么特點
10.service的生命周期(start和bind的區(qū)別)
11.serivice和IntentService有什么區(qū)別姐扮?
主要用于后臺服務當應用程序被掛到后臺的時候絮供,為了保證應用某些組件仍然可以工作而引入了Service這個概念,那么這里面要強調(diào)的是Service不是獨立的進程茶敏,也不是獨立的線程壤靶,它是依賴于應用程序的主線程的,在更多時候不建議在Service中編寫耗時的邏輯和操作惊搏,否則會引起ANR贮乳。這時需要引入IntentService,IntentService是繼承Service的恬惯,那么它包含了Service的全部特性向拆,當然也包含service的生命周期,那么與service不同的是酪耳,IntentService在執(zhí)行onCreate操作的時候浓恳,內(nèi)部開了一個線程,去執(zhí)行你的耗時操作碗暗。
IntentService:異步處理服務颈将,新開一個線程:handlerThread在線程中發(fā)消息,然后接受處理完成后言疗,會清理線程晴圾,并且關掉服務。
IntentService有以下特點:
(1) ?它創(chuàng)建了一個獨立的工作線程來處理所有的通過onStartCommand()傳遞給服務的intents噪奄。
(2) ?創(chuàng)建了一個工作隊列疑务,來逐個發(fā)送intent給onHandleIntent()沾凄。
(3) ?不需要主動調(diào)用stopSelft()來結(jié)束服務梗醇。因為知允,在所有的intent被處理完后,系統(tǒng)會自動關閉服務叙谨。
(4) ?默認實現(xiàn)的onBind()返回null
(5) ?默認實現(xiàn)的onStartCommand()的目的是將intent插入到工作隊列中
12.如果有多個Activity啟動了service温鸽,怎么獲取被啟動了多少次?(onStartCommend)
13.什么是ANR手负,如何避免ANR涤垫?
在Android上,如果你的應用程序有一段時間響應不移靈敏竟终,系統(tǒng)會向用戶提示“應用程序無響應”(ANR:application Not Responding)對話框蝠猬。因此,在程序里對響應性能的設計很重要统捶,這樣榆芦,系統(tǒng)不會顯示ANR給用戶。
首先來研究下為什么它會在android的應用程序里發(fā)生和如何最佳構(gòu)建應用程序來避免ANR.
android應用程序通常是運行在一個單獨的線程(例如:main)里喘鸟,這就意味你的應用程序所做的事情如果在主線程里占用了大長時間的話匆绣,就會引發(fā)ANR對話框,因為你的應用程序并沒有給自己機會來處理輸入事件或者Intent廣播什黑。
因此崎淳,運行在主線程里的任何訪求都盡可能少做事情。特別是愕把,activity應該在它的關鍵生命周期方法(onCreate()和onResume())里盡可能少的去作創(chuàng)建操作拣凹。潛在的耗時操作,例如網(wǎng)絡或數(shù)據(jù)庫操作恨豁,或者高耗時的計算如改變位圖尺寸嚣镜,應該在子線程里(或者以數(shù)據(jù)庫操作為例,通過異步請求的方式)來完成圣絮。然而祈惶,不是說你的主線程阻塞在那里等待子線程的完成---也不是調(diào)用Thread.wait()或者Thread.sleep()。替代的方法是:主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程扮匠。以這種方式設計你的應用程序捧请,將能保證你的主線程保持對輸入的響應性并能避免由5秒輸入事件的超時引發(fā)的ANR對話框。這種做法應該在其它顯示UI的線程里效仿棒搜,因為它們都受相同的超時影響疹蛉。
IntentReceiver執(zhí)行時間的特殊限制意味著它應該做:在后臺里做小的、瑣碎的工作力麸,如保存設定或注冊一個Notification可款。和在主線程里調(diào)用的其它方法一樣育韩,應用程序應該避免在BroadcastReceiver里做耗時的操作或計算,但也不是在子線程里做這些任務(因為BroadcastReceiver的生命周期短)闺鲸,替代的是筋讨,如果響應Intent廣播需要執(zhí)行一個耗時的動作的話,應用程序應該啟動一個Service摸恍。順便提及一句悉罕,你也應該避免在Intent Receiver里啟動一個Activity,因為它會創(chuàng)建一個新的畫面立镶,并從當前用戶正在運行的程序上搶奪焦點壁袄。如果你的應用程序在響應Intent廣播時需要向用戶展示什么,你應該使用Notification Manager來實現(xiàn)媚媒。
一般來說嗜逻,在應用程序里,100到200ms是用戶能感知阻滯的時間閾值缭召,下面總結(jié)了一些技巧來避免ANR,并有助于讓你的應用程序看起來有響應性栈顷。
如果你的應用程序為響應用戶輸入正在后臺工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)恼琼。特別是游戲妨蛹,在子線程里做移動的計算。如果你的程序有一個耗時的初始化過程的話晴竞,考慮可以顯示一個Splash Screen或者快速顯示主畫面并異步來填充這些信息蛙卤。在這兩種情況下,你都應該顯示正在進行的進度噩死,以免用戶認為程序被凍結(jié)了颤难。
14.加載圖片時出現(xiàn)OOM,你是這么處理的已维?
1行嗤、 不要加載原始大圖,根據(jù)顯示控件進行比例縮放后加載其縮略圖垛耳。
2栅屏、 不要在主線程中加載圖片,主要在listview和gridview中使用異步加載圖片是要注意處理圖片錯位和無用線程的問題堂鲜。
3栈雳、 使用緩存,根據(jù)實際情況確定是否使用雙緩存和緩存大小缔莲。
15.ViewPager如何取消預加載哥纫?
懶加載
@Override
public void onActivityCreated(Bundle savedInstanceState) {
? ?if (getUserVisibleHint() && mPullToRefreshGridView.getVisibility() != View.VISIBLE) {
? ? ? ?initData();
? ?}
? ?super.onActivityCreated(savedInstanceState);
}
16.ListView的item有不同的布局怎么處理(多type,getItemType)
17.分頁加載機制
18.在觸摸事件中痴奏,如果父控件攔截了子控件的觸摸事件蛀骇,子控件onTouchEvent方法中會傳入消息嗎厌秒?(ACTION_CANCEL)
19.Android中的動畫分為哪幾種?
android支持兩種動畫模式擅憔,tween animation,frame animation
View Animation(Tween Animation):補間動畫鸵闪,給出兩個關鍵幀,通過一些算法將給定屬性值在給定的時間內(nèi)在兩個關鍵幀間漸變雕欺。
View animation只能應用于View對象岛马,而且只支持一部分屬性,這種實現(xiàn)方式可以使視圖組件移動屠列、放大、縮小以及產(chǎn)生透明度的變化.
另一種Frame動畫伞矩,傳統(tǒng)的動畫方法笛洛,通過順序的播放排列好的圖片來實現(xiàn),類似電影
20.Fragment的生命周期乃坤,分別會在什么時候調(diào)用苛让?
Fragment生命周期分析:
當一個fragment被創(chuàng)建的時候,它會經(jīng)歷以下狀態(tài):
onAttach() //當fragment被加入到activity時調(diào)用(在這個方法中可以獲得所在的activity)
onCreate()
onCreateView() //當activity要得到fragment的layout時湿诊,調(diào)用此方法狱杰,fragment在其中創(chuàng)建自己的layout(界面)
onActivityCreated() //當activity的onCreated()方法返回后調(diào)用此方法
當這個fragment對用戶可見的時候,它會經(jīng)歷以下狀態(tài):
onStart()
onResume()
當這個fragment進入“后臺模式”的時候厅须,它會經(jīng)歷以下狀態(tài):
onPause()
onStop()
當這個fragment被銷毀了(或者持有它的activity被銷毀了)仿畸,它會經(jīng)歷以下狀態(tài):
onPause()
onStop()
onDestroyView() // 當fragment中的視圖被移除的時候,調(diào)用這個方法
onDestroy()
onDetach() //當fragment和activity分離的時候朗和,調(diào)用這個方法
一旦activity進入resumed狀態(tài)(也就是running狀態(tài))错沽,你就可以自由地添加和刪除fragment了。因此眶拉,只有當activity在resumed狀態(tài)時千埃,fragment的生命周期才能獨立的運轉(zhuǎn),其它時候是依賴于activity的生命周期變化的忆植。
21.HttpClient和HttpUrlConnection有什么區(qū)別放可?
大多數(shù)的Android應用程序都會使用HTTP協(xié)議來發(fā)送和接收網(wǎng)絡數(shù)據(jù),而Android中主要提供了兩種方式來進行HTTP操作朝刊,HttpURLConnection和HttpClient耀里。這兩種方式都支持HTTPS協(xié)議、以流的形式進行上傳和下載坞古、配置超時時間备韧、IPv6、以及連接池等功能痪枫。