Android 基礎(chǔ)面試題目

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、以及連接池等功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,996評(píng)論 25 709
  • Android Studio JNI流程首先在java代碼聲明本地方法 用到native關(guān)鍵字 本地方法不用去實(shí)現(xiàn)...
    MigrationUK閱讀 12,088評(píng)論 7 123
  • 第六章 天武九年新年 在中州洋溢著喜慶的時(shí)候,穹漠籠罩在一種不安地氣氛中。兩種力量的抗衡擺到了臺(tái)面上,青國(guó)不再向鷹...
    琴微嵐閱讀 625評(píng)論 0 1
  • 我一直認(rèn)為,能給一件事情真正的做好,做大,做強(qiáng),一定不是一個(gè)人能夠完成的,有些路只能一個(gè)人走,有些夢(mèng)卻可以一群人做...
    蘇思羽閱讀 361評(píng)論 0 0

友情鏈接更多精彩內(nèi)容