天天看點

Android面試題目總結

已經進入11月份,公司也都跑了一遍,把之前整理的資料也慢慢的整理出來。這一篇是Android可能出的面試的題目的總結,以後慢慢補充。

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

DVM指Dalvik的虛拟機。每一個Android應用程式都在它自己的程序中運作,都擁有一個獨立的Dalvik虛拟機執行個體。而每一個DVM都是在Linux 中的一個程序,是以說可以認為是同一個概念。

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

兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實作方式可以使視圖元件移動、放大、縮小以及産生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖檔來實作,類似電影。

3、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。

4、說說mvc模式的原理,它在android中的運用

MVC(Model_view_contraller)” 模型_視圖_控制器”。 MVC應用程式總是由這三個部分組成。Event(事件)導緻Controller改變Model或View,或者同時改變兩者。隻要 Controller改變了Models的資料或者屬性,所有依賴的View都會自動更新。類似的,隻要Controller改變了View,View會從潛在的Model中擷取資料來重新整理自己。

5、View的重新整理:

在需要重新整理的地方,使用handle.sendmessage發送資訊,然後在handle的getmessage裡面執行invaliate或者postinvaliate.

6、GC記憶體洩露出現情況:

  1. 資料庫的cursor沒有關閉
  2. 構造adapter時,沒有使用緩存contentview,衍生listview的優化問題—–減少建立view的對象,充分使用contentview,可以使用一靜态類來優化處理getview的過程/
  3. Bitmap對象不使用時采用recycle()釋放記憶體
  4. activity中的對象的生命周期大于activity

7、Intent的設計的優勢或者設計初衷

  • Android使用了統一的封裝來實作了一緻的程式設計模型。
  • 實作系統各個部分的一個松耦合,比如可以指定啟動具有某種特征的程式而不需要寫死

8、Android為什麼要設計4大元件,他們之間的聯系,不設計行不行(主要是為了實作MVC模式,然而java中最難的模式也是這個,很少有産品能将這個模式做得很好

9、Service的生命周期

Android面試題目總結
  1. Service常用生命周期回調方法如下:
    1. onCreate() 該方法在服務被建立時調用,該方法隻會被調用一次,無論調用多少次startService()或bindService()方法,服務也隻被建立一次。 onDestroy()該方法在服務被終止時調用。
  2.  Context.startService()啟動Service有關的生命周期方法
    1. onStart() 隻有采用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運作時被調用。
    2. 多次調用startService()方法盡管不會多次建立服務,但onStart() 方法會被多次調用。
  3.  Context.bindService()啟動Service有關的生命周期方法
    1. onBind()隻有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法并不會導緻該方法被多次調用。
    2. onUnbind()隻有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用。

10、注冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。  Android廣播機制(兩種注冊方法)

在android下,要想接受廣播資訊,那麼這個廣播接收器就得我們自己來實作了,我們可以繼承BroadcastReceiver,就可以有一個廣播接受器了。有個接受器還不夠,我們還得重寫BroadcastReceiver裡面的onReceiver方法,當來廣播的時候我們要幹什麼,這就要我們自己來實作,不過我們可以搞一個資訊防火牆。具體的代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class SmsBroadCastReceiver extends BroadcastReceiver {    @Override    public void onReceive ( Context context , Intent intent ) {      Bundle bundle = intent . getExtras ( ) ;      Object [ ] object = ( Object [ ] ) bundle . get ( "pdus" ) ;      SmsMessage sms [ ] = new SmsMessage [ object . length ] ;      for ( int i = 0 ; i < object . length ; i ++ ) {        sms [ 0 ] = SmsMessage . createFromPdu ( ( byte [ ] ) object ) ;        Toast . makeText ( context ,            "來自" + sms . getDisplayOriginatingAddress ( ) + "的消息是:" + sms . getDisplayMessageBody ( ) ,            Toast . LENGTH_SHORT ) . show ( ) ;      }      // 終止廣播,在這裡我們可以稍微處理,根據使用者輸入的号碼可以實作短信防火牆。      abortBroadcast ( ) ;    } }

當實作了廣播接收器,還要設定廣播接收器接收廣播資訊的類型,這裡是資訊:android.provider.Telephony.SMS_RECEIVED

我們就可以把廣播接收器注冊到系統裡面,可以讓系統知道我們有個廣播接收器。這裡有兩種,一種是代碼動态注冊:

//生成廣播處理

smsBroadCastReceiver = newSmsBroadCastReceiver();

//執行個體化過濾器并設定要過濾的廣播

IntentFilter intentFilter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");

//注冊廣播

BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,intentFilter);

一種是在AndroidManifest.xml中配置廣播

1 2 3 4 5 6 7          < receiver android : name = ".SmsBroadCastReceiver" >              < intent - filterandroid : priority >                  < actionandroid : name android . provider . Telephony . SMS_RECEIVED = "" / >                  < intent - filter >                  < / intent - filter >              < / intent - filterandroid : priority >          < / receiver >

兩種注冊類型的差別是:

1)第一種不是常駐型廣播,也就是說廣播跟随程式的生命周期。

2)第二種是常駐型,也就是說當應用程式關閉後,如果有資訊廣播來,程式也會被系統調用自動運作。

11、請解釋下在單線程模型中Message、Handler、MessageQueue、Looper之間的關系。Handler簡介:

一個Handler允許你發送和處理Message和Runable對象,這些對象和一個線程的MessageQueue相關聯。每一個線程執行個體和一個單獨的線程以及該線程的MessageQueue相關聯。當你建立一個新的Handler時,它就和建立它的線程綁定在一起了。這裡,線程我們也可以了解為線程的MessageQueue。從這一點上來看,Handler把Message和Runable對象傳遞給MessageQueue,而且在這些對象離開MessageQueue時,Handler負責執行他們。

Handler有兩個主要的用途:(1)确定在将來的某個時間點執行一個或者一些Message和Runnable對象。(2)在其他線程(不是Handler綁定線程)中排入一些要執行的動作。

Scheduling Message,即(1),可以通過以下方法完成:

post(Runnable):Runnable在handler綁定的線程上執行,也就是說不建立新線程。

postAtTime(Runnable,long):

postDelayed(Runnable,long):

sendEmptyMessage(int):

sendMessage(Message):

sendMessageAtTime(Message,long):

sendMessageDelayed(Message,long):

post這個動作讓你把Runnable對象排入MessageQueue,MessageQueue受到這些消息的時候執行他們,當然以一定的排序。sendMessage這個動作允許你把Message對象排成隊列,這些Message對象包含一些資訊,Handler的hanlerMessage(Message)會處理這些Message.當然,handlerMessage(Message)必須由Handler的子類來重寫。這是程式設計人員需要作的事。

當posting或者sending到一個Hanler時,你可以有三種行為:當MessageQueue準備好就處理,定義一個延遲時間,定義一個精确的時間去處理。後兩者允許你實作timeout,tick,和基于時間的行為。

當你的應用建立一個新的程序時,主線程(也就是UI線程)自帶一個MessageQueue,這個MessageQueue管理頂層的應用對象(像activities,broadcast receivers等)和主線程建立的窗體。你可以建立自己的線程,并通過一個Handler和主線程進行通信。這和之前一樣,通過post和sendmessage來完成,差别在于在哪一個線程中執行這麼方法。在恰當的時候,給定的Runnable和Message将在Handler的MessageQueue中被Scheduled。

Message簡介:

Message類就是定義了一個資訊,這個資訊中包含一個描述符和任意的資料對象,這個資訊被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域,這可以讓你在大多數情況下不用作配置設定的動作。

盡管Message的構造函數是public的,但是擷取Message執行個體的最好方法是調用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收對象池中擷取一個。

MessageQueue簡介:

這是一個包含message清單的底層類。Looper負責分發這些message。Messages并不是直接加到一個MessageQueue中,而是通過MessageQueue.IdleHandler關聯到Looper。

你可以通過Looper.myQueue()從目前線程中擷取MessageQueue。

Looper簡介:

Looper類被用來執行一個線程中的message循環。預設情況,沒有一個消息循環關聯到線程。線上程中調用prepare()建立一個Looper,然後用loop()來處理messages,直到循環終止。

大多數和message loop的互動是通過Handler。

下面是一個典型的帶有Looper的線程實作。

1 2 3 4 5 6 7 8 9 10 11 12 13 class LooperThread extends Thread {    public Handler mHandler ;      public void run ( ) {      Looper . prepare ( ) ;      mHandler = new Handler ( ) {        public voidhandleMessage ( Message msg ) {          // process incomingmessages here        }      } ;      Looper . loop ( ) ;    } }

12、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 -->

<actionandroid: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(newInten(“net.blogjava.mobile.aidlservice.RemoteService”),serviceConnection, Context.BIND_AUTO_CREATE);

ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service參數就是A工程中MyService類中繼承了RemoteService.stub類的内部類的對象。

13、 橫豎屏切換時候activity的生命周期?

  • 不設定Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
  • 設定Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時隻會執行一次
  • 設定Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命周期,隻會執行onConfigurationChanged方法

14、如何将SQLite資料庫(dictionary.db檔案)與apk檔案一起釋出?

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

15、 如何将打開res aw目錄中的資料庫檔案?

解答:在Android中不能直接打開res aw目錄中的資料庫檔案,而需要在程式第一次啟動時将該檔案複制到手機記憶體或SD卡的某個目錄中,然後再打開該資料庫檔案。複制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然後将該InputStream對象中的資料寫入其他的目錄中相應檔案中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite資料庫檔案。

16、Android引入廣播機制的用意?

  • 從MVC的角度考慮(應用程式内) 、其實回答這個問題的時候還可以這樣問,android為什麼要有那4大元件,現在的移動開發模型基本上也是照搬的web那一套MVC架構,隻不過是改了點嫁妝而已。android的四大元件本質上就是為了實作移動或者說嵌入式裝置上的MVC架構,它們之間有時候是一種互相依存的關系,有時候又是一種補充關系,引入廣播機制可以友善幾大元件的資訊和資料互動。
  • 程式間互通消息(例如在自己的應用程式内監聽系統來電)
  • 效率上(參考UDP的廣播協定在區域網路的友善性)
  • 設計模式上(反轉控制的一種應用,類似監聽者模式)

17、XML包括哪些解釋技術,差別是什麼?

  • DOM将文檔解析成一顆文檔樹,可在節點上進行周遊、增加、修改和删除。一次性讀入記憶體,對記憶體消耗大。
  • SAX至上而下解析文檔,以事件進行驅動。不會一次性讀入記憶體,對記憶體消耗小,不能任意讀取節點,并且不能對節點進行增加、修改和删除。

18、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

switch能作用在byte、char、short和int上,JDK1.7後可以作用在String上。

19、”==”和equals方法究竟有什麼差別?

==和equals都可以比較位址。==是運算符,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字元串内容。

20、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分别是哪些類?

java中有三種流,分别是位元組流(InputStream、OutputStream)、字元流(Reader、Writer)、對象流(ObjectInputStream、ObjectOutputStream)。

21、位元組流與字元流的差別?

位元組流用于讀取或寫出二進制資料,比如圖檔、影像等資料。

字元流用于讀取或寫出字元資料,比如傳輸字元串。

所有的資料都可以通過位元組流來進行處理,不過如果是字元資料,用位元組流還需要進行轉換後傳輸,如果使用字元流可以友善資料的轉換。

22、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

如果其他方法沒有加synchronized的話是可以進入的。

23、.描述4 種 activity 的啟動模式

  • standard :系統的預設模式,一次跳轉即會生成一個新的執行個體。假設有一個activity命名為MainActivity,執行語句:
    • startActivity(new Intent(MainActivity.this, MainActivity.class))後,MainActivity将跳轉到另外一個MainActivity,也就是現在的Task棧裡面有MainActivity的兩個執行個體。按傳回鍵後你會發現仍然是在MainActivity(第一個)裡面。
  • singleTop
    • singleTop 跟standard 模式比較類似。如果已經有一個執行個體位于Activity棧的頂部時,就不産生新的執行個體,而隻是調用Activity中的newInstance()方法。如果不位于棧頂,會産生一個新的執行個體。例:當MainActivity為 singleTop 模式時,執行跳轉後棧裡面依舊隻有一個執行個體,如果現在按傳回鍵程式将直接退出。
  • singleTask
    • singleTask模式和後面的singleInstance模式都是隻建立一個執行個體的。在這種模式下,無論跳轉的對象是不是位于棧頂的activity,程式都不會生成一個新的執行個體(當然前提是棧裡面已經有這個執行個體)。這種模式相當有用,在以後的多activity開發中,經常會因為跳轉的關系導緻同個頁面生成多個執行個體,這個在使用者體驗上始終有點不好,而如果你将對應的activity聲明為 singleTask 模式,這種問題将不複存在。
  • singleInstance
    • 設定為 singleInstance 模式的 activity 将獨占一個task(感覺task可以了解為程序),獨占一個task的activity與其說是activity,倒不如說是一個應用,這個應用與其他activity是獨立的,它有自己的上下文activity。

24、如何一次性退出所有打開的Activity

編寫一個Activity作為入口,當需要關閉程式時,可以利用Activity的SingleTop模式跳轉該Activity,它上面的所有Activity都會被銷毀掉。然後再将該Activity關閉。

或者再跳轉時,設定intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這樣也能将上面的Activity銷毀掉。

25、Activity和Service之間如何通信

  • 啟動時Intent傳遞
  • 通過Binder在Activity中擷取Service的執行個體,然後可以在Activity中直接調用Service的方法
  • 通過廣播,在Service中釋出廣播,然後在Activity中接收
  • 通過Binder的transact方法。public final boolean transact (int code, Parcel data, Parcel reply, int flags)
  • Messager
  • AIDL

26、Android不同程序之間資料交換方式 Intent,ContentProvider,Broadcast,AIDL

27、Intent對象可以攜帶的攜帶資料

通過查詢Intent/Bundle的API文檔,我們可以獲知,Intent/Bundle支援傳遞基本類型的資料和基本類型的數組資料,以及String/CharSequence類型的資料和String/CharSequence類型的數組資料。而對于其它類型的資料貌似無能為力,其實不然,我們可以在Intent/Bundle的API中看到Intent/Bundle還可以傳遞Parcelable(包裹化,郵包)和Serializable(序列化)類型的資料,以及它們的數組/清單資料。

28、ContentValues可以存放的資料類型 Key:String Value:Byte,Integer,Float,Short,byte[],String,Double,Long,Boolean等常用資料類型。   28、 算法讓程式更省電

  • 利用推送服務替換輪詢
  • 通過AlarmManager的定時任務替代輪詢操作
    • 還可以采用比如一些指數退避的算法來減少更新頻率,尤其是背景的時候,使用者不去點選界面的時候,不需要那麼高的刷重新整理頻率。
  • 先擷取目前的連接配接狀态,在發送Http請求的時候,是否有網絡可以用,如果無網絡可用,則不要去擷取新的資料,因為必然是在浪費電量。
  • 檢查電量,根據電量的多少采取不同的政策。
  • wakeclock和其他的硬體資源不要占用時間過多,用完之後及時釋放
    • 傳感器
      • 加速度傳感器,亮度傳感器等等
    • 其他的
      • 藍牙,WiFi,GPS等等
    • 可以将上面的資源的擷取和釋放,與生命周期結合起來。

29、能快速重新聯網

  • 心跳檢測
  • 監聽網絡狀态

30、Queue接口

Throws exception Returns special value
Insert

add(e)

offer(e)

Remove

remove()

poll()

Examine

element()

peek()

  31、Android中常見的設計模式

  • 組合模式
    • View和ViewGroup的使用(幾乎所有的widget和布局類)
  • 觀察者模式
    • 通知和廣播
    • DataSetObserver,ContentObserver
  • 單例模式
    • 擷取系統中的各種Service,比如INPUT_METHOD_SERVICE,WIFI的Service
  • 模闆方法模式
    • View中定好模闆,子類比如Button或者自定義的View要依據其模闆來。
  • 備忘錄模式
    • 就是儲存狀态,然後做會其他的事情,然後再回來繼續
  • 享元模式
    • 比如String之間共享,還有SQL的編譯,具體的沒看過
  • 指令模式
    • Runnable的run()方法
  • 工廠方法
    • 太多了,比如BitmapFactory,Connection相關的
  • 擴充卡模式
    • ListView,GridView,ViewPager等裡面的Adapter。
  • 原型模式
    • clone方法
  • 政策模式
    • 比如Collections中的sort()方法
    • 比如Annimation中的Interpolator不同實作,不同的Interpolator帶來不同的政策。
  • 生成器模式(建造者模式)
    • DialogBuilder()
  • 責任鍊/響應鍊
    • 觸摸、按鍵各種事件的傳遞
  • 裝飾者模式
    • 各種InputStream.OutputStream

31、Adapter中getView的寫法

ListView item緩存機制:為了使得性能更優,ListView會緩存行item(某行對應的View)。ListView通過adapter的getView函數獲得每行的item。滑動過程中,

a. 如果某行item已經滑出螢幕,若該item不在緩存内,則put進緩存,否則更新緩存;

b. 擷取滑入螢幕的行item之前會先判斷緩存中是否有可用的item,如果有,做為convertView參數傳遞給adapter的getView。

更具體可見源代碼ListView.obtainView。

來源: <http://www.trinea.cn/android/android-listview-display-error-image-when-scroll/>

雖然兩種設定不同,結果也不同,但是convertview的機制沒有變。

其實到此為止我們可以總結出convertview的機制了,就是在初始顯示的時候,每次顯示一個item都調用一次getview方法但是每次調用的時候covertview為空(因為還沒有舊的view),當顯示完了之後。如果螢幕移動了之後,并且導緻有些Item(也可以說是view)跑到螢幕外面,此時如果還有新的item需要産生,則這些item顯示時調用的getview方法中的convertview參數就不是null,而是那些移出螢幕的view(舊view),我們所要做的就是将需要顯示的item填充到這些回收的view(舊view)中去,最後注意convertview為null的不僅僅是初始顯示的那些item,還有一些是已經開始移入螢幕但是還沒有view被回收的那些item。

最終我們用親手寫的代碼實作了Recycler(反複循環器).

第二個問題其實應該在第一個問題中嵌套來講,但是為了思路清晰我分開了:

view的setTag和getTag方法其實很簡單,在實際編寫代碼的時候一個view不僅僅是為了顯示一些字元串、圖檔,有時我們還需要他們攜帶一些其他的資料以便我們對該view的識别或者其他操作。于是android 的設計者們就創造了setTag(Object)方法來存放一些資料和view綁定,我們可以了解為這個是view 的标簽也可以了解為view 作為一個容器存放了一些資料。而這些資料我們也可以通過getTag() 方法來取出來。

到這裡setTag和getTag大家應該已經明白了。再回到上面的話題,我們通過convertview的setTag方法和getTag方法來将我們要顯示的資料來綁定在convertview上。如果convertview 是第一次展示我們就建立新的Holder對象與之綁定,并在最後通過return convertview 傳回,去顯示;如果convertview 是回收來的那麼我們就不必建立新的holder對象,隻需要把原來的綁定的holder取出加上新的資料就行了。

來源: <http://blog.csdn.net/pkxiuluo01/article/details/7380974>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class LooperThread extends Thread {    @Override    public View getView ( int position , View convertView , ViewGroup parent ) {      ViewHolder holder ;      if ( convertView == null ) {        convertView = inflater . inflate ( R . layout . list_item , null ) ;        holder = new ViewHolder ( ) ;       ……        convertView . setTag ( holder ) ;      } else {        holder = ( ViewHolder ) convertView . getTag ( ) ;      }    }      private static class ViewHolder {        ImageView appIcon ;      TextView appName ;      TextView appInfo ;    } }

32、生命周期

  • Activity的生命周期
  • Android面試題目總結
  • Fragent的生命周期
  • Android面試題目總結

33、螢幕尺寸

px

Pixels – corresponds to actual pixels on the screen.

對應螢幕上的每一個像素點

in

Inches – based on the physical size of the screen.

1 Inch = 2.54 centimeters

英尺

mm

Millimeters – based on the physical size of the screen.

毫米

pt

Points – 1/72 of an inch based on the physical size of the screen.

點?

dp

Density-independent Pixels – an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Note: The compiler accepts both “dip” and “dp”, though “dp” is more consistent with “sp”.

分辨率獨立機關,機關是在160dpi上定義的,160dpi上,1dp=160dpi

sp

Scale-independent Pixels – this is like the dp unit, but it is also scaled by the user’s font size preference. It is commend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and user’s preference.

縮放獨立的機關,一般用在文字大小上

來源: <http://stackoverflow.com/questions/2025282/difference-between-px-dp-dip-and-sp-in-android>

34、Android事件處理機制:

  • 基于監聽的事件處理:比如設定onClickListener
  • 基于回調的事件處理:主要是重寫Android元件的特定的回調方法,或者重寫Activity的回調方法。
    • onBackPressed(),onKeyDown(int keycode, KeyEvent event), onKeyLongPress,onKeyUp()
    • 基于分工的事件模型分工更加明确,事件源、事件監聽由兩個類分開實作,具有更好的維護性。
    • Android的事件處理機制保證監聽的事件監聽器會被優先觸發。

35、Activity的啟動、關閉

  • 啟動
    • startActivity(Intent intent);
    • startActivityForResult(Intent intent, int requestCode)
    • 要注意上面的intent可以是顯示的intent,也可以是隐式的,但如果是隐式的,那麼指向的activity必須設定category為<category android:name=”android.intent.category.DEFAULT”/>
  • 關閉
    • finish()關閉自己
    • finish(int requestCode),關閉以startActivityForResult啟動的Activity。
    • System.exit(0)

36、Intent-Filter中action和category的差別。 回答:改變以前從app角度來看問題的思路,整個問題從intent的設計角度來談。當Intent在建立的時候,建立者并不會知道到底系統中哪個程式來處理這個Intent。但是Intent的建立者會知道他們想要做什麼(比如從裝置中擷取一個通訊錄),并且需要通路其他的程式來擷取所需要的。 為了在實作這個,Intent會有一些資訊來實作這個,其中就包含了actions和categories。 actions是定義了一個Intent的通用的方法,比如檢視contact,比如從Gallery中擷取一張照片。 category則是提供了額外的資訊來識别到底調用哪個程式。比如當浏覽器中點選一個I攔截,Intent會包含一個BROWSABLE的category來識别他。 是以當系統去識别一個Intent的時候,會查找所有注冊的Activy,Service,BroadcastReceiver包含上面全部資訊的那些。如果Intent要識别PICK的action,那麼如果Activity的Intent-fileter中不包含PICK的action的就會被從候選名單中剔除。con 通過這種辦法,由action,category,type,以及可能的scheme組合在一起,來找到具體的執行操作的元件。 37、Android 程式 ,不能混淆的地方

  • Android系統元件,系統元件有固定的方法被系統調用。
  • 被Android Resource 檔案引用到的。名字已經固定,也不能混淆,比如自定義的View 。
  • Android Parcelable ,需要使用android 序列化的。
  • 其他Anroid 官方建議 不混淆的,如
  • android.app.backup.BackupAgentHelper
  • android.preference.Preference
  • com.android.vending.licensing.ILicensingService
  • Java序列化方法,系統序列化需要固定的方法。
  • 枚舉 ,系統需要處理枚舉的固定方法。
  • 本地方法,不能修改本地方法名
  • annotations 注釋
  • 資料庫驅動
  • 有些resource 檔案
  • 用到反射的地方

繼續閱讀