標籤:
下面的問題是在網上找到的總結,感謝您分享!希望,我們的共同進步,找到自己心儀的公司,:
1.android dvm 流程和Linux這個過程。無論是應用程式對同一概念:
答案:dvm是dalivk虛擬機器。每個android應用程式都在自己的進程中執行,都擁有一個dalivk虛擬機器執行個體。而每個dvm都是在linux的一個進程。所以說能夠覺得是同一個概念。
2.android的動畫有哪幾種?他們的特點和差別是什嗎?
答:兩種,一種是tween動畫,一種是frame動畫。
tween動畫,這樣的實現方式能夠使視圖組件移動,放大或縮小以及產生透明度的變化。frame動畫。傳統的動畫方法,通過順序的播放排列好的圖片來實現。類似電影。
3.handler進位的原理:
答:android提供了handler和looper來滿足線程間的通訊。
Handler先進先出原則。
looper用來管理特定線程內對象之間的訊息交換(message Exchange).
1)looper:一個線程能夠產生一個looper對象,由它來管理此線程裡的message queue(訊息佇列)
2)handler:你能夠構造一個handler對象來與looper溝通,以便push新訊息到messagequeue裡。或者接收looper(從messagequeue裡取出)所送來的訊息。
3)messagequeue:用來存放線程放入的訊息。
4)線程:UI thread 通常就是main thread,而android啟動程式時會為它建立一個message queue.
4.android view的重新整理:
答:Android中對View的更新有非常多種方式。使用時要區分不同的應用場合。
我感覺最要緊的是分清:多線程和雙緩衝的使用方式。
1).不使用多線程和雙緩衝
這樣的情況最簡單了,一般僅僅是希望在View發生改變時對UI進行重繪。你僅僅需在Activity中顯式地調用View對象中的invalidate()方法就可以。
系統會自己主動調用 View的onDraw()方法。
2).使用多線程和不使用雙緩衝
這樣的情況須要開啟新的線程,新開的線程就不好訪問View對象了。強行訪問的話會報:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.
這時候你須要建立一個繼承了android.os.Handler的子類。並重寫handleMessage(Messagemsg)方法。android.os.Handler是能發送和處理訊息的,你須要在Activity中發出更新UI的訊息,然後再你的Handler(能夠使用匿名內部類)中處理訊息(由於匿名內部類能夠訪問父類變數,你能夠直接調用View對象中的invalidate()方法 )。也就是說:在新線程建立並發送一個Message。然後再主線程中捕獲、處理該訊息。
3).使用多線程和雙緩衝
Android中SurfaceView是View的子類,她同一時候也實現了雙緩衝。
你能夠定義一個她的子類並實現SurfaceHolder.Callback介面。
因為實現SurfaceHolder.Callback介面。新線程就不須要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法能夠鎖定畫布,繪製玩新的映像後調用unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。
5.說說mvc模式的原理,它在android中的運用:
答:android的官方建議應用程式的開發採用mvc模式。
何謂mvc?
mvc是model,view,controller的縮寫,mvc包括三個部分:
l模型(model)對象:是應用程式的主體部分,全部的商務邏輯都應該寫在該層。
2視圖(view)對象:是應用程式中負責產生使用者介面的部分。也是在整個mvc架構中使用者唯一能夠看到的一層。接收使用者的輸入,顯示處理結果。
3控制器(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。假設耗時的操作放在這裡,程式就非常easy被回收掉。
3)模型層(model):對資料庫的操作、對網路等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。
6.Activity的生命週期:
答:onCreate: 在這裡建立介面,做一些資料 的初始化工作
onStart: 到這一步變成使用者可見不可互動的
onResume:變成和使用者可互動 的。(在activity 棧系統通過棧的方式管理這些個Activity的最上面。執行完彈出棧,則回到上一個Activity)
onPause: 到這一步是可見但不可互動的,系統會停止動畫 等消耗CPU 的事情從上文的描寫敘述已經知道,應該在這裡儲存你的一些資料,由於這個時候你的程式的優先順序減少,有可能被系統收回。在這裡儲存的資料。應該在
onstop: 變得不可見。被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被呼叫者法了。可能是外面類調用finish方法或者是系統為了節省空間的將它臨時性的幹掉
7.讓Activity變成一個表單:
答:Activity屬性設定:有時候會做個應用程式是漂浮在手機主介面的。
這個僅僅須要在設定下Activity的主題theme,即在Manifest.xml定義Activity的地方加一句:
android :theme="@android:style/Theme.Dialog"
假設是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中經常使用的五種布局:
答:LinearLayout線性布局;AbsoluteLayout絕對布局;TableLayout表格布局;RelativeLayout相對布局。FrameLayout幀布局。
9.Android的五種資料存放區方式:
答:sharedPreferences。檔案;SQLite;contentProvider。網路
10.請解釋下在單執行緒模式中Message、Handler、Message Queue、Looper之間的關係:
答:Handler擷取當前線程中的looper對象,looper用來從存有Message的Message Queue裡取出message,再由Handler進行message的分發和處理。
11.AIDL的全稱是什麼?怎樣工作?能處理哪些類型的資料?
答:AIDL(AndroidInterface Definition Language)android介面描寫敘述語言
12.系統上安裝了多種瀏覽器。是否能指定某瀏覽器訪問指定頁面?請說明原由:
答:通過直接發送Uri把參數帶過去。或者通過manifest裡的intentfilter裡的data屬性。
代碼例如以下:
Intent intent = new Intent();
Intent.setAction(“android.intent.action.View”);
Uri uriBrowsers = Uri.parse(“http://www.sina.com.cn”);
Intent.setData(uriBrowsers);
//包名、要開啟的activity
intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);
startActivity(intent);
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.什麼情況會導致Force Close?怎樣避免?是否能捕獲導致其的異常?
答:如null 指標等能夠導致ForceClose;能夠看Logcat,然後找到相應的程式碼來解決錯誤。
15.橫豎屏切換時候的activity的生命週期:
答:
1) 建立一個activity,並把各個生命週期列印出來
2) 執行activity,得到例如以下資訊:
onCreate()à
onStart()à
onResume()à
3) 按ctrl+F12切換成橫屏時
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
4) 再按ctrl+f12切換成豎屏時,發現列印了兩次同樣的Log
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
5) 改動AndroidManifest.xml,把該Activity加入android:configChanges=“orientation”,運行步驟3
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
6) 改動AndroidManifest.xml。把該Activity加入android:configChanges=“orientation”,運行步驟4,發現不會再列印同樣資訊,但多列印了一行onConfigChanged
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onConfigurationChanged()à
7) 把步驟5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,運行步驟3,就僅僅列印onConfigChanged
onConfigurationChanged()à
8) 把步驟5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,運行步驟4
onConfigurationChanged()à
onConfigurationChanged()à
總結:
1) 不設定activity的android:configChanges時,切屏會又一次調用各個生命週期,切橫屏時會運行一次,切豎屏時會運行兩次。
2) 設定activity的android:configChanges=“orientation”時, 切屏會又一次調用各個生命週期,切橫屏、豎屏時都僅僅會運行一次。可是豎屏最後多列印一條onConfigurationChanged()
3) 設定activity的android:configChanges=“orientation|keyboardHidden”時,切屏不會又一次調用各個生命週期,僅僅會運行onConfigurationChanged(),橫屏一次,豎屏兩次
再總結下整個activity的生命週期:
1) 當前activity產生事件彈出Toast和AlertDialog的時候Activity的生命週期不會有改變
2) Activity執行時按下HOME鍵(跟被全然覆蓋一樣的)
onSavaInstanceStateà
onPauseà
onStopà
onRestartà
onStartà
onResumeà
3) 未被全然覆蓋,僅僅是失去焦點:
onPauseà
onResumeà
16.怎樣將SQLite資料庫(.db檔案)與apk檔案一起公布?
答:能夠將.db檔案拷貝到Eclipse Androidproject中的res aw檔案夾中。全部在res aw檔案夾中的檔案不會被壓縮。這樣能夠直接提取該檔案夾中的檔案。
能夠將.db檔案拷貝到res aw檔案夾中
17.怎樣將開啟res aw檔案夾中的資料庫檔案?
答:在Android中不能直接開啟res aw檔案夾中的資料庫檔案,而須要在程式第一次啟動時將該檔案拷貝到手機記憶體或SD卡的某個檔案夾中,然後再開啟該資料庫檔案。複製的基本方法是使用getResources().openRawResource方法獲得res aw檔案夾中資源的 InputStream對象,然後將該InputStream對象中的資料寫入其它的檔案夾中對應檔案裡。
在Android SDK中能夠使用SQLiteDatabase.openOrCreateDatabase方法來開啟隨意檔案夾中的SQLite資料庫檔案。
18.android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和差別:
答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕鬆些,但一些效能敏感的資料庫或手機上還是主要採用SAX方 式,SAX讀取是單向的,長處:不佔記憶體空間、解析屬性方便,但缺點就是對於套嵌多個分支來說處理不是非常方便。而DOM方式會把整個XML檔案載入到記憶體 中去,這裡Android開發網提醒大家該方法在尋找方面能夠和XPath非常好的結合假設資料量不是非常大推薦使用。而PULL經常常使用在J2ME對於節點處 理比較好,類似SAX方式,相同非常節省記憶體。在J2ME中我們經常使用的KXML庫來解析。
19.DDMS和TraceView的差別?
答:DDMS是一個程式運行查看器,在裡面能夠看見線程和堆棧等資訊。TraceView是程式效能分析器
20.談談Android的IPC機制:
答:IPC是內部進程通訊的簡稱,是共用"具名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間能夠隨時的進行互動,故在Android中該機制,僅僅適用於Activity和Service之間的通訊。類似於遠程方法調用。類似於C/S模式的訪問。通過定義AIDL介面檔案來定義IPC介面。
Servier端實現IPC介面。Client端調用IPC介面本地代理。
21.NDK是什麼:
答:NDK是一系列工具的集合
NDK提供了一系列的工具,協助開發人員迅速的開發C/C++的動態庫,並能自己主動將so和java應用打成apk包
NDK整合了交叉編譯器,並提供了對應的mk檔案和隔離cpu,平台等的差異,開發人員僅僅需簡單的改動mk檔案就能夠建立出so
22.描寫敘述一下android的系統架構:
答:android系統架構分從下往上為Linux核心層、執行庫、應用程式架構層和應用程式層。
Linux核心層:負責硬體的驅動程式、網路、電源、系統安全以及記憶體管理等功能。
執行庫和androidruntion:執行庫:即c/c++函數庫部分,大多數都是開放源碼的函數庫,比如webkit,該函數庫負責android網頁瀏覽器的執行。比如標準的c函數庫libc、openssl、sqlite等,當然也包含支援遊戲開發的2dsgl和3dopengles,在多媒體方面有mediaframework架構來支援各種影音和圖形檔案的播放與顯示,如mpeg4、h.264、mp3、aac、amr、jpg和png等眾多的多媒體檔案格式。Androidruntion負責解釋和執行產生的dalvik格式的位元組碼
應用軟體架構:java應用程式開發人員主要是使用該層封裝好的api進行高速開發的。
應用程式層:該層是java的應用程式層。android內建的googlemaps、email、IM、瀏覽器等,都處於該層。java開發人員工發的程式也處於該層。並且和內建的應用程式具有平等的地位。能夠調用內建的應用程式。也能夠替換內建的應用程式
23.Activity 與 Task的啟動模式有哪些,它們含義詳細是什麼?
答:在一個activity中。有多次調用startActivity來啟動還有一個activity,要想僅僅產生一個activity執行個體,能夠設定啟動模式。
一個activity有四種啟動模式:standed,signleTop,singleTask,singleInstance
Standed:標準模式,一調用startActivity()方法就會產生一個新的執行個體。
SingleTop:假設已經有一個執行個體位於activity棧頂,就不產生新的執行個體,而僅僅是調用activity中的newInstance()方法。假設不位於棧頂,會產生一個新的執行個體。
singleTask:會在一個新的task中產生這個執行個體,以後每次調用都會使用這個,不會去產生新的執行個體了。
SingleInstance:這個和singleTask基本一樣。僅僅有一個差別:在這個模式下的activity執行個體所處的task中,僅僅能有這個activity執行個體,不能有其它執行個體
24.Application類的作用:
答:API裡的第一句是:
Base class for those who need to maintain global application state
假設想在整個應用中使用全域變數,在java中通常是使用靜態變數,public類型;而在android中假設使用這種全域變數就不符合Android的架構架構,可是能夠使用一種更優雅的方式就是使用Application context。
首先須要重寫Application。主要重寫裡面的onCreate方法,就是建立的時候,初始設定變數的值。然後在整個應用中的各個檔案裡就能夠對該變數進行操作了。
啟動Application時,系統會建立一個PID,即進程ID,全部的Activity就會在此進程上執行。那麼我們在Application建立的時候初始化全域變數。同一個應用的全部Activity都能夠取到這些全域變數的值。換句話說。我們在某一個Activity中改變了這些全域變數的值,那麼在同一個應用的其它Activity中值就會改變
25.說明onSaveInstanceState() 和 onRestoreInstanceState()在什麼時候被調用:
答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並非生命週期方法,它們不同於 onCreate()、onPause()等生命週期方法。它們並不一定會被觸發。當應用遇到意外情況(如:記憶體不足、使用者直接按Home鍵)由系統銷毀一個Activity時,onSaveInstanceState()才會被調用。可是當使用者主動去銷毀一個Activity時。比如在應用中按返回鍵,onSaveInstanceState()就不會被調用。由於在這樣的情況下,使用者的行為決定了不須要儲存Activity的狀態。
通常onSaveInstanceState()僅僅適合用於儲存一些暫時性的狀態,而onPause()適合用於資料的持久化儲存。
另外。當螢幕的方向發生了改變, Activity會被摧毀而且被又一次建立,假設你想在Activity被摧毀前緩衝一些資料,而且在Activity被又一次建立後恢複緩衝的資料。
能夠重寫Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
26.android的service的生命週期?哪個方法能夠多次被調用:
答:1)與採用Context.startService()方法啟動服務有關的生命週期方法
onCreate() -> onStart() -> onDestroy()
onCreate()該方法在服務被建立時調用,該方法僅僅會被調用一次,不管調用多少次startService()或bindService()方法。服務也僅僅被建立一次。
onStart() 僅僅有採用Context.startService()方法啟動服務時才會回調該方法。
該方法在服務開始執行時被調用。多次調用startService()方法雖然不會多次建立服務,但onStart() 方法會被多次調用。
onDestroy()該方法在服務被終止時調用。
2)與採用Context.bindService()方法啟動服務有關的生命週期方法
onCreate() -> onBind() -> onUnbind() -> onDestroy()
onBind()僅僅有採用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用。當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。
onUnbind()僅僅有採用Context.bindService()方法啟動服務時才會回調該方法。
該方法在調用者與服務解除綁定時被調用。
假設先採用startService()方法啟動服務,然後調用bindService()方法綁定到服務,再調用unbindService()方法解除綁定,最後調用bindService()方法再次綁定到服務,觸發的生命週期方法例如以下:
onCreate() ->onStart() ->onBind() ->onUnbind()[重載後的方法需返回true] ->onRebind()
27.android的broadcast的生命週期:
答:1)Broadcast receiver生命週期中僅有一個回調方法:
void onReceive(Context curContext, Intent broadcastMsg)
當接收器接收到一條broadcast訊息,Android就會調用onReceiver(),並傳遞給它一個Intent對象,這個對象攜帶著那條broadcast訊息。我們覺得僅當運行這個方式時,Broadcast receiver是活動的;這種方法返回時,它就終止了。這就是Broadcast receiver的生命週期。
2)因為Broadcast receiver的生命週期非常短,一個帶有活動的Broadcast receiver的進程是受保護的,以避免被幹掉。可是別忘了有一點,Android會在隨意時刻幹掉那些攜帶不再活動的組件的進程,所以非常可能會造成這個問題。
3)解決上述問題的方案採用一個Service來完畢這項工作,Android會覺得那個進程中(Service所在的進程)仍然有在活動的組件。
28.android view,surfaceview,glsurfaceview的差別:
答:SurfaceView是從View基類中派生出來的顯示類,直接子類有GLSurfaceView和VideoView。能夠看出GL和視頻播放以及Camera網路攝影機一般均使用SurfaceView
SurfaceView和View最本質的差別在於。surfaceView是在一個新起的單獨線程中能夠又一次繪製畫面而View必須在UI的主線程中更新畫面。
那麼在UI的主線程中更新畫面 可能會引發問題。比方你更新畫面的時間過長。那麼你的主UI線程會被你正在畫的函數堵塞。那麼將無法響應按鍵,觸屏等訊息。
當使用surfaceView 由於是在新的線程中更新畫面所以不會堵塞你的UI主線程。但這也帶來了另外一個問題,就是事件同步。比方你觸屏了一下,你須要surfaceView中thread處理,一般就須要有一個event queue的設計來儲存touch event,這會稍稍複雜一點,由於涉及到線程同步。
所以基於以上,依據遊戲特點,一般分成兩類。
1)被動更新畫面的。
比方棋類,這樣的用view就好了。由於畫面的更新是依賴於 onTouch 來更新,能夠直接使用 invalidate。 由於這樣的情況下,這一次Touch和下一次的Touch須要的時間長度之間的比較,無影響。
2)自動更新。
例如,一個人一直運行。
這需要一個單獨的thread人們不斷地重繪狀態,避免堵塞main UI thread。很顯然view不當。必須surfaceView為了控制。
android面試題 不僅僅是面試是一個很好的學習