1. 程式人生 > >安卓面試題集大全及解答

安卓面試題集大全及解答

1、 Android dvm的程序和Linux的程序, 應用程式的程序是否為同一個概念

可以認為是同一個概念。

①DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的程序中執行,都擁有一個獨立的Dalvik虛擬機器例項。

②每一個DVM都是在Linux 中的一個程序所以說可以認為是同一個概念。

 

2sim卡的EF 檔案有何作用

       EF就是作儲存並和手機通訊用的。

  詳解:sim卡的檔案系統有自己規範,主要是為了和手機通訊,sim本身可以有自己的作業系統,EF就是作儲存並和手機通訊用的

 

3、嵌入式作業系統記憶體管理有哪幾種, 各有何特性

  頁式,段式,段頁,用到了MMU,虛擬空間等技術

 

4 什麼是嵌入式實時作業系統, Android 作業系統屬於實時作業系統嗎?

嵌入式實時作業系統RTOS是指當外界事件或資料產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致執行的嵌入式作業系統。

主要用於工業控制、 軍事裝置、 航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而android是基於linux核心的,因此屬於軟實時。

 

6 android中的動畫有哪幾類,它們的特點和區別是什麼?

①Tween(補間)動畫,這種實現方式可以使檢視元件移動、放大、縮小以及產生透明度的變化;

②Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

 

7handler機制的原理

  andriod提供了 Handler 和 Looper 來滿足執行緒間的通訊。Handler 先進先出原則。Looper類用來管理特定執行緒內物件之間的訊息交換(Message Exchange)。

  1)Looper: 一個執行緒可以產生一個Looper物件,由它來管理此執行緒裡的Message Queue(訊息佇列)。

 

  2)Handler: 你可以構造Handler物件來與Looper溝通,以便push新訊息到Message Queue裡;或者接收Looper從Message Queue取出)所送來的訊息。

 

  3) Message Queue(訊息佇列):用來存放執行緒放入的訊息。

 

  4)執行緒:UI thread 通常就是main thread,而Android啟動程式時會替它建立一個Message Queue。

 

9Activity的生命週期

Activity的基本生命週期如下程式碼 所示:

  Java程式碼

 

  public  class MyActivity extends Activity {

 

  protected   void onCreate(Bundle savedInstanceState);

 

  protected   void onStart();

 

  protected   void onResume();

 

  protected   void onPause();

 

  protected   void onStop();

 

 protected   void onDestroy();

 

  }

 

Activity會按需要 過載這些方法,onCreate是免不了的。

Activity正常啟動的過程中,他們被呼叫的順序是 onCreate -> onStart -> onResume, Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這就是個完整的生命週期,若程式正執行著來電話了,程式會中止了,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,

如果打斷 這個應用程式的是一個Theme為Translucent 或者Dialog 的Activity那麼只是onPause ,恢復 的時候onResume 。

 

  詳細介紹一下這幾個方法中系統在做什麼以及我們應該做什麼:

 

  onCreate:建立介面 ,做一些資料的初始化工作

 

  onStart:變成使用者可見不可互動 的

 

  onResume: 變成和使用者可互動 的(在activity 棧系統通過棧的方式管理這些個

 

  Activity的最上面,執行完彈出棧,則回到上一個Activity)

 

  onPause:可見但不可互動的,系統會停止動畫等消耗CPU 的事情   從上文的描述已經知道,應該在這裡儲存你的一些資料,因為這時程式的優先順序降低,有可能被系統收回。在這裡儲存的資料,應該在onResume裡讀出來,注意:這個方法裡做的事情時間要短,因為下一個activity不會等到這個方法完成才啟動

 

  onstop: 變得不可見 ,被下一個activity覆蓋了

 

  onDestroy: 這是activity被幹掉前最後一個被呼叫方法了,可能是外面類呼叫finish方  法或者是系統為了節省空間將它暫時性的幹掉,可以用isFinishing()來判斷它,如果你有一個Progress Dialog線上程中轉動,請在onDestroy裡 把他cancel掉,不然等執行緒結束的時候,呼叫Dialog的cancel方法會拋 異常的。

 

  onPause,onstop, onDestroy,三種狀態下 activity都有可能被系統幹掉

 

 為了保證程式的正確性,要在onPause()裡寫上持久層操作的程式碼,將使用者編輯的內容都儲存到儲存介質上(一般都是資料庫 )。實際工作中因為生命週期的變化而帶來的問題也很多,比如應用程式起了新的執行緒在跑,這時中斷了,還要去維護那個執行緒,是暫停還是殺掉還是資料回滾?因為Activity可能被殺掉,所以執行緒中使用的變數和一些介面元素就千萬要注意了,一般採用Android的訊息機制 [Handler,Message]來處理多執行緒和介面互動的問題。

 

10、讓Activity變成一個視窗:Activity屬性設定

 

在AndroidManifext.xml中Activity定義處新增

android:theme="@android:style/Theme.Dialog" 或

android:theme="@android:style/Theme.Translucent"。(半透明)

 

11 你後臺的Activity被系統回收怎麼辦:onSaveInstanceState

 

  當你的程式中某一個Activity A 在執行時中,主動或被動地執行另一個新的Activity B  這個時候A會執行

 

  Java程式碼

 

  public void onSaveInstanceState(Bundle outState) {

 

  super.onSaveInstanceState(outState);

 

  outState.putLong("id", 1234567890);

 

  }

 

  B 完成以後又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回 收的A就要重新呼叫onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上引數 savedInstanceState,沒被收回的就還是onResume就好了。

 

  savedInstanceState是一個Bundle物件,你基本上可以把他理解為系統幫你維護的一個Map物件。在onCreate()裡你可能會用到它,如果正常啟動onCreate就不會有它,所以用的時候要判斷一下是否為空。

 

  Java程式碼

 

  if(savedInstanceState != null){

 

  long id = savedInstanceState.getLong("id");

 

  }

 

12 呼叫與被呼叫:我們的通訊使者Intent

 

Intent(意圖)主要是解決Android應用的各項元件之間的通訊。專門提供元件互相呼叫的相關資訊,實現呼叫者與被呼叫者之間的解耦。

在應用中,以兩種形式來使用Intent

直接Intent:指定了元件屬性的Intent(呼叫setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的元件類,通知應用啟動對應的元件 

間接Intent沒有明確的目標元件名稱,Android系統使用IntentFilter來尋找與隱式Intent相關的物件。Android將以下三個因素作為選擇的參考標準:ActionDataCategory 

 

  13、什麼是ANR 如何避免它?

  ANR:Application Not Responding,五秒

在Android中,活動管理器和視窗管理器這兩個系統服務負責監視應用程式的響應。

  當對輸入事件(如按鍵、觸控式螢幕事件)的響應超過5秒會出現ANR

  意向接受器(intentReceiver)超過10秒鐘仍未執行完畢會出現ANR。

  任何執行在主執行緒中的方法,都要儘可能的只做少量的工作。特別是活動生命週期中的重要方法如onCreate()和 onResume()等,潛在的比較耗時的操作,如訪問網路和資料庫,或者是開銷很大的計算如改變點陣圖的大小,需要在一個單獨的子執行緒中完成(或者是使用非同步請求,如資料庫操作)。但這並不意味著你的主執行緒需要進入阻塞狀態已等待子執行緒結束 -- 也不需要呼叫Therad.wait()或者Thread.sleep()方法。取而代之的是,主執行緒為子執行緒提供一個控制代碼(Handler),讓子執行緒在即將結束的時候呼叫它。使用這種方法涉及你的應用程式,能夠保證你的程式對輸入保持良好的響應,從而避免因為輸入事件超過5秒鐘不被處理而產生的ANR。

 

  14、什麼情況會導致Force Close ?如何避免?能否捕獲導致其的異常?

 

  一般像空指標啊,可以看起logcat,然後對應到程式中來解決錯誤

 

  15、Android本身的api並未宣告會丟擲異常,則其在執行時有無可能丟擲runtime異常,你遇到過嗎?諾有的話會導致什麼問題?如何解決?

 

       會,如nullpointerException,textView沒有初始化時,卻呼叫了其方法。開啟控制檯,檢視logcat找出異常並修改。

 

  16、簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver

 

  activity呈現了一個使用者可以操作的視覺化使用者介面

  service不包含可見的使用者介面,而是在後臺無限地執行

  broadcast receiver是一個接收廣播訊息並作出迴應的元件,沒有介面

  activity, service和broadcast receiver是被稱為intent的非同步訊息啟用的。

intent是一個Intent物件,它儲存了訊息的內容。對於activity和service來說,它指定了請求的操作名稱和待操作資料的URI

  Intent物件可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基manifest檔案中的宣告)並激活它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component,它是通過將Intent物件和目標的intent filter相比較來完成這一工作的。一個component的intent filter告訴android該component能處理的intent。intent filter也是在manifest檔案中宣告的。

 

  17、IntentService有何優點?

  * Acitivity的程序,當處理Intent的時候,會產生一個對應的Service

 

  * Android的程序處理器現在會盡可能的不kill掉你

 

  * 非常容易使用

 

  18、橫豎屏切換時候activity的生命週期?

  不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次

設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

 

19. 如何將SQLite資料庫(dictionary.db檔案)apk檔案一起釋出?

 

將dictionary.db檔案複製到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。

 

  20. 如何將開啟res aw目錄中的資料庫檔案?

 

在Android中不能直接開啟res aw目錄中的資料庫檔案,而需要在程式第一次啟動時將該檔案複製到手機記憶體或SD卡的某個目錄中,然後再開啟該資料庫檔案。

複製的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream物件,然後將該InputStream物件中的資料寫入其他的目錄中相應檔案中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來開啟任意目錄中的SQLite資料庫檔案。

 

  21. Android引入廣播機制的用意?

 

  a:從MVC的角度考慮(應用程式內)

 引入廣播機制可以方便幾大元件的資訊和資料互動。

  b:程式間互通訊息(例如在自己的應用程式內監聽系統來電)

  c:效率上(參考UDP的廣播協議在區域網的方便性)

d:設計模式上(反轉控制的一種應用,類似監聽者模式)

 

22. 如何退出Activity?如何安全退出已呼叫多個Activity的Application?

①Activity.finish(),也可以用killProcess()和System.exit()這樣的方法

②用ActivityManager的restartPackage方法

 

23. 請介紹下android大眾常用的五種佈局。

FrameLayout(框架佈局)

只可以有一個控制元件,並且不能設計這個控制元件的位置,控制元件會放在左上角

LinearLayout(線性佈局)

一行只能控制一個控制元件的線性佈局,所以當有很多控制元件需要在一個介面中列出時,可以用LinearLayout佈局

AbsoluteLayout(絕對佈局)

可以放置多個控制元件,並且可以自己定義控制元件的x,y的位置

RelativeLayout(相對佈局)

比如要在一行上顯示多個控制元件,這時就要用到相對佈局

TableLayout(表格佈局)

將子元素的位置分配到行或列中,一個TableLayout由許多的TableRow組成

 

24. 請介紹下android的資料儲存方式。

①SharedPreferences方式

用來儲存”key-value paires”格式的資料,它是一個輕量級的鍵值儲存機制,只可以儲存基本資料型別,可以通過它儲存一些上次使用者所做的修改操作

②檔案儲存方式

它通過FileInputStream和FileOutputStream對檔案進行操作。但是在Android中,檔案是一個應用程式私有的,一個應用程式無法讀寫其他應用程式的檔案,如果要共享資料就用Content Providers

③SQLite資料庫方式

Android提供的一個標準的資料庫,支援SQL語句

④內容提供器(Content provider)方式

是所有應用程式之間資料儲存和檢索的橋樑,它的作用是使得各個應用程式之間實現資料共享

⑤網路儲存方式

通過網路來儲存和獲取資料

 

 

25.請介紹下ContentProvider是如何實現資料共享的。

 Android提供了ContentProvider,一個程式可以通過實現一個ContentProvider的抽象介面將自己的資料完全暴露出去,而且ContentProviders是以類似資料庫中表的方式將資料暴露,也就是說ContentProvider就像一個“資料庫”。那麼外界獲取其提供的資料,也就應該與從資料庫中獲取資料的操作基本一樣,只不過是採用URI來表示外界需要訪問的“資料庫”。外部訪問通過ContentResolver去訪問並操作這些被暴露的資料。

 

26、如何啟用Service,如何停用Service。

Intent intent = new Intent();

intent.setClass(this,cba.class);

startService(intent);

stopService(intent);

 

 

27、註冊廣播有幾種方式,這些方式有何優缺點?Android引入廣播機制的用意。

①靜態註冊,在androidmainfest.xml中註冊  

       <receiver>

           <intent-filter>

              <action android:name = "android.intent.action.PICK"/>

           </intent-filter>

       </receiver>

       缺點:常駐型,佔資源比較大

      

②    registerReceiver(receiver,filter);  BroadcastReceiver更新UI一般用這種方法

 

 

28、 請解釋下在單執行緒模型中Message,Handler,Message Queue,Looper之間的關係。

    Message訊息,理解為執行緒間交流的資訊,處理資料後臺執行緒需要更新UI,則傳送Message內含一些資料給UI執行緒。

    Handler是Message的主要處理者,負責Message的傳送,Message內容的執行處理。後臺執行緒就是通過傳進來的 Handler物件引用來sendMessage(Message)。而使用Handler,需要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操作內容,例如Update UI。通常需要子類化Handler來實現handleMessage方法。

    Message Queue訊息佇列,用來存放通過Handler釋出的訊息,按照先進先出執行。每個message queue都會有一個對應的Handler。Handler會向message queue通過兩種方法傳送訊息:sendMessage或post。這兩種訊息都會插在message queue隊尾並按先進先出執行。但通過這兩種方法傳送的訊息執行的方式略有不同:通過sendMessage傳送的是一個message物件,會被 Handler的handleMessage()函式處理;而通過post方法傳送的是一個runnable物件,則會自己執行。

    Looper是每條執行緒裡的Message Queue的管家。Android沒有Global的Message Queue,而Android會自動替主執行緒(UI執行緒)建立Message Queue,但在子執行緒裡並沒有建立Message Queue。所以呼叫Looper.getMainLooper()得到的主執行緒的Looper不為NULL,但呼叫Looper.myLooper() 得到當前執行緒的Looper就有可能為NULL。

 

29、AIDL的全程是什麼?如何工作?能處理哪些型別的資料?

AIDL的英文全稱是Android Interface Define Language

當A程序要去呼叫B程序中的service時,並實現通訊,我們通常都是通過AIDL來操作的

A工程:

首先我們在net.blogjava.mobile.aidlservice包中建立一個RemoteService.aidl檔案,在裡面我們自定義一個介面,含有方法get。ADT外掛會在gen目錄下自動生成一個RemoteService.java檔案,該類中含有一個名為RemoteService.stub的內部類,該內部類中含有aidl檔案介面的get方法。

說明一:aidl檔案的位置不固定,可以任意然後定義自己的MyService類,在MyService類中自定義一個內部類去繼承RemoteService.stub這個內部類,實現get方法。在onBind方法中返回這個內部類的物件,系統會自動將這個物件封裝成IBinder物件,傳遞給他的呼叫者。

其次需要在AndroidManifest.xml檔案中配置MyService類,程式碼如下:

<!-- 註冊服務 --> 

<service android:name=".MyService">

 <intent-filter>

   <!--  指定呼叫AIDL服務的ID  -->

       <action android:name="net.blogjava.mobile.aidlservice.RemoteService" />

    </intent-filter>

</service>

為什麼要指定呼叫AIDL服務的ID,就是要告訴外界MyService這個類能夠被別的程序訪問,只要別的程序知道這個ID,正是有了這個ID,B工程才能找到A工程實現通訊。

說明:AIDL並不需要許可權

B工程:

      首先我們要將A工程中生成的RemoteService.java檔案拷貝到B工程中,在bindService方法中繫結aidl服務

      繫結AIDL服務就是將RemoteService的ID作為intent的action引數。

      說明:如果我們單獨將RemoteService.aidl檔案放在一個包裡,那個在我們將gen目錄下的該包拷貝到B工程中。如果我們將RemoteService.aidl檔案和我們的其他類存放在一起,那麼我們在B工程中就要建立相應的包,以保證RmoteService.java檔案的報名正確,我們不能修改RemoteService.java檔案

           bindService(new Inten("net.blogjava.mobile.aidlservice.RemoteService"), serviceConnection, Context.BIND_AUTO_CREATE);

       ServiceConnection的onServiceConnected(ComponentName name, IBinder service)方法中的service引數就是A工程中MyService類中繼承了RemoteService.stub類的內部類的物件。

 

 Android採用RPC的方式來實現(remote procedure call)遠端通訊,並且Android通過介面定義語言AIDL來生成兩個程序之間互相訪問的程式碼。例如,你在Activity裡的程式碼需要訪問Service中的一個方法,那麼就可以通過這種方法來實現了。

       建立一個AIDL檔案(參見程式碼)

       實現AIDL檔案生成的Java介面(參見程式碼)

       將你的介面暴露給客戶端

       客戶端呼叫

 

30、 請解釋下Android程式執行時許可權與檔案系統許可權的區別。

 Android程式執行  是虛擬機器Dalvik( android授權)

  檔案系統   是 linux 核心 授權

 

 

31、系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?

      Intent intent =newIntent();        

   intent.setAction("android.intent.action.VIEW");    

  Uri content_url =Uri.parse("http://www.163.com");   

 intent.setData(content_url);           

 intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");   

 startActivity(intent);

 

32、 有一個一維整型陣列int[] data儲存的是一張寬為width,高為height的圖片畫素值資訊。請寫一個演算法,將該圖片所有的白色不透明(0xffffffff)畫素點的透明度調整為50%。

畫素陣列int[]data裡就是一個個畫素的顏色值,迴圈和0xffffffff比較,如果相等,那麼就把這個值換成0x88ffffff就行了,這樣畫素數組裡所有的白色不透明(0xffffffff)都變成的半透明

 

33、 你如何評價Android系統?優缺點。

優點:開源特性,得到眾多廠商支援。

軟體發展很快。

介面UI,系統優化不錯。

缺點:版本過多,升級過快。

使用者體驗不一致。

 

 

 

34、程序與執行緒

當一個程式開始執行時,它就是一個程序,程序包含執行中的程式和程式所使用的記憶體和系統資源。而一個程序又是由多個執行緒組成的。引入執行緒優點是易於排程,提供開發效率,通過執行緒可以方便有效的實現併發,程序可建立多個執行緒來執行同一個程式的不同部分,開銷小,建立執行緒比建立程序要快,所需開銷很少。

35、巨集就是把一系列常用的操作作為一個整體,儲存起來,以後用的時候直接通過一定方式用就是了

先說巨集和函式的區別:

1. 巨集做的是簡單的字串替換(注意是字串的替換,不是其他型別引數的替換),而函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.

2. 巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是值,自然是計算得來的.

3. 巨集在編譯之前進行,即先用巨集體替換巨集名,然後再編譯的,而函式顯然是編譯之後,在執行時,才呼叫的.因此,巨集佔用的是編譯的時間,而函式佔用的是執行時的時間.

4. 巨集的引數是不佔記憶體空間的,因為只是做字串的替換,而函式呼叫時的引數傳遞則是具體變數之間的資訊傳遞,形參作為函式的區域性變數,顯然是佔用記憶體的.

5. 函式的呼叫是需要付出一定的時空開銷的,因為系統在呼叫函式時,要保留現場,然後轉入被呼叫函式去執行,呼叫完,再返回主調函式,此時再恢復現場,這些操作,顯然在巨集中是沒有的.

------------------------------------------------------------------------------------------------------------------------

 

  36、一條最長的簡訊息約佔多少byte?

中文70(包括標點),英文160,160個位元組。

 

  37、說說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裡面處理,當然對業務計算等操作也是必須放在的該層的。

 

  38. 請介紹下Android中常用的五種佈局。

① LinearLayout – 線性佈局。

orientation – 容器內元素的排列方式。vertical: 子元素們垂直排列;horizontal: 子元素們水平排列

gravity – 內容的排列形式。常用的有 top, bottom, left, right, center 等

 

② AbsoluteLayout – 絕對佈局。

layout_x – x 座標。以左上角為頂點

layout_y – y 座標。以左上角為頂點

 

③ TableLayout – 表格式佈局

表格佈局主要以行列的形式來管理子控制元件,其中每一行即一個TableRow物件,每個TableRow物件可以新增子控制元件,並且每加入一個空間即相當於添加了一列

 

④ RelativeLayout – 相對佈局。

layout_centerInParent – 將當前元素放置到其容器內的水平方向和垂直方向的中央位置(類似的屬性有:layout_centerHorizontal, layout_alignParentLeft 等)

layout_marginLeft – 設定當前元素相對於其容器的左側邊緣的距離

layout_below – 放置當前元素到指定的元素的下面

layout_alignRight – 當前元素與指定的元素右對齊

 

⑤ FrameLayout – 層疊佈局。以左上角為起點,將 FrameLayout 內的元素一層覆蓋一層地顯示,在幀佈局中,先新增的圖片會被後新增的圖片覆蓋。

 

  39. 如何啟用Service,如何停用Service。

第一種是通過呼叫Context.startService()啟動,呼叫Context.stopService()結束,startService()可以傳遞引數給Service

第二種方式是通過呼叫Context.bindService()啟動,呼叫Context.unbindservice()結束,還可以通過ServiceConnection訪問Service。

在Service每一次的開啟關閉過程中,只有onStart可被多次呼叫(通過多次startService呼叫),其他onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被呼叫一次。

 

  40、 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。

android中,不同程序之間傳遞資訊要用到廣播,可以有兩種方式來實現。

第一種方式:在Manifest.xml中註冊廣播,是一種比較推薦的方法,因為它不需要手動登出廣播(如果廣播未登出,程式退出時可能會出錯)。

具體實現在Manifest的application中新增:

 

<receiver android:name=".mEvtReceiver">

    <intent-filter>

    <action android:name="android.intent.action.BOOT_COMPLETED" />

    </intent-filter>

</receiver>

 

上面兩個android:name分別是廣播名和廣播的動作(這裡的動作是表示系統啟動完成),如果要自己傳送一個廣播,在程式碼中為:

Intent i = new Intent(“android.intent.action.BOOT_COMPLETED”);

sendBroadcast(i);

這樣,廣播就發出去了,然後是接收。

接收可以新建一個類,繼承至BroadcastReceiver,也可以建一個BroadcastReceiver的例項,然後得寫onReceive方法,實現如下:

protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (action.equals(“android.intent.action.BOOT_COMPLETED”)) {

//Do something

}

}

};

 

第二種方式,直接在程式碼中實現,但需要手動註冊登出,實現如下:

IntentFilter filter = new IntentFilter();

filter.addAction(“android.intent.action.BOOT_COMPLETED”);

registerReceiver(mEvtReceiver, filter); //這時註冊了一個recevier ,名為mEvtReceiver,然後同樣用上面的方法以重寫onReceiver,

最後在程式的onDestroy中要登出廣播,實現如下:

@Override

public void onDestroy() {

super.onDestroy();

unregisterReceiver(mPlayerEvtReceiver);

}

Android系統中的廣播是廣泛用於應用程式之間通訊的一種手段,它類似於事件處理機制,不同的地方就是廣播的處理是系統級別的事件處理過程(一般事件處理是控制元件級別的)。在此過程中仍然是離不開Intent物件,理解廣播事件的處理過程,靈活運用廣播處理機制,在關鍵之處往往能實現特別的效果,

在Android 中如果要傳送一個廣播必須使用sendBroadCast 向系統傳送對其感興趣的廣播接收器中。

使用廣播必須要有一個intent 物件必設定其action動作物件

使用廣播必須在配置檔案中顯式的指明該廣播物件

每次接收廣播都會重新生成一個接收廣播的物件

在BroadCast 中儘量不要處理太多邏輯問題,建議複雜的邏輯交給Activity 或者 Service 去處理

 

  41、AIDL的全稱是什麼?如何工作?能處理哪些型別的資料?

AIDL全稱Android Interface Definition Language(AndRoid介面描述語言)是一種藉口描述語言; 編譯器可以通過aidl檔案生成一段程式碼,通過預先定義的介面達到兩個程序內部通訊程序跨界物件訪問的目的.AIDL的IPC的機制和COM或CORBA類似, 是基於介面的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關類.; 2. 呼叫aidl產生的class.理論上, 引數可以傳遞基本資料型別和String, 還有就是Bundle的派生類, 不過在Eclipse中,目前的ADT不支援Bundle做為引數,

具體實現步驟如下:

  • 建立AIDL檔案, 在這個檔案裡面定義介面, 該介面定義了可供客戶端訪問的方法和屬性。

②編譯AIDL檔案, 用Ant的話, 可能需要手動, 使用Eclipse plugin的話,可以根據adil檔案自動生產java檔案並編譯, 不需要人為介入.

 

③在Java檔案中, 實現AIDL中定義的介面. 編譯器會根據AIDL介面, 產生一個JAVA介面。這個介面有一個名為Stub的內部抽象類,它繼承擴充套件了介面並實現了遠端呼叫需要的幾個方法。接下來就需要自己去實現自定義的幾個介面了.

④向客戶端提供介面ITaskBinder, 如果寫的是service,擴充套件該Service並重載onBind ()方法來返回一個實現上述介面的類的例項。

⑤在伺服器端回撥客戶端的函式. 前提是當客戶端獲取的IBinder介面的時候,要去註冊回撥函式, 只有這樣, 伺服器端才知道該呼叫那些函式

 

AIDL語法很簡單,可以用來宣告一個帶一個或多個方法的介面,也可以傳遞引數和返回值。 由於遠端呼叫的需要, 這些引數和返回值並不是任何型別.下面是些AIDL支援的資料型別:

不需要import宣告的簡單Java程式語言型別(int,boolean等)

String, CharSequence不需要特殊宣告

List, Map和Parcelables型別, 這些型別內所包含的資料成員也只能是簡單資料型別, String等其他比支援的型別.

實現介面時有幾個原則:

.丟擲的異常不要返回給呼叫者. 跨程序拋異常處理是不可取的.

.IPC呼叫是同步的。如果你知道一個IPC服務需要超過幾毫秒的時間才能完成地話,你應該避免在Activity的主執行緒中呼叫。也就是IPC呼叫會掛起應用程式導致介面失去響應. 這種情況應該考慮單起一個執行緒來處理.

.不能在AIDL介面中宣告靜態屬性。

IPC的呼叫步驟:

1. 宣告一個介面型別的變數,該介面型別在.aidl檔案中定義。

2. 實現ServiceConnection。

3. 呼叫ApplicationContext.bindService(),並在ServiceConnection實現中進行傳遞.

4. 在ServiceConnection.onServiceConnected()實現中,你會接收一個IBinder例項(被呼叫的Service). 呼叫

YourInterfaceName.Stub.asInterface((IBinder)service)將引數轉換為YourInterface型別。

5. 呼叫介面中定義的方法。你總要檢測到DeadObjectException異常,該異常在連線斷開時被丟擲。它只會被遠端方法丟擲。

6. 斷開連線,呼叫介面例項中的ApplicationContext.unbindService()

 

42、android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區別。

XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕鬆些,但一些效能敏感的資料庫或手機上還是主要採用SAX方式,SAX讀取是單向的,優點:不佔記憶體空間、解析屬性方便,但缺點就是對於套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML檔案載入到記憶體中去,這裡Android開發網提醒大家該方法在查詢方面可以和XPath很好的結合如果資料量不是很大推薦使用,而PULL常常用在J2ME對於節點處理比較好,類似SAX方式,同樣很節省記憶體,在J2ME中我們經常使用的KXML庫來解析。

 

43、DDMS和TraceView的區別?

DDMS是一個程式執行檢視器,在裡面可以看見執行緒和堆疊等資訊,TraceView是程式效能分析器

44、java中如何引用本地語言

可以用JNI介面

 

45、談談Android的IPC機制

IPC是內部程序通訊的簡稱,是共享”命名管道”的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行互動,故在Android中該機制,只適用於Activity和Service之間的通訊,類似於遠端方法呼叫,類似於C/S模式的訪問。通過定義AIDL介面檔案來定義IPC介面。Servier端實現IPC介面,Client端呼叫IPC介面本地代理。

 

46、NDK是什麼

NDK是一些列工具的集合,

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

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

 

47、 描述一下android的系統架構

android系統架構分從下往上為linux 核心層、執行庫、應用程式框架層、和應用程式層

linuxkernel:負責硬體的驅動程式、網路、電源、系統安全以及記憶體管理等功能。

  libraries和 androidruntime:libraries:即c/c++函式庫部分,大多數都是開放原始碼的函式庫,例如webkit,該函式庫負責 android網頁瀏覽器的執行,例如標準的c函式庫libc、openssl、sqlite等,當然也包括支援遊戲開發2dsgl和 3dopengles,在多媒體方面有mediaframework框架來支援各種影音和圖形檔案的播放與顯示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等眾多的多媒體檔案格式。android的runtime負責解釋和執行生成的dalvik格式的位元組碼。

  applicationframework(應用軟體架構),java應用程式開發人員主要是使用該層封裝好的api進行快速開發。

  applications:該層是java的應用程式層,android內建的googlemaps、e-mail、即時通訊工具、瀏覽器、mp3播放器等處於該層,java開發人員開發的程式也處於該層,而且和內建的應用程式具有平等的位置,可以呼叫內建的應用程式,也可以替換內建的應用程式。

  上面的四個層次,下層為上層服務,上層需要下層的支援,呼叫下層的服務,這種嚴格分層的方式帶來的極大的穩定性、靈活性和可擴充套件性,使得不同層的開發人員可以按照規範專心特定層的開發。

  android應用程式使用框架的api並在框架下執行,這就帶來了程式開發的高度一致性,另一方面也告訴我們,要想寫出優質高效的程式就必須對整個 applicationframework進行非常深入的理解。精通applicationframework,你就可以真正的理解android的設計和執行機制,也就更能夠駕馭整個應用層的開發。

 

1. Intent的幾種有關Activity啟動的方式有哪些,你瞭解每個含義嗎?

Intent的一些標記有FLAG_ACTIVITY_BROUGHT_TO_FRONT 、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK 等。

 

  2. Activity和Task的啟動模式有哪些? 每種含義是什麼?

   有關在AndroidManifest.xml中的android:launchMode定義,主要有standard、singleTop、singleTask和singleInstance,同時對於android:taskAffinity這些問題大家也要了解,Android開發網在以前的文章中講過,不過很多開發者仍然不是很清楚,這些基礎問題我們以後仍然會再次總結。

 

  3. 通過Intent傳遞一些二進位制資料的方法有哪些?

 

 

--------------------------------------------------------------------------------

 

   1). 使用Serializable介面實現序列化,這是Java常用的方法。

   2). 實現Parcelable介面,這裡Android的部分類比如Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換資料也很常見的。

 

  4. 能說下Android應用的入口點嗎?

  真正的Android入口點是application的main,你可以看下androidmanifest.xml的包含關係就清楚了。 可以沒有Activity但是必須有Application

 

5. Android都有哪些XML解析器,都熟練掌握嗎?

  這裡XmlPull、SAX和DOM相信做過Web開發的都已經滾瓜爛熟了。

 

  6. SQLite支援事務嗎? 新增刪除如何提高效能?

  SQLite作為輕量級的資料庫,比MySQL還小,但支援SQL語句查詢,提高效能可以考慮通過原始經過優化的SQL查詢語句方式處理。

 

  7. Android Service和Binder、AIDL你都熟練嗎?

  作為Android重要的後臺服務,這些每個Android開發者都應該掌握,這也算是和Java SE最大的不同了,具體的例項大家可以檢視Android音樂播放器的原始碼Music.git中的,這裡不再贅述。

 

8. 你用過哪款Android手機,有哪些優點和不足,相對於iPhone或Symbian又有哪些優缺點?

   把這個作為面試題也是考察下,可以大概瞭解到它對Android的瞭解程度,多移動開發的認識。

 

9. android:paddingLeft與android:layout_marginLeft的區別

當按鈕分別設定以上兩個屬性時,得到的效果是不一樣的。

android:paddingLeft="30px"

按鈕上設定的內容(例如圖片)離按鈕左邊邊界30個畫素

android:layout_marginLeft="30px"

整個按鈕離左邊設定的內容30個畫素

 

 

返回鍵與Home鍵區別?

back鍵預設行為是finish處於前臺的Activity的即Activity的狀態為Destroy狀態為止,再次啟動該Activity是從onCreate開始的(不會呼叫onSaveInstanceState方法)。Home鍵預設是stop前臺的Activity即狀態為onStop為止而不是Destroy,若再次啟動它,會呼叫onSaveInstanceState方法,保持上次Activity的狀態則是從OnRestart開始的---->onStart()--->onResume()。

 

 

1、Android作業系統是Google在什麼時間公佈的

A、2007年11月5日   B、2010年5月20日晚10點30分   C、2009年11月10日

正確答案:A

2、Android基於什麼平臺的開源智慧手機作業系統名稱

A、WinCE    B、Linux   C、SHP  

正確答案:B

3、Linux平臺由以下下哪些組成?

A、作業系統  B、中介軟體   C、使用者介面   D、應用軟體

正確答案:ABCD

4、Android作業系統主要的特點是:(         )

A、與Google無縫結合        B、實現個性化應用   

C、良好的平臺開放性         D、軟體均要收費

正確答案:ABC

5、Android作業系統向開發人員提供是

A、全部免費    B、部分收費     C、只有10%左右是收費的

正確答案:A

6、Android個性化介面設定的新增方式

A、點選螢幕下方新增鍵進行新增   B、長按螢幕空白處進行新增  C、直接拖拽至螢幕進行新增

正確答案:ABC

7、個性化介面設定不同內容包括:

A、快捷方式   B、小外掛   C、視窗小部件      D、資料夾

正確答案:ABCD

8、Android作業系統採用全新解鎖方式描述正確的是:(    )

A、自定義圖型解鎖; B、滑動解鎖; C、規定圖型解鎖; D、只可側鍵解鎖;

正確答案:AB

9、Android支援谷歌全方位移動服務,豐富最新網路體驗包括:

A、電子市場;    B、Google Talk;    C、Google搜尋;  

D、G-mail郵箱;   E、Google地圖

正確答案:ABCDE

10、截止2010年12月,中國上市的Andriod作業系統已經發布了以下哪幾個版本

A、1.0      B、1.3     C、1.5      D、1.6      E 、2.0   F、2.1   G、2.2

正確答案:ACDEFG

11、在中國,以下哪些屬於Android軟體主要下載門戶?(       )

A、安卓網    B、機鋒網     C、百度      D、Google    E、優億市場

正確答案:ABE

12、Android安裝軟體字尾是:(       )

A..sis         B.cab          C..apk         D..jar

正確答案:C

13、以下哪些不是Android作業系統的版本:(      )

A、1.0      B、1.3     C、 2.0      D、2.1      E 、2.2

正確答案:B

14、Android操作平臺的開放性也針對了眾多手機品版的廠家進行了完全的開放,以下有哪幾個品牌的手機從未使用過Android作業系統:(       )

A.HTC     B.I phone       C.samsung         D.諾基亞        E.黑莓

正確答案:BDE

15、Android1.5作業系統叫(         )

A.紙杯蛋糕    B.甜甜圈     C.法式奶油夾心甜點    D.果餡餅    E.凍酸奶

正確答案:A

16、Android1.6作業系統叫(         )

A.紙杯蛋糕    B.甜甜圈     C.法式奶油夾心甜點    D.果餡餅    E.凍酸奶

正確答案:B

17、Android2.0作業系統叫(         )

A.紙杯蛋糕    B.甜甜圈     C.法式奶油夾心甜點    D.果餡餅    E.凍酸奶

正確答案:C

18、Android2.1作業系統叫(         )

A.紙杯蛋糕    B.甜甜圈     C.法式奶油夾心甜點    D.果餡餅    E.凍酸奶

正確答案:D<