android 面試題總結

 http://blog.csdn.net/dingmaolin/article/details/8115957javascript

什麼是Activity? 
    請描述一下Activity生命週期。 
    兩個Activity之間跳轉時必然會執行的是哪幾個方法。 
    橫豎屏切換時候Activity的生命週期。 
    如何將一個Activity設置成窗口的樣式。 
    你後臺的Activity被系統 回收怎麼辦? 
    如何退出Activity?如何安全退出已調用多個Activity的Application? 
    若是後臺的Activity因爲某緣由被系統回收了,如何在被系統回收以前保存當前狀態? 
    兩個Activity之間怎麼傳遞數據? 
    怎麼讓在啓動一個Activity是就啓動一個service? 
    同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中? 
    Activity怎麼和service綁定,怎麼在activity中啓動本身對應的service? 
    什麼是Service以及描述下它的生命週期。 
    Service有哪些啓動方法,有什麼區別,怎樣停用Service? 
    不用service,B頁面爲音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放? 
    什麼是IntentService?有何優勢? 
    何時使用Service? 
    請描述一下Intent 和 Intent Filter。 
    Intent傳遞數據時,能夠傳遞哪些類型數據? 
    說說Activity,Intent,Service是什麼關係 。 
    請描述一下Broadcast Receiver。 
    在manifest和代碼中如何註冊和使 用 broadcast receiver 。 
    請介紹下ContentProvider是如何實現數據共享的。 
    請介紹下Android的數據存儲方式。 
    爲何要用ContentProvider?它和sql的實現上有什麼差異? 
    請介紹下Android中經常使用的五種佈局。 
    談談UI中, Padding和Margin有什麼區別? 
    widget相對位置的完成在antivity的哪一個生命週期階段實現。 
    請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係。 
    AIDL的全稱是什麼?如何工做?能處理哪些類型的數據? 
    請解釋下Android程序運行時權限與文件系統權限的區別。 
    系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面? 
    對多線程的運用和理解,及多線程之間handle的傳值。 
    對android虛擬機的理解,包括內存管理機制垃圾回收機制。 
    Framework工做方式及原理,Activity是如何生成一個view的,機制是什麼。 
     android自己的一些限制,好比apk包大小限制,讀取大文件時的時間限。 
    如何加載的音樂信息,如何改善其效率。 
    ListView如何提升其效率? 
    啓動應用後,改變系統語言,應用的語言會改變麼? 
    啓動一個程序,能夠主界面點擊圖標進入,也能夠從一個程序中跳轉過去,兩者有什麼區別? 
    Android程序與Java程序的區別? 
    Android中Task任務棧的分配。 
    在Android中,怎麼節省內存的使用,怎麼主動回收內存? 
    不一樣工程中的方法是否能夠相互調用? 
    在Android中是如何實現判斷區分通話記錄中的電話狀態,去電,來電、未接來電? 
    dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念 
    sim卡的EF 文件有何做用 
    如何判斷是否有SD卡? 
    嵌入式操做系統內存管理有哪幾種, 各有何特性。 
    什麼是嵌入式實時操做系統, Android 操做系統屬於實時操做系統嗎? 
    一條最長的短信息約佔多少byte? 
    Linux中跨進程通訊的幾種方式 。 
    談談對Android NDK的理解。 
    談談Android的優勢和不足之處。 
    Android系統中GC什麼狀況下會出現內存泄露呢? 
    Android UI中的View如何刷新。 
    簡單描述下Android 數字簽名。 
    什麼是ANR 如何避免它? 
    android中的動畫有哪幾類,它們的特色和區別是什麼? 
    handler機制的原理。 
    android中線程與線程,進程與進程之間如何通訊。 
    說說mvc模式的原理,它在android中的運用。 
    android中有哪幾種解析xml的類,官方推薦哪一種?以及它們的原理和區別。 
    DDMS與TraceView的區別? 
    res目錄有默認幾項resource。 
    android的哪一個版本是一次重大的升級? 

    一、 Android dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念 
      DVM指dalivk的虛擬機。每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每個DVM都是在Linux 中的一個進程,因此說能夠認爲是同一個概念。 
      二、sim卡的EF 文件有何做用 
      sim卡的文件系統有本身規範,主要是爲了和手機通信,sim本 身能夠有本身的操做系統,EF就是做存儲並和手機通信用的 
      三、嵌入式操做系統內存管理有哪幾種, 各有何特性 
      頁式,段式,段頁,用到了MMU,虛擬空間等技術 
      四、 什麼是嵌入式實時操做系統, Android 操做系統屬於實時操做系統嗎? 
      嵌入式實時操做系統是指當外界事件或數據產生時,可以接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調一致運行的嵌入式操做系統。主要用於工業控制、軍事設備、航空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系統。又可分爲軟實時和硬實時兩種,而android是基於linux內核的,所以屬於軟實時。 
      五、一條最長的短信息約佔多少byte? 
      中文70(包括標點),英文160,160個字節。 
      六、 android中的動畫有哪幾類,它們的特色和區別是什麼? 
      兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式能夠使視圖組件移動、放大、縮小以及產生透明度的變化;另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。 
      七、handler機制的原理 
      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。 
      八、說說mvc模式的原理,它在android中的運用 
    android的官方建議應用程序的開發採用mvc模式。何謂mvc? 

      mvc是model,view,controller的縮寫,mvc包含三個部分: 

      l模型(model)對象:是應用程序的主體部分,全部的業務邏輯都應該寫在該層。 

      l視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶惟一能夠看到的一層,接收用戶的輸入,顯示處理結果。 

      l控制器(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裏面處理,固然對業務計算等操做也是必須放在的該層的。 
      九、Activity的生命週期 
      和其餘手機 平臺 的應用 程序 同樣,Android的應用程序 的生命週期是被統一掌控 的,也 
      就是說咱們寫的應用程序命運掌握在別人(系統)的手裏,咱們不能改變它,只能學習 並 
      適應它。 
      簡單地說一下爲何是這樣:咱們手機在運行 一個應用程序的時候,有可能打進來電話 
      發進來短信 ,或者沒有電了,這時候程序都會被中斷,優先去服務電話的基本功能 ,另 
      外系統也不容許你佔用太多資源 ,至少要保證電話功能吧,因此資源不足的時候也就有可 
      能被幹掉。 
      言歸正傳,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(); 
      } 
      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]來處理多線程和界面交互的問題。 
      十、讓Activity變成一個窗口:Activity屬性設定 
      講點輕鬆的吧,可能有人但願作出來的應用程序是一個漂浮在手機主界面的東西,那麼很 
      簡單你只須要設置 一下Activity的主題就能夠了在AndroidManifest.xml 中定義 Activity的 
      地方一句話: 
      Xml代碼 
      android :theme=」@android:style/Theme.Dialog」 
      android:theme=」@android:style/Theme.Dialog」 
      這就使你的應用程序變成對話框的形式彈出來了,或者 
      Xml代碼 
      android:theme=」@android:style/Theme.Translucent」 
      android:theme=」@android:style/Theme.Translucent」 
      就變成半透明的,[友情提示-.-]相似的這種activity的屬性能夠在android.R.styleable 類的AndroidManifestActivity 方法中看到,AndroidManifest.xml中全部元素的屬性的介紹均可以參考這個類android.R.styleable 
      上面說的是屬性名稱,具體有什麼值是在android.R.style中能夠看到,好比這個」@android:style/Theme.Dialog」 就對應於android.R.style.Theme_Dialog ,(‘_’換成’.’ < --注意:這個是文章內容不是笑臉)就能夠用在描述文件 中了,找找類定義和描述文件中的對應關係就都明白了。 
      十一、 你後臺的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"); 
      } 
      就像官方的Notepad教程裏的狀況,你正在編輯某一個note,忽然被中斷,那麼就把這個note的id記住,再起來的時候就能夠根據這個id去把那個note取出來,程序就完整一些。這也是看你的應用需不須要保存什麼,好比你的界面就是讀取一個列表,那就不須要特殊記住什麼,哦,沒準你須要記住滾動條的位置... 
      十二、 調用與被調用:咱們的通訊使者Intent 
      要說Intent了,Intent就是這個這個意圖 ,應用程序間Intent進行交流,打個電話啦,來個 
      電話啦都會發Intent, 這個是Android架構的鬆耦合的精髓部分,大大提升了組件的複用性,好比你要在你的應用程序中點擊按鈕,給某人打電話,很簡單啊,看下代碼先: 
      Java代碼 
      Intent intent = new Intent(); 
      intent.setAction(Intent.ACTION_CALL); 
      intent.setData(Uri.parse("tel:" + number)); 
      startActivity(intent); 
      扔出這樣一個意圖,系統看到了你的意圖就喚醒了電話撥號程序,打出來電話。什麼讀聯繫人,發短信啊,郵件啊,通通只須要扔出intent就行了,這個部分設計地確實很好啊。 
      那Intent經過什麼來告訴系統須要誰來接受他呢? 
      一般使用Intent有兩種方法,第一種是直接說明須要哪個類來接收代碼以下: 
      Java代碼 
      Intent intent = new Intent(this, MyActivity.class); 
      intent.getExtras().putString("id", "1"); 
      tartActivity(intent); 
      第一種方式很明顯,直接指定了MyActivity爲接受者,而且傳了一些數據給MyActivity,在MyActivity裏能夠用getIntent()來的到這個intent和數據。 
      第二種就須要先看一下AndroidMenifest中的intentfilter的配置了 
      Xml代碼 
      < intent-filter> 
      < action 
      android:name="android.intent.action.VIEW" 
      /> 
      < action 
      android:value="android.intent.action.EDIT" 
      /> 
      < action 
      android:value="android.intent.action.PICK" 
      /> 
      < category 
      android:name="android.intent.category.DEFAULT" 
      /> 
      < data 
      android:mimeType="vnd.android.cursor.dir/vnd.google.note" 
      /> 
      < /intent-filter> 
      這裏面配置用到了action, data, category這些東西,那麼聰明的你必定想到intent裏也會有這些東西,而後一匹配不就找到接收者了嗎? 
      action其實就是一個意圖的字符串名稱。 
      上面這段intent-filter的配置文件說明了這個Activity能夠接受不一樣的Action,固然相應的程序邏輯也不同咯,提一下那個 mimeType,他是在ContentProvider裏定義的,你要是本身實現一個ContentProvider就知道了,必須指定 mimeType才能讓數據被別人使用。 
      不知道原理說明白沒,總結一句,就是你調用別的界面不是直接new那個界面,而是經過扔出一個intent,讓系統幫你去調用那個界面,這樣就多麼鬆藕合啊,並且符合了生命週期被系統管理的原則。 
      想知道category都有啥,Android爲你預先定製好的action都有啥等等,請親自訪問官方連接Intent 
      ps:想知道怎麼調用系統應用程序的同窗,能夠仔細看一下你的logcat,每次運行一個程序的時候是否是有一些信息好比: 
      Starting activity: Intent { action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER} flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} } 
      再對照一下Intent的一些set方法,就知道怎麼調用咯,但願你喜歡:) 
      13. 如何退出Activity?如何安全退出已調用多個Activity的Application? 
    對於單一Activity的應用來講,退出很簡單,直接finish()便可。 
    固然,也能夠用killProcess()和System.exit()這樣的方法。 

    可是,對於多Activity的應用來講,在打開多個Activity後,若是想在最後打開的Activity直接退出,上邊的方法都是沒有用的,由於上邊的方法都是結束一個Activity而已。 
    固然,網上也有人說能夠。 
    就好像有人問,在應用裏如何捕獲Home鍵,有人就會說用keyCode比較KEYCODE_HOME便可,而事實上若是不修改framework,根本不可能作到這一點同樣。 
    因此,最好仍是本身親自試一下。 

    那麼,有沒有辦法直接退出整個應用呢? 
    在2.1以前,能夠使用ActivityManager的restartPackage方法。 
    它能夠直接結束整個應用。在使用時須要權限android.permission.RESTART_PACKAGES。 
    注意不要被它的名字迷惑。 

    但是,在2.2,這個方法失效了。 
    在2.2添加了一個新的方法,killBackgroundProcesses(),須要權限 android.permission.KILL_BACKGROUND_PROCESSES。 
    惋惜的是,它和2.2的restartPackage同樣,根本起不到應有的效果。 

    另外還有一個方法,就是系統自帶的應用程序管理裏,強制結束程序的方法,forceStopPackage()。 
    它須要權限android.permission.FORCE_STOP_PACKAGES。 
    而且須要添加android:sharedUserId=」android.uid.system」屬性 
    一樣惋惜的是,該方法是非公開的,他只能運行在系統進程,第三方程序沒法調用。 
    由於須要在Android.mk中添加LOCAL_CERTIFICATE := platform。 
    而Android.mk是用於在Android源碼下編譯程序用的。 

    從以上能夠看出,在2.2,沒有辦法直接結束一個應用,而只能用本身的辦法間接辦到。 

    現提供幾個方法,供參考: 

    一、拋異常強制退出: 
    該方法經過拋異常,使程序Force Close。 
    驗證能夠,可是,須要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。 

    二、記錄打開的Activity: 
    每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。 

    三、發送特定廣播: 
    在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。 

    四、遞歸退出 
    在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。 

    除了第一個,都是想辦法把每個Activity都結束掉,間接達到目的。 
    可是這樣作一樣不完美。 
    你會發現,若是本身的應用程序對每個Activity都設置了nosensor,在兩個Activity結束的間隙,sensor可能有效了。 
    但至少,咱們的目的達到了,並且沒有影響用戶使用。 

    爲了編程方便,最好定義一個Activity基類,處理這些共通問題。 
    摘自:http://blog.csdn.net/debug2/archive/2011/02/18/6193644.aspx 
      14. 請介紹下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 內的元素一層覆蓋一層地顯示,在幀佈局中,先添加的圖片會被後添加的圖片覆蓋。 
    摘自:http://javalover00000.javaeye.com/blog/851266 
      15. 請介紹下Android的數據存儲方式。 
    Android提供了5種方式存儲數據: 
    一、使用SharedPreferences存儲數據; 
    二、文件存儲數據; 
    三、SQLite數據庫存儲數據; 
    四、使用ContentProvider存儲數據; 
    五、網絡存儲數據; 
    Android 中的數據存儲都是私有的,其餘應用程序都是沒法訪問的,除非經過ContentResolver獲取其餘程序共享的數據。 
    摘自:http://www.moandroid.com/?p=319 
      16. 請介紹下ContentProvider是如何實現數據共享的。 
    一個程序能夠經過實現一個Content provider的抽象接口將本身的數據徹底暴露出去,並且Content providers是以相似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,經過它可讓全部的應用程序訪問到,這也是應用程序之間惟一共享數據的方法。要想使應用程序的數據公開化,可經過2種方法:建立一個屬於你本身的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型而且有寫入Content provider的權限。 

    如何經過一套標準及統一的接口獲取其餘應用程序暴露的數據?Android提供了ContentResolver,外界的程序能夠經過ContentResolver接口訪問ContentProvider提供的數據。 
    參考:http://www.moandroid.com/?p=319 
      17. 如何啓用Service,如何停用Service。 
    1.第一種是經過調用Context.startService()啓動,調用Context.stopService()結束,startService()能夠傳遞參數給Service 

    2.第二種方式是經過調用Context.bindService()啓動,調用Context.unbindservice()結束,還能夠經過ServiceConnection訪問Service。 
    在Service每一次的開啓關閉過程當中,只有onStart可被屢次調用(經過屢次startService調用),其餘onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。 
    參考:http://www.cnblogs.com/feisky/archive/2010/06/14/1758336.html 
      18. 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。 
    android中,不一樣進程之間傳遞信息要用到廣播,能夠有兩種方式來實現。 
    第一種方式:在Manifest.xml中註冊廣播,是一種比較推薦的方法,由於它不須要手動註銷廣播(若是廣播未註銷,程序退出時可能會出錯)。 
    具體實如今Manifest的application中添加: 





    上面兩個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 去處理 
    轉自:http://www.dengdeng.name/u/deng/archives/2010/92.html 

    http://www.cnblogs.com/TerryBlog/archive/2010/08/16/1801016.html 

      19. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係。 
    簡單的說,Handler獲取當前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發和處理 
    參見:http://hi.baidu.com/���˲���/blog/item/4e576b7c58d742360cd7dac9.html 

    http://blog.csdn.net/xuxinyl/archive/2010/12/25/6097560.aspx 

      20. 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支持的數據類型: 

    1. 不須要import聲明的簡單Java編程語言類型(int,boolean等) 

    2. String, CharSequence不須要特殊聲明 

    3. List, Map和Parcelables類型, 這些類型內所包含的數據成員也只能是簡單數據類型, String等其餘比支持的類型. 

    (另外: 我沒嘗試Parcelables, 在Eclipse+ADT下編譯不過, 或許之後會有所支持). 

    實現接口時有幾個原則: 

    .拋出的異常不要返回給調用者. 跨進程拋異常處理是不可取的. 

    .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() 
    參考:http://buaadallas.blog.51cto.com/399160/372090 
      21. 請解釋下Android程序運行時權限與文件系統權限的區別。 
    apk程序是運行在虛擬機上的,對應的是Android獨特的權限機制,只有體現到文件系統上時才使用linux的權限設置。 
    android系統有的權限是基於簽名的。 
    具體參見:http://blog.csdn.net/Zengyangtech/archive/2010/07/20/5749999.aspx 
      22. 系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?請說明起因。 
    經過直接發送Uri把參數帶過去,或者經過manifest裏的intentfilter裏的data屬性 
      23. 有一個一維整型數組int[]data保存的是一張寬爲width,高爲height的圖片像素值信息。請寫一個算法,將該圖片全部的白色不透明(0xffffffff)像素點的透明度調整爲50%。 
      2四、什麼是ANR 如何避免它? 
      答:ANR:Application Not Responding,五秒在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列狀況時,Android就會顯示ANR對話框了: 
      對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒 
      意向接受器(intentReceiver)超過10秒鐘仍未執行完畢 
      Android應用程序徹底運行在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運行的,須要消耗大量時間的操做都會引起ANR。由於此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intent broadcast)。 
      所以,任何運行在主線程中的方法,都要儘量的只作少許的工做。特別是活動生命週期中的重要方法如onCreate()和 onResume()等更應如此。潛在的比較耗時的操做,如訪問網絡和數據庫;或者是開銷很大的計算,好比改變位圖的大小,須要在一個單獨的子線程中完成 (或者是使用異步請求,如數據庫操做)。但這並不意味着你的主線程須要進入阻塞狀態已等待子線程結束 — 也不須要調用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程爲子線程提供一個句柄(Handler),讓子線程在即將結束的時候調用它(xing:能夠參看Snake的例子,這種方法與之前咱們所接觸的有所不一樣)。使用這種方法涉及你的應用程序,可以保證你的程序對輸入保持良好的響應,從而避免由於輸入事件超過5秒鐘不被處理而產生的ANR。這種實踐須要應用到全部顯示用戶界面的線程,由於他們都面臨着一樣的超時問題。 
      2五、什麼狀況會致使Force Close ?如何避免?可否捕獲致使其的異常? 
      答:通常像空指針啊,能夠看起logcat,而後對應到程序中 來解決錯誤 
      2六、Android自己的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會致使什麼問題?如何解決? 
      2七、簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver 
      答:一個activity呈現了一個用戶能夠操做的可視化用戶界面 
      一個service不包含可見的用戶界面,而是在後臺無限地運行 
      能夠鏈接到一個正在運行的服務中,鏈接後,能夠經過服務中暴露出來的藉口與其進行通訊 
      一個broadcast receiver是一個接收廣播消息並做出迴應的component,broadcast receiver沒有界面 
      intent:content provider在接收到ContentResolver的請求時被激活。 
      activity, service和broadcast receiver是被稱爲intents的異步消息激活的。 
    一個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文件中聲明的。 
      2八、IntentService有何優勢? 
      答:IntentService 的好處 
      * Acitivity的進程,當處理Intent的時候,會產生一個對應的Service 
      * Android的進程處理器如今會盡量的不kill掉你 
      * 很是容易使用 
      2九、橫豎屏切換時候activity的生命週期? 
      一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次 
      二、設置Activity的android:configChanges=」orientation」時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次 
      三、設置Activity的android:configChanges=」orientation|keyboardHidden」時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法 
      30. 如何將SQLite數據庫(dictionary.db文件)與apk文件一塊兒發佈? 
      解答:能夠將dictionary.db文件複製到Eclipse Android工程中的res aw目錄中。全部在res aw目錄中的文件不會被壓縮,這樣能夠直接提取該目錄中的文件。能夠將dictionary.db文件複製到res aw目錄中 
      31. 如何將打開res aw目錄中的數據庫文件? 
      解答:在Android中不能直接打開res aw目錄中的數據庫文件,而須要在程序第一次啓動時將該文件複製到手機內存或SD卡的某個目錄中,而後再打開該數據庫文件。複製的基本方法是使用getResources().openRawResource方法得到res aw目錄中資源的 InputStream對象,而後將該InputStream對象中的數據寫入其餘的目錄中相應文件中。在Android SDK中能夠使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件。 
      32. Android引入廣播機制的用意? 
      答:a:從MVC的角度考慮(應用程序內) 
     其實回答這個問題的時候還能夠這樣問,android爲何要有那4大組件,如今的移動開發模型基本上也是照搬的web那一套MVC架構,只不過是改了點嫁妝而已。android的四大組件本質上就是爲了實現移動或者說嵌入式設備上的MVC架構,它們之間有時候是一種相互依存的關係,有時候又是一種補充關係,引入廣播機制能夠方便幾大組件的信息和數據交互。 
      b:程序間互通消息(例如在本身的應用程序內監聽系統來電) 
      c:效率上(參考UDP的廣播協議在局域網的方便性) 
      d:設計模式上(反轉控制的一種應用,相似監聽者模式) 
    轉自:http://www.cnmsdn.com/html/201101/1295431222ID9251.html 
    3三、android 的優點與不足 
    Android平臺手機 5大優點: 
    1、開放性 
    在優點方面,Android平臺首先就是其開發性,開發的平臺容許任何移動終端廠商加入到Android聯盟中來。顯著的開放性能夠使其擁有更多的開發者,隨着用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟 
    開發性對於Android的發展而言,有利於積累人氣,這裏的人氣包括消費者和廠商,而對於消費者來說,隨大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將能夠用更低的價位購得心儀的手機。 
    2、掙脫運營商的束縛 

    在過去很長的一段時間,特別是在歐美地區,手機應用每每受到運營商制約,使用什麼功能接入什麼網絡,幾乎都受到運營商的控制。從去年iPhone 上市,用戶能夠更加方便地鏈接網絡,運營商的制約減小。隨着EDGE、HSDPA這些2G至3G移動網絡的逐步過渡和提高,手機隨意接入網絡已不是運營商口中的笑談,當你能夠經過手機IM軟件方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是否是像噩夢同樣? 
    互聯網巨頭Google推進的Android終端天生就有網絡特點,將讓用戶離互聯網更近。 
    3、豐富的硬件選擇 
    這一點仍是與Android平臺的開放性相關,因爲Android的開放性,衆多的廠商會推出千奇百怪,功能特點各具的多種產品。功能上的差別和特點,卻不會影響到數據同步、甚至軟件的兼容,比如你從諾基亞 Symbian風格手機 一下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟件帶到iPhone上使用、聯繫人等資料更是能夠方便地轉移,是否是很是方便呢? 
    4、不受任何限制的開發商 
    Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各類條條框框的阻擾,可想而知,會有多少新穎別緻的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和遊戲如可控制正是留給Android難題之一。 
    5、無縫結合的Google應用 
    現在叱詫互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成爲鏈接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。 
    再說Android的5大不足: 
    1、安全和隱私 
    因爲手機與互聯網的緊密聯繫,我的隱私很可貴到保守。除了上網過程當中經意或不經意留下的我的足跡,Google這個巨人也時時站在你的身後,洞穿一切,所以,互聯網的深刻將會帶來新一輪的隱私危機。 
    2、首先開賣Android手機的不是最大運營商 
    衆所周知,T-Mobile在23日,於美國紐約發佈了Android首款手機G1。可是在北美市場,最大的兩家運營商乃AT&T和Verizon,而目前所知取得Android手機銷售權的僅有 T-Mobile和Sprint,其中T-Mobile的3G網絡相對於其餘三家也要遜色很多,所以,用戶能夠買帳購買G1,可否體驗到最佳的3G網絡服務則要另當別論了! 
    3、運營商仍然可以影響到Android手機 
    在國內市場,很多用戶對購得移動定製機不滿,感受所購的手機被人塗畫了廣告通常。這樣的狀況在國外市場一樣出現。Android手機的另外一發售運營商Sprint就將在其機型中內置其手機商店程序。 
    4、同類機型用戶減小 
    在很多手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,並分享軟件資源。而對於Android平臺手機,因爲廠商豐富,產品類型多樣,這樣使用同一款機型的用戶愈來愈少,缺乏統一機型的程序強化。舉個稍顯不當的例子,如今山寨機氾濫,品種各異,就不多有專門針對某個型號山寨機的討論和羣組,除了哪些功能異常搶眼、頗受追捧的機型之外。 
    5、過度依賴開發商缺乏標準配置 
    在 使用PC端的Windows Xp系統的時候,都會內置微軟Windows Media Player這樣一個瀏覽器程序,用戶能夠選擇更多樣的播放器,如Realplay或暴風影音等。但入手開始使用默認的程序一樣能夠應付多樣的須要。在 Android平臺中,因爲其開放性,軟件更多依賴第三方廠商,好比Android系統的SDK中就沒有內置音樂播放器,所有依賴第三方開發,缺乏了產品的統一性。 
    3四、android 中有哪幾種解析xml的類?官方推薦哪一種?以及它們的原理和區別。 
    XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發咱們使用Dom相對輕鬆些,但一些性能敏感的數據庫或手機上仍是主要採用SAX方式,SAX讀取是單向的,優勢:不佔內存空間、解析屬性方便,但缺點就是對於套嵌多個分支來講處理不是很方便。而DOM方式會把整個XML文件加載到內存中去,這裏Android開發網提醒你們該方法在查找方面能夠和XPath很好的結合若是數據量不是很大推薦使用,而PULL經常用在J2ME對於節點處理比較好,相似SAX方式,一樣很節省內存,在J2ME中咱們常用的KXML庫來解析。 
    詳細狀況請參考 http://blog.csdn.net/Android_Tutor/archive/2010/09/17/5890835.aspx 

    http://www.linuxidc.com/Linux/2010-11/29768.htm 

    http://littlefermat.blog.163.com/blog/static/59771167200981853037951/ 

    3五、DDMS和TraceView的區別? 
    DDMS是一個程序執行查看器,在裏面能夠看見線程和堆棧等信息,TraceView是程序性能分析器 
    3六、Activity被回收了怎麼辦? 
    只有另啓用了 
    3七、java中如何引用本地語言 
    能夠用JNI接口 
    3八、談談Android的IPC機制 
    IPC是內部進程通訊的簡稱,是共享」命名管道」的資源。Android中的IPC機制是爲了讓Activity和Service之間能夠隨時的進行交互,故在Android中該機制,只適用於Activity和Service之間的通訊,相似於遠程方法調用,相似於C/S模式的訪問。經過定義AIDL接口文件來定義IPC接口。Servier端實現IPC接口,Client端調用IPC接口本地代理。 
    3九、NDK是什麼 
    NDK是一些列工具的集合, 
    NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java 應用打成apk包。 
    NDK集成了交叉編譯器,並提供了相應的mk文件和隔離cpu、平臺等的差別,開發人員只需簡單的修改mk文件就能夠建立出so 
    40 描述一下android的系統架構 
    android系統架構分從下往上爲linux 內核層、運行庫、應用程序框架層、和應用程序層 
    linuxkernel:負責硬件的驅動程序、網絡、電源、系統安全以及內存管理等功能。 

      libraries和 androidruntime:libraries:即c/c++函數庫部分,大多數都是開放源代碼的函數庫,例如webkit,該函數庫負責 android網頁瀏覽器的運行,例如標準的c函數庫libc、openssl、sqlite等,固然也包括支持遊戲開發2dsgl和 3dopengles,在多媒體方面有mediaframework框架來支持各類影音和圖形文件的播放與顯示,例如mpeg四、h.26四、mp三、 aac、amr、jpg和png等衆多的多媒體文件格式。android的runtime負責解釋和執行生成的dalvik格式的字節碼。 

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

      applications:該層是java的應用程序層,android內置的googlemaps、e-mail、即時通訊工具、瀏覽器、mp3播放器等處於該層,java開發人員開發的程序也處於該層,並且和內置的應用程序具備平等的位置,能夠調用內置的應用程序,也能夠替換內置的應用程序。 

      上面的四個層次,下層爲上層服務,上層須要下層的支持,調用下層的服務,這種嚴格分層的方式帶來的極大的穩定性、靈活性和可擴展性,使得不一樣層的開發人員能夠按照規範專心特定層的開發。 

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

相關文章
相關標籤/搜索