Android 場景問題總結。(部分轉載)

風的王子發表於2013-11-03

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,如果耗時的操作放在這裡,程式就很容易被回收掉。

 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或者快速顯示主畫面並非同步來填充這些資訊。在這兩種情況下,你都應該顯示正在進行的進度,以免使用者認為程式被凍結了。

相關文章