軟件開發面試

1、Android面試javascript

1、 Android的四大組件是哪些,它們的做用?
答:Activity:Activity是Android程序與用戶交互的窗口,是Android構造塊中最基本的一種,它須要爲保持各界面的狀態,作不少持久化的事情,妥善管理生命週期以及一些跳轉邏輯
service:後臺服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的事物,定義好須要接受的Intent提供同步和異步的接口
Content Provider:是Android提供的第三方應用數據的訪問方案,能夠派生Content Provider類,對外提供數據,能夠像數據庫同樣進行選擇排序,屏蔽內部數據的存儲細節,向外提供統一的藉口模型,大大簡化上層應用,對數據的整合提供了更方便的途徑
BroadCast Receiver:接受一種或者多種Intent做觸發事件,接受相關消息,作一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型

2、 請介紹下Android中經常使用的五種佈局。
經常使用五種佈局方式,分別是:FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)。
1、FrameLayout:全部東西依次都放在左上角,會重疊,這個佈局比較簡單,也只能放一點比較簡單的東西。2、LinearLayout:線性佈局,每個LinearLayout裏面又可分爲垂直佈局(android:orientation="vertical")和水平佈局(android:orientation="horizontal" )。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每個元素依次向右排列。3、AbsoluteLayout:絕對佈局用X,Y座標來指定元素的位置,這種佈局方式也比較簡單,可是在屏幕旋轉時,每每會出問題,並且多個元素的時候,計算比較麻煩。4、RelativeLayout:相對佈局能夠理解爲某一個元素爲參照物,來定位的佈局方式。主要屬性有:相對於某一個元素android:layout_below、      android:layout_toLeftOf相對於父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;5、TableLayout:表格佈局,每個TableLayout裏面有表格行TableRow,TableRow裏面能夠具體定義每個元素。每個佈局都有本身適合的方式,這五個佈局元素能夠相互嵌套應用,作出美觀的界面。

3、 ListView的優化方案 答:1、若是自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否爲null,若是爲null就建立contentView並返回,若是不爲null則直接使用。在這個方法中儘量少建立view。 2、給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,能夠達到圖像數據異步加載的效果。 3、若是listview須要顯示的item不少,就要考慮分頁加載。好比一共要顯示100條或者更多的時候,咱們能夠考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。

四、activity的啓動模式有哪些?是什麼含義?

答:在android裏,有4種activity的啓動模式,分別爲:

「standard」 (默認)

「singleTop」
「singleTask」 「singleInstance」 它們主要有以下不一樣: 1. 如何決定所屬task 「standard」和」singleTop」的activity的目標task,和收到的Intent的發送者在同一個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。 若是提供了FLAG_ACTIVITY_NEW_TASK參數,會啓動到別的task裏。 「singleTask」和」singleInstance」老是把activity做爲一個task的根元素,他們不會被啓動到一個其餘task裏。 2. 是否容許多個實例 「standard」和」singleTop」能夠被實例化屢次,而且存在於不一樣的task中,且一個task能夠包括一個activity的多個實例; 「singleTask」和」singleInstance」則限制只生成一個實例,而且是task的根元素。 singleTop要求若是建立intent的時候棧頂已經有要建立的Activity的實例,則將intent發送給該實例,而不發送給新的實例。 3. 是否容許其它activity存在於本task內 「singleInstance」獨佔一個task,其它activity不能存在那個task裏;若是它啓動了一個新的activity,無論新的activity的launch mode 如何,新的activity都將會到別的task裏運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。 而另外三種模式,則能夠和其它activity共存。 4. 是否每次都生成新實例 「standard」對於沒一個啓動Intent都會生成一個activity的新實例; 「singleTop」的activity若是在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,不然,生成該activity的實例。 好比如今task棧元素爲A-B-C-D(D在棧頂),這時候給D發一個啓動intent,若是D是 「standard」的,則生成D的一個新實例,棧變爲A-B-C-D-D。 若是D是singleTop的話,則不會生產D的新實例,棧狀態仍爲A-B-C-D 若是這時候給B發Intent的話,無論B的launchmode是」standard」 仍是 「singleTop」 ,都會生成B的新實例,棧狀態變爲A-B-C-D-B。 「singleInstance」是其所在棧的惟一activity,它會每次都被重用。 「singleTask」若是在棧頂,則接受intent,不然,該intent會被丟棄,可是該task仍會回到前臺。 當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法 若是收到intent生成一個activity實例,那麼用戶能夠經過back鍵回到上一個狀態;若是是已經存在的一個activity來處理這個intent的話,用戶不能經過按back鍵返回到這以前的狀態。

五、
請描述下Activity的生命週期。

答:activity的生命週期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();
可見生命週期:從onStart()直到系統調用onStop() 前臺生命週期:從onResume()直到系統調用onPause()
六、 activity在屏幕旋轉時的生命週期 答:不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次;設置Activity的android:configChanges="orientation"時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次;設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法 十一、 如何啓用Service,如何停用Service。 服務的開發比較簡單,以下: 第一步:繼承Service類 1 public class SMSService extends Service {} 第二步:在AndroidManifest.xml文件中的<application>節點裏對服務進行配置:<service android:name=".SMSService" /> 服務不能本身運行,須要經過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法均可以啓動Service,可是它們的使用場合有所不一樣。使用startService()方法啓用服務,調用者與服務之間沒有關連,即便調用者退出了,服務仍然運行。使用bindService()方法啓用服務,調用者與服務綁定在了一塊兒,調用者一旦退出,服務也就終止,大有「不求同時生,必須同時死」的特色。 若是打算採用Context.startService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。若是調用startService()方法前服務已經被建立,屢次調用startService()方法並不會致使屢次建立服務,但會致使屢次調用onStart()方法。採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。 若是打算採用Context.bindService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一塊兒,調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。若是調用bindService()方法前服務已經被綁定,屢次調用bindService()方法並不會致使屢次建立服務及綁定(也就是說onCreate()和onBind()方法並不會被屢次調用)。若是調用者但願與正在綁定的服務解除綁定,能夠調用unbindService()方法,調用該方法也會致使系統調用服務的onUnbind()-->onDestroy()方法。 服務經常使用生命週期回調方法以下: onCreate() 該方法在服務被建立時調用,該方法只會被調用一次,不管調用多少次startService()或bindService()方法,服務也只被建立一次。 onDestroy()該方法在服務被終止時調用。 與採用Context.startService()方法啓動服務有關的生命週期方法 onStart() 只有採用Context.startService()方法啓動服務時纔會回調該方法。該方法在服務開始運行時被調用。屢次調用startService()方法儘管不會屢次建立服務,但onStart() 方法會被屢次調用。 與採用Context.bindService()方法啓動服務有關的生命週期方法 onBind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,屢次調用Context.bindService()方法並不會致使該方法被屢次調用。 onUnbind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用 十二、 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。 答:首先寫一個類要繼承BroadcastReceiver 第一種:在清單文件中聲明,添加 <receive android:name=".IncomingSMSReceiver " > <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED") <intent-filter> <receiver> 第二種使用代碼進行註冊如: IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); IncomingSMSReceiver receiver = new IncomgSMSReceiver(); registerReceiver(receiver.filter); 兩種註冊類型的區別是: 1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命週期。 2)第二種是常駐型,也就是說當應用程序關閉後,若是有信息廣播來,程序也會被系統調用自動運行。
1三、 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係。 答:簡單的說,Handler獲取當前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發和處理. Message Queue(消息隊列):用來存放經過Handler發佈的消息,一般附屬於某一個建立它的線程,能夠經過Looper.myQueue()獲得當前線程的消息隊列 Handler:能夠發佈或者處理一個消息或者操做一個Runnable,經過Handler發佈消息,消息將只會發送到與它關聯的消息隊列,然也只能處理該消息隊列中的消息 Looper:是Handler和消息隊列之間通信橋樑,程序組件首先經過Handler把消息傳遞給Looper,Looper把消息放入隊列。Looper也把消息隊列裏的消息廣播給全部的 Handler:Handler接受到消息後調用handleMessage進行處理 Message:消息的類型,在Handler類中的handleMessage方法中獲得單個的消息進行處理 在單線程模型下,爲了線程通訊問題,Android設計了一個Message Queue(消息隊列), 線程間能夠經過該Message Queue並結合Handler和Looper組件進行信息交換。下面將對它們進行分別介紹: 1. Message Message消息,理解爲線程間交流的信息,處理數據後臺線程須要更新UI,則發送Message內含一些數據給UI線程。 2. Handler Handler處理者,是Message的主要處理者,負責Message的發送,Message內容的執行處理。後臺線程就是經過傳進來的 Handler對象引用來sendMessage(Message)。而使用Handler,須要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操做內容,例如Update UI。一般須要子類化Handler來實現handleMessage方法。 3. Message Queue Message Queue消息隊列,用來存放經過Handler發佈的消息,按照先進先出執行。 每一個message queue都會有一個對應的Handler。Handler會向message queue經過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾並按先進先出執行。但經過這兩種方法發送的消息執行的方式略有不一樣:經過sendMessage發送的是一個message對象,會被 Handler的handleMessage()函數處理;而經過post方法發送的是一個runnable對象,則會本身執行。 4. Looper Looper是每條線程裏的Message Queue的管家。Android沒有Global的Message Queue,而Android會自動替主線程(UI線程)創建Message Queue,但在子線程裏並無創建Message Queue。因此調用Looper.getMainLooper()獲得的主線程的Looper不爲NULL,但調用Looper.myLooper() 獲得當前線程的Looper就有可能爲NULL。對於子線程使用Looper,API Doc提供了正確的使用方法:這個Message機制的大概流程: 1. 在Looper.loop()方法運行開始後,循環地按照接收順序取出Message Queue裏面的非NULL的Message。 2. 一開始Message Queue裏面的Message都是NULL的。當Handler.sendMessage(Message)到Message Queue,該函數裏面設置了那個Message對象的target屬性是當前的Handler對象。隨後Looper取出了那個Message,則調用 該Message的target指向的Hander的dispatchMessage函數對Message進行處理。在dispatchMessage方法裏,如何處理Message則由用戶指定,三個判斷,優先級從高到低: 1) Message裏面的Callback,一個實現了Runnable接口的對象,其中run函數作處理工做; 2) Handler裏面的mCallback指向的一個實現了Callback接口的對象,由其handleMessage進行處理; 3) 處理消息Handler對象對應的類繼承並實現了其中handleMessage函數,經過這個實現的handleMessage函數處理消息。 因而可知,咱們實現的handleMessage方法是優先級最低的! 3. Handler處理完該Message (update UI) 後,Looper則設置該Message爲NULL,以便回收! 在網上有不少文章講述主線程和其餘子線程如何交互,傳送信息,最終誰來執行處理信息之類的,我的理解是最簡單的方法——判斷Handler對象裏面的Looper對象是屬於哪條線程的,則由該線程來執行! 1. 當Handler對象的構造函數的參數爲空,則爲當前所在線程的Looper; 2. Looper.getMainLooper()獲得的是主線程的Looper對象,Looper.myLooper()獲得的是當前線程的Looper對象。
 五、說說mvc模式的原理,它在android中的運用,android的官方建議應用程序的開發採用mvc模式。何謂mvc?
mvc是model,view,cOntroller的縮寫,mvc包含三個部分:
模型(model)對象:是應用程序的主體部分,全部的業務邏輯都應該寫在該層。
視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶惟一能夠看到的一層,接收用戶的輸入,顯示處理結果。
控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給m層處理。
android鼓勵弱耦合和組件的重用,在android中mvc的具體體現以下:
1)視圖層(view):通常採用xml文件進行界面的描述,使用的時候能夠很是方便的引入,固然,若是你對android瞭解的比較的多了話,就必定能夠想到在android中也可使用JavaScript+html等的方式做爲view層,固然這裏須要進行java和javascript之間的通訊,幸運的是,android提供了它們之間很是方便的通訊實現。
2)控制層(controller):android的控制層的重任一般落在了衆多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要經過activity交割model業務邏輯層處理,這樣作的另一個緣由是android中的acitivity的響應時間是5s,若是耗時的操做放在這裏,程序就很容易被回收掉。
3)模型層(model):對數據庫的操做、對網絡等的操做都應該在model裏面處理,固然對業務計算等操做也是必須放在的該層的。

1六、 什麼是ANR 如何避免它?
答:ANR:Application Not Responding。在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應,當用戶操做的在5s內應用程序沒能作出反應,BroadcastReceiver在10秒內沒有執行完畢,就會出現應用程序無響應對話框,這既是ANR。
避免方法:Activity應該在它的關鍵生命週期方法(如onCreate()和onResume())裏儘量少的去作建立操做。潛在的耗時操做,例如網絡或數據庫操做,或者高耗時的計算如改變位圖尺寸,應該在子線程裏(或者異步方式)來完成。主線程應該爲子線程提供一個Handler,以便完成時可以提交給主線程。

1七、 什麼狀況會致使Force Close ?如何避免?可否捕獲致使其的異常?
答:程序出現異常,好比nullpointer。
避免:編寫程序時邏輯連貫,思惟縝密。能捕獲異常,在logcat中能看到異常信息
相關文章
相關標籤/搜索