1.Android系統架構由哪幾部分組成?
Android的系統架構和其操作系統一樣,采用了分層的架構。Android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和Linux內核層。
一、應用程序
Android會同一系列核心應用程序包一起發布,該應用程序包包括客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。所有的應用程序都是使用JAVA語言編寫的。
二、應用程序框架
開發人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序都可以發布它的功能塊并且任何其它的應用程序都可以使用其所發布的功能塊(不過得遵循框架的安全性)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。
三、系統運行庫
Android 包含一些C/C++庫,這些庫能被Android系統中不同的組件使用。它們通過 Android 應用程序框架為開發者提供服務。
四、Linux內核層
Android內核是基于Linux 內核的修改的內核版本,它提供了用于支持Android平臺的設備驅動。
2.什么是MVC模式?Android開發中是否用到了MVC模式?
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式:[1]
Model(模型)表示應用程序核心(比如數據庫記錄列表)。
View(視圖)顯示數據(數據庫記錄)。
Controller(控制器)處理輸入(寫入數據庫記錄)。
V層:應用層中處理數據顯示的部分,XML布局可以視為V層,顯示Model層的數據結果。 C層:在Android中,Activity處理用戶交互問題,因此可以認為Activity是控制器,Activity讀取V視圖層的數據(eg.讀取當前EditText控件的數據),控制用戶輸入(eg.EditText控件數據的輸入),并向Model發送數據請求(eg.發起網絡請求等)。
3.請簡單解釋一下Handler通信機制。
? ?1.handler消息處理器,負責處理消息。從新建線程中向主線程發送消息
? ?2.Message消息,包含消息id、被處理的對象
? ?3.MessageQueue消息隊列,存放handler發送的Message
? ?4.Looper消息泵,不間斷的從MessageQueue中抽取消息
4.ListView如何優化?(復用,滑動流暢等)
1. ListView需要設置adapter,它的item是通過adapter的方法getView(int position, View convertView, ViewGroup parent)獲得的。
2. ListView中只有第一屏的item需要新建,它的引用會被存在RecycleBin對象內,在拖動時后面的item實際上是重從了之前創建的item。
3. 根據上述,ListView在需要顯示item時,最開始第一屏時,getView(int position, View convertView, ViewGroup parent)的第二個參數為null,顯示第二屏或者回滾顯示第一屏時,getView(int position, View convertView, ViewGroup parent)第二個參數是一個原來緩存的item,我們只需要在getView中把它內部數據更新即可。
4. 如果item結構比較復雜,在更新一個已有的item內部數據的時候,查找item內部每一個元素也需要占用不少資源,所以,可以把這些內部元素的引用緩存起來,直接對其賦值,最有效的方法是把這些引用存到對應的item中,比較好的方法是使用setTag()方法。
據上四條,可得出:
1. 在adapter的getView(int position, View convertView, ViewGroup parent)方法中,每次都new一個新的View返回,是性能最差的,浪費了ListView巧妙設計的一片苦心。
2. 如果item內部元素簡單,getView中如果傳進來的view不為空,直接為其賦值即可。
3. 如果item內部元素復雜,可以使用Google IO 大會中討論的方法優化(如下):
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時都會創建Activity,并放入任務棧中。
. singleTop
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例并放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。
. singleTask
如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
. singleInstance
在一個新棧中創建該Activity實例,并讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在于某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當于多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。
6.簡要描述觸摸事件的分發機制
7.Material Design的特點,控件等
Material Design是Google推出的一個全新的設計語言,它的特點就是擬物扁平化。
Material Design包含了很多內容,我大致把它分為四部分:
主題和布局——ANDROID L——Material Design詳解(主題和布局)
視圖和陰影——ANDROID L——Material Design詳解(視圖和陰影)
UI控件——ANDROID L——Material Design詳解(UI控件)
動畫——ANDROID L——Material Design詳解(動畫篇)
RecyclerView,CardView
RecyclerView這個控件是一個可以裝載大量的視圖集合,并且可以非常效率的進行回收和滾動。當你list中的元素經常動態改變時可以使用RecyclerView控件。
RecyclerView非常容易使用,它提供了如下兩個功能:
為每個條目位置提供了layout管理器(RecyclerView.setLayoutManager)
為每個條目設置了操作動畫(RecyclerView.setItemAnimator)
CardView繼承自FrameLayout,允許你在card視圖中顯示信息. CardView也可以設置陰影和圓角。(其實現在很多應用都自定義了Card視圖,Google這回將card視圖作為基本控件,可以拿來直接使用了)
Layout中為CardView設置圓角使用card_view:cardCornerRadius屬性
代碼中為CardView設置圓角使用CardView.setRadius方法
為CardView設置背景顏色使用card_view:cardBackgroundColor屬性
8.在什么情況下BroadcastReceiver接收不到廣播?
9.Android中有哪幾種布局,分別有什么特點
10.service的生命周期(start和bind的區別)
11.serivice和IntentService有什么區別?
主要用于后臺服務當應用程序被掛到后臺的時候,為了保證應用某些組件仍然可以工作而引入了Service這個概念,那么這里面要強調的是Service不是獨立的進程,也不是獨立的線程,它是依賴于應用程序的主線程的,在更多時候不建議在Service中編寫耗時的邏輯和操作,否則會引起ANR。這時需要引入IntentService,IntentService是繼承Service的,那么它包含了Service的全部特性,當然也包含service的生命周期,那么與service不同的是,IntentService在執行onCreate操作的時候,內部開了一個線程,去執行你的耗時操作。
IntentService:異步處理服務,新開一個線程:handlerThread在線程中發消息,然后接受處理完成后,會清理線程,并且關掉服務。
IntentService有以下特點:
(1) ?它創建了一個獨立的工作線程來處理所有的通過onStartCommand()傳遞給服務的intents。
(2) ?創建了一個工作隊列,來逐個發送intent給onHandleIntent()。
(3) ?不需要主動調用stopSelft()來結束服務。因為,在所有的intent被處理完后,系統會自動關閉服務。
(4) ?默認實現的onBind()返回null
(5) ?默認實現的onStartCommand()的目的是將intent插入到工作隊列中
12.如果有多個Activity啟動了service,怎么獲取被啟動了多少次?(onStartCommend)
13.什么是ANR,如何避免ANR?
在Android上,如果你的應用程序有一段時間響應不移靈敏,系統會向用戶提示“應用程序無響應”(ANR:application Not Responding)對話框。因此,在程序里對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。
首先來研究下為什么它會在android的應用程序里發生和如何最佳構建應用程序來避免ANR.
android應用程序通常是運行在一個單獨的線程(例如:main)里,這就意味你的應用程序所做的事情如果在主線程里占用了大長時間的話,就會引發ANR對話框,因為你的應用程序并沒有給自己機會來處理輸入事件或者Intent廣播。
因此,運行在主線程里的任何訪求都盡可能少做事情。特別是,activity應該在它的關鍵生命周期方法(onCreate()和onResume())里盡可能少的去作創建操作。潛在的耗時操作,例如網絡或數據庫操作,或者高耗時的計算如改變位圖尺寸,應該在子線程里(或者以數據庫操作為例,通過異步請求的方式)來完成。然而,不是說你的主線程阻塞在那里等待子線程的完成---也不是調用Thread.wait()或者Thread.sleep()。替代的方法是:主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。以這種方式設計你的應用程序,將能保證你的主線程保持對輸入的響應性并能避免由5秒輸入事件的超時引發的ANR對話框。這種做法應該在其它顯示UI的線程里效仿,因為它們都受相同的超時影響。
IntentReceiver執行時間的特殊限制意味著它應該做:在后臺里做小的、瑣碎的工作,如保存設定或注冊一個Notification。和在主線程里調用的其它方法一樣,應用程序應該避免在BroadcastReceiver里做耗時的操作或計算,但也不是在子線程里做這些任務(因為BroadcastReceiver的生命周期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程序應該啟動一個Service。順便提及一句,你也應該避免在Intent Receiver里啟動一個Activity,因為它會創建一個新的畫面,并從當前用戶正在運行的程序上搶奪焦點。如果你的應用程序在響應Intent廣播時需要向用戶展示什么,你應該使用Notification Manager來實現。
一般來說,在應用程序里,100到200ms是用戶能感知阻滯的時間閾值,下面總結了一些技巧來避免ANR,并有助于讓你的應用程序看起來有響應性。
如果你的應用程序為響應用戶輸入正在后臺工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)。特別是游戲,在子線程里做移動的計算。如果你的程序有一個耗時的初始化過程的話,考慮可以顯示一個Splash Screen或者快速顯示主畫面并異步來填充這些信息。在這兩種情況下,你都應該顯示正在進行的進度,以免用戶認為程序被凍結了。
14.加載圖片時出現OOM,你是這么處理的?
1、 不要加載原始大圖,根據顯示控件進行比例縮放后加載其縮略圖。
2、 不要在主線程中加載圖片,主要在listview和gridview中使用異步加載圖片是要注意處理圖片錯位和無用線程的問題。
3、 使用緩存,根據實際情況確定是否使用雙緩存和緩存大小。
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):補間動畫,給出兩個關鍵幀,通過一些算法將給定屬性值在給定的時間內在兩個關鍵幀間漸變。
View animation只能應用于View對象,而且只支持一部分屬性,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化.
另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影
20.Fragment的生命周期,分別會在什么時候調用?
Fragment生命周期分析:
當一個fragment被創建的時候,它會經歷以下狀態:
onAttach() //當fragment被加入到activity時調用(在這個方法中可以獲得所在的activity)
onCreate()
onCreateView() //當activity要得到fragment的layout時,調用此方法,fragment在其中創建自己的layout(界面)
onActivityCreated() //當activity的onCreated()方法返回后調用此方法
當這個fragment對用戶可見的時候,它會經歷以下狀態:
onStart()
onResume()
當這個fragment進入“后臺模式”的時候,它會經歷以下狀態:
onPause()
onStop()
當這個fragment被銷毀了(或者持有它的activity被銷毀了),它會經歷以下狀態:
onPause()
onStop()
onDestroyView() // 當fragment中的視圖被移除的時候,調用這個方法
onDestroy()
onDetach() //當fragment和activity分離的時候,調用這個方法
一旦activity進入resumed狀態(也就是running狀態),你就可以自由地添加和刪除fragment了。因此,只有當activity在resumed狀態時,fragment的生命周期才能獨立的運轉,其它時候是依賴于activity的生命周期變化的。
21.HttpClient和HttpUrlConnection有什么區別?
大多數的Android應用程序都會使用HTTP協議來發送和接收網絡數據,而Android中主要提供了兩種方式來進行HTTP操作,HttpURLConnection和HttpClient。這兩種方式都支持HTTPS協議、以流的形式進行上傳和下載、配置超時時間、IPv6、以及連接池等功能。