• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦 > 創業指南 > 職場 > 面試題 > 安卓面試題及參考答案(2)

    安卓面試題及參考答案(2)

    時間: 如英753 分享

    安卓面試題及參考答案

      安卓面試題及答案(二)

      1, 談談你對Activity的理解?

      答案:對于這種“你對什么什么怎么理解”的面試題,最好的回到方式就是用你自己的理解說出來,通俗中夾雜些專業術語,偶爾再蹦出幾個英文。當然如果你很牛X,你可以往深了說,只要別漫無目的的說就行。圍繞一條主線。這其中如果你對某一方面比較精通,你就應該往你精通的方向引。面試官可能就會順著你的思路走了。不過現在有很多面試問Android方面的知識不多,問java方面的比較多。

      通俗的講,Activity就是一個應用程序的門面,也可以理解成就是WEB程序中一個頁面,當然與web程序中的頁面不同的是,web中的一個頁面可能只是一個純粹的展示頁面不與用戶進行任何交互,而幾乎所有的Activity都會與用戶交互。當然兩者在架構上也有本質區別,Activity與用戶的交互通過觸發UI的不同事件完成的。而Web程序是通過請求,響應來完成交互的。還有在android中顛覆了很多常規想法,比如在一個Activity中可以打開另一個不在同一應用的Activity。這在其他程序是不可想象的。當然這種設計的出發點也是為了節省系統資源。從View層的角度來看,Activity承載了與用戶交互的不同控件。從控制層看,也就是內部邏輯,Activity需要保持各個界面的狀態,背后會做很多持久化的操作。包括妥善管理生命周期的各個階段。(把生命周期引出來了,沒準就會問你這方面的)。

      下面是文檔式的回答:(最好的回答方式兩者結合)

      首先Activity是android四大組件之一。它是單獨的,作為用戶與程序交互的一個載體。幾乎所有的Activity都與用戶交互。Activity創建了一個窗口,你可以通過setContentView這個方法將需要的UI放置在窗口。任何一個應用程序都可以調用單獨的一個Activity。

      其次,Activity的繼承關系 Activity→ContextThemeWrapper→ContextWrapper→Context

      最后大部分的Activity的子類都需要實現以下兩個接口:

      onCreate(Bundle savedInstanceState)接口是初始化activity的地方. 在這兒通常可以調用setContentView(int)設置在資源文件中定義的UI, 使用findViewById(int) 可以獲得UI中定義的窗口.

      onPause()接口是使用者準備離開activity的地方,在這兒,任何的修改都應該被提交(通常用于ContentProvider保存數據).

      所有Activity必須在清單文件里注冊一下才能使用。

      2, Activity的生命周期?

      答案:在系統中的Activity被一個Activity棧所管理。當一個新的Activity啟動時,將被放置到棧頂,成為運行中的Activity,前一個Activity保留在棧中,不再放到前臺,直到新的Activity退出為止。

      Activity有四種本質區別的狀態:

      1)在屏幕的前臺(Activity棧頂),叫做活動狀態或者運行狀態(active or running)

      2)如果一個Activity失去焦點,但是依然可見(一個新的非全屏的Activity 或者一個透明的Activity 被放置在棧頂),叫做暫停狀態(Paused)。一個暫停狀態的Activity依然保持活力(保持所有的狀態,成員信息,和窗口管理器保持連接),但是在系統內存極端低下的時候將被殺掉。

      3)如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的窗口被隱藏,當系統內存需要被用在其他地方的時候,Stopped的Activity將被殺掉。

      4)如果一個Activity是Paused或者Stopped狀態,系統可以將該Activity從內存中刪除,Android系統采用兩種方式進行刪除,要么要求該Activity結束,要么直接殺掉它的進程。當該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態。

      Activity提供了7個生命周期方法:

      onCreate(),onStart(),onResume(),onPause(),onStop(),onDestory(),onRestart()。在這七個生命周期方法中有三個關鍵的循環。其實官方給的那張圖畫得很明白,但估計很少人能有耐心去揣摩。那就換種方式展現。看圖吧:

      1)以下該圖呈現了一個Activity完整的生命周期,從onCreate(Bundle)開始到onDestroy()結束。Activity在onCreate()設置所有的“全局”狀態,在 onDestory()釋放所有的資源。

      首先我們運行程序,這是打開MainActivity依次調用onCreate->onStart->onResume,這時MainActivity在棧頂,與我們交互的Activity都在棧頂。然后我按下返回鍵,則會依次調用onPause->onStop->onDestory。這屬于一個完整的生命周期。

      2)可見的生命周期,從onStart()開始到onStop()結束。說白了就是一個Activity被另一個activity完全覆蓋掉,然后又重新回到前臺這個一個過程稱之為可見生命周期。

      首先我們打開OtherActivity這個窗口。此時MainActivity將被覆蓋掉。則會依次調用onPause->onStop。在內存不足的時候,系統也會殺死MainActivity進程。

      然后,按下返回鍵,MainActivity又回到前臺此時會調用 onRestart->onStart->onResume。

      3)前臺的生命周期,從onResume()開始到onPause()結束。在這段時間里,該Activity處于所有Activity的最前面,和用戶進行交互。Activity可以經常性地在resumed和paused狀態之間切換。說白了就是一個Activity覆蓋到另一個Activity上面,但是并沒有完全覆蓋掉。

      首先,我們將OtherActivity打開,這是OtherActivity以對話框模式打開,懸浮在MainActivity上面。直接調用的onPause()。

      然后 我們按下返回鍵,則調用的onResume。對于這種沒用完全覆蓋的狀態只會在onPause與onResume兩個方法之間切換。

      注:還有一種特殊情況,當屏幕發生改變的時候生命周期是怎樣的呢?比如由豎屏調整為橫屏。生命周期的方法依次用:onPause->onStop->onDestroy->onCreate->onStart->onResume。這么一個過程。它會銷毀掉原先的activity,重新創建。

      3, Acitvity啟動模式?

      答案:對于這種題,最后就是自己寫個例子,觀察一下,才能真正明白。

      Activty啟動提供了四種啟動模式。launchMode:

      standard:每次啟動新的活動窗口(new操作)

      singleTop:如果在棧頂是目標活動,則直接打開.否則開啟新的活動窗口(new).

      singleTask和singleInstance基本上相同.差別在于若根活動設置為singleTask時,則由此所開啟的活動也在同一任務中,即taskId相同。.而若根活動設置為singleInstance時,由此開啟的活動在新的任務中.即棧中只有一個活動,taskid不同。.其余情況相同.

      4, 在onCreate方法中Bundle savedInstanceState 這個參數有什么作用?

      答案:在onCreate方法中有saveInstanceState這個參數,其實這個參數對應兩個方法。

      void onSaveInstanceState(Bundle outState);void onRestoreInstanceState(Bundle savedInstanceState)。當某個activity變得“容易”被系統銷毀時,說白了就是系統在內存不足或者其他異常情況下把你的Activity銷毀時,將調用這個方法。需要注意的是它是系統調用的,并且你的Activity是被動得被銷毀。你可以在銷毀的時候保存一下數據。然后在onCreate方法中拿出來。那什么情況下能觸發這兩個方法呢?

      1)、當用戶按下HOME鍵時。

      這是顯而易見的,系統不知道你按下HOME后要運行多少其他的程序,自然也不知道activity A是否會被銷毀,故系統會調用onSaveInstanceState,讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則

      2)、長按HOME鍵,選擇運行其他的程序時。

      3)、按下電源按鍵(關閉屏幕顯示)時。

      4)、從activity A中啟動一個新的activity時。

      5)、屏幕方向切換時,例如從豎屏切換到橫屏時。

      在屏幕切換之前,系統會銷毀activity A,在屏幕切換之后系統又會自動地創建activity A,所以onSaveInstanceState一定會被執行

      總而言之,onSaveInstanceState的調用遵循一個重要原則,即當系統“未經你許可”時銷毀了你的activity,則onSaveInstanceState會被系統調用,這是系統的責任,因為它必須要提供一個機會讓你保存你的數據(當然你不保存那就隨便你了)。

      至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的,onRestoreInstanceState被調用的前提是,activity A“確實”被系統銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用,例如,當正在顯示activity A的時候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會因為內存的原因被系統銷毀,故activity A的onRestoreInstanceState方法不會被執行

      另外,onRestoreInstanceState的bundle參數也會傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數據還原。

      5, 談談你對BroadCastRceiver的理解?

      答案:廣播接收者,android四大組件之一,也是唯一一個能動態注冊的組件。

      1)廣播接收者是一個專注于接收廣播通知信息,并做出對應處理的組件。很多廣播是源自于系統──比如,通知時區改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項。應用程序也可以進行廣播──比如說,通知其它應用程序一些數據下載完成并處于可用狀態。

      2)應用程序可以擁有任意數量的廣播接收者以對所有它感興趣的通知信息予以響應。所有的接收器均繼承自BroadcastReceiver基類。

      3)廣播接收者沒有用戶界面。然而,它們可以啟動一個activity來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它并獲取消息。

      6, 廣播分幾種?他們有什么區別?

      答案:廣播被分為兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,并且無法終止廣播Intent的傳播。

      然而有序廣播是按照接收者聲明的優先級別,被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么,廣播先傳給A,再傳給B,最后傳給C 。優先級別聲明在 intent-filter 元素的 android:priority 屬性中,數越大優先級別越高,取值范圍:-1000到1000,優先級別也可以調用IntentFilter對象的setPriority()進行設置 。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,后面的接收者就無法接收到廣播。

      另外,有序廣播的接收者可以將數據傳遞給下一個接收者,如:A得到廣播后,可以往它的結果對象中存入數據,當廣播傳給B時,B可以從A的結果對象中得到A存入的數據。

      Context.sendBroadcast()

      發送的是普通廣播,所有訂閱者都有機會獲得并進行處理。

      Context.sendOrderedBroadcast()

      發送的是有序廣播,系統會根據接收者聲明的優先級別按順序逐個執行接收者,

      前面的接收者有權終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將數據通過setResultExtras(Bundle)方法存放進結果對象,然后傳給下一個接收者,下一個接收者通過代碼:Bundle bundle = getResultExtras(true))可以獲取上一個接收者存入在結果對象中的數據。

      7, 廣播的生命周期?

      答案:廣播的生命周期是非常短的,當發送之后intent會到AndroidManifest.xml文件中找是不是有匹配的action,如果有就會調用Receiver ,然后獲得Receiver 對象,再執行onReceive方法,這時候Receiver對象就沒有用了,當我們再次點擊按鈕的時候就會重新獲得對象,這就是BroadcastReceiver的生命周期.

      在BroadcastReceiver里不能做一些比較耗時的操作,否側會彈出ANR(Application No

      Response)的對話框.

      如果需要完成一項比較耗時的工作,應該通過發送Intent給Service,由Service來完成.這里不能使用子線程來解決,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結束,BroadcastReceiver就先結束了.BroadcastReceiver一旦結束,此時BroadcastReceiver的所在進程很容易在系統需要內存時被優先殺死,因為它屬于空進程(沒有任何活動組件的進程).如果它的宿主進程被殺死,那么正在工作的子線程也會被殺死.所以采用子線程來解決是不可靠的.

      8, 兩種注冊BroadcastReceiver的方法?

      答案:使用在manifest中注冊的方法注冊BroadcastReceiver,即使你的應用程序沒有啟動,或者已經被關閉,這個BroadcastReceiver依然會繼續運行,這樣的運行機制可能會給軟件的用戶造成困擾。所以作為程序的開發者,我們希望能夠有一種靈活的機制完成BroadcastReceiver的綁定和解除綁定操作。Android當然也考慮到了這些問題,所以在Context這個類當中提供了如下兩個函數可以在代碼中注冊:

      i. registerReceiver(receiver,filter);

      這個函數的作用就是將一個BroadcastReceiver注冊到應用程序當中,這個函數接收兩個參數,第一個參數是需要注冊的BroadcastReceiver對象,第二個是一個IntentFilter。第一個參數是非常容易理解的,第二個參數的作用是定義了哪些Intent才能觸發這個注冊的BroadcastReceiver對象。

      ii. unregisterReceiver(receiver);

      這個方法就非常的簡單了,用于解除BroadcastReceiver的綁定狀態。一旦解除完成,響應的BroadcastReceiver就不會再接收系統所廣播的Intent了。

      兩種注冊BroadcastReceiver的方法

      1.在應用程序的代碼中進行注冊

      注冊BroadcastReceiver

      registerReceiver(receiver,filter);

      取消注冊BroadcastReceiver

      unregisterReceiver(receiver);

      2.在AndroidManifest.xml當中進行注冊

      兩種注冊BroadcastReceiver方法的比較:

      現在我們了解了兩種注冊BroadcastReceiver的方法之后,需要考慮一下這兩種方法適用的場合:

      i. 第一種注冊的方法可以保證在應用程序安裝之后,BroadcastReceiver始終處于活動狀態,通常用于監聽系統狀態的改變,比如說手機的電量,wifi網卡的狀態(當然,監視這些東西也是取決于軟件的需求)。對于這樣的BroadcastReceiver,通常是在產生某個特定的系統事件之后,進行相應的操作,比如說wifi網卡打開時,給用戶一個提示;

      ii. 第二種注冊方法相對第一種要靈活的多,這樣注冊的BroadcastReceiver通常用于更新UI的狀態。一般來說,都是在一個Activity啟動的時候使用這樣的方法注冊BroadcastReceiver,一旦接收到廣播的事件,就可以在onReceive方法當中更新當前的這個Activity當中的控件。但是需要注意的是如果這個Activity不可見了,就應該調用unregisterReceiver方法來解除注冊

      9, 粘性廣播有什么作用?怎么使用?

      答案:粘性廣播主要為了解決,在發送完廣播之后,動態注冊的接收者,也能夠收到廣播。舉個例子首先發送一廣播,我的接收者是通過程序中的某個按鈕動態注冊的。如果不是粘性廣播,我注冊完接收者肯定無法收到廣播了。這是通過發送粘性廣播就能夠在我動態注冊接收者后也能收到廣播。

      用法:

      //發送粘性廣播

      Public void sendStickyBroadCast(){

      Intent intent=new Intent();

      intent.setAction(“com.iteye.myreceiver.action”);

      intent.putExtra(“name”,”tom”);

      this.sendStickyBroadCast(intent);

      }

      發送粘性廣播還需要發送粘性廣播的權限:

      //動態注冊廣播接收者

      MyReceiver mr = new MyReceiver ();

      IntentFilter filter = new IntentFilter();

      filter.addAction(“com.iteye.myreceiver.action “);

      filter.addCategory(Intent.CATEGORY_DEFAULT);

      Intent ii = this.registerReceiver(mr, filter);

      String n = ii.getStringExtra(“name”);

      Toast.makeText(this, “動態注冊接收者完成,收到粘性廣播,name=” + n, 1).show();

      10,如何控制接收者或者發送方得權限?

      答案: 1)如果廣播發送方要求接收方必須有某個權限才能收到廣播怎么做呢?

      /**

      * 發送廣播,指定接收者權限

      * sendBroadcast(i, “com.iteye.permission.receiver”);//指定接收者權限

      */

      public void sendBroadcast() {

      //隱式意圖,發送廣播

      Intent i = new Intent();

      i.setAction(“com.iteye.receiver.action”);

      i.putExtra(“name”, “tom”);

      this.sendBroadcast(i, ” com.iteye.permission.receiver “);

      Log.i(“Other”,”.send ok!”);

      }

      在清單文件里receiver必須有這個權限才能收到廣播。

      首先,需要定義權限:

      然后,聲明權限:

      這時接收者就能收到發送的廣播。

      2)反過來,如果接收者要求發送方必須擁有某個權限,我才接收你的廣播怎么辦呢?

      android:permission:控制發送方需要具備指定權限,才接收其廣播
    即使過濾器匹配,如果發送方沒有相應權限,接收者也不會接收其廣播。

      11.NDK是什么:

      答:NDK是一系列工具的集合

      NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,并能自動將so和java應用打成apk包

      NDK集成了交叉編譯器,并提供了相應的mk文件和隔離cpu,平臺等的差異,開發人員只需簡單的修改mk文件就可以創建出so

      12.描述一下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開發人員工發的程序也處于該層,而且和內置的應用程序具有平等的地位,可以調用內置的應用程序,也可以替換內置的應用程序

      13.Activity 與 Task的啟動模式有哪些,它們含義具體是什么?

      答:在一個activity中,有多次調用startActivity來啟動另一個activity,要想只生成一個activity實例,可以設置啟動模式。

      一個activity有四種啟動模式:standed,signleTop,singleTask,singleInstance

      Standed:標準模式,一調用startActivity()方法就會產生一個新的實例。

      SingleTop:如果已經有一個實例位于activity棧頂,就不產生新的實例,而只是調用activity中的newInstance()方法。如果不位于棧頂,會產生一個新的實例。

      singleTask:會在一個新的task中產生這個實例,以后每次調用都會使用這個,不會去產生新的實例了。

      SingleInstance:這個和singleTask基本一樣,只有一個區別:在這個模式下的activity實例所處的task中,只能有這個activity實例,不能有其他實例

      14.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中值就會改變

      15.說明onSaveInstanceState() 和 onRestoreInstanceState()在什么時候被調用:

      答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它們不同于 onCreate()、onPause()等生命周期方法,它們并不一定會被觸發。當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷毀一個Activity時,onSaveInstanceState()才會被調用。但是當用戶主動去銷毀一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因為在這種情況下,用戶的行為決定了不需要保存Activity的狀態。通常onSaveInstanceState()只適合用于保存一些臨時性的狀態,而onPause()適合用于數據的持久化保存。

      另外,當屏幕的方向發生了改變, Activity會被摧毀并且被重新創建,如果你想在Activity被摧毀前緩存一些數據,并且在Activity被重新創建后恢復緩存的數據。可以重寫Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。

      16.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()

      17.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所在的進程)仍然有在活動的組件。

      18.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來控制。


    看過“安卓面試題及答案”的人還看了:

    1.安卓面試題及答案

    2.關于Android開發工程師的面試題

    3.安卓面試題及答案

    4.常見面試題及答案

    5.中興公司常見面試題及答案

    1083145 主站蜘蛛池模板: chinese帅哥18kt| 成人综合久久综合| 爱豆传媒在线视频观看网站入口| 久久无码精品一区二区三区| 冈本视频老版app下载安装进入口 再一深点灬舒服灬太大了视频 | 国产精品久久久久影院嫩草| 精品国产A∨无码一区二区三区| 欧美欧洲性色老头老妇| aisaobi| 中文字幕视频免费| 亚洲av成人综合网| 国产免费丝袜调教视频| 国内外成人免费视频| 无码人妻精品一二三区免费| 欧洲亚洲综合一区二区三区| 狠狠久久永久免费观看| 色婷婷在线影院| 9999国产精品欧美久久久久久| 一本大道久久东京热无码AV | 亚洲精品午夜国产va久久成人 | 国产精品99久久久久久宅男| 国产精品国产三级国产a| 国内自拍视频一区二区三区| 大象视频在线免费观看| 婷婷五月综合激情| 欧美亚洲综合另类在线观看| 欧美性色黄大片www| 精品国产a∨无码一区二区三区| 精品国产欧美一区二区| 欧美性巨大欧美| 91手机看片国产永久免费| 一本色道久久88—综合亚洲精品 | 国产一区二区三区夜色| 三上悠亚一区二区观看| 一本大道加勒比久久综合| 中文字幕不卡免费高清视频| 中文字幕日韩专区| 一道本在线免费视频| ww美色吧com| 69av免费观看| 久热中文字幕在线精品免费|