Android 面試題彙總

hzc543806053發表於2012-06-19

Android 70道面試題彙總不再愁面試

 

  本文為開發者奉獻了70道經典Android面試題加答案--重要知識點幾乎都涉及到了,你還等啥,趕緊收藏吧!!

 

  1.下列哪些語句關於記憶體回收的說明是正確的? (b )

 

    A、 程式設計師必須建立一個執行緒來釋放記憶體

  B、 記憶體回收程式負責釋放無用記憶體

  C、 記憶體回收程式允許程式設計師直接釋放記憶體

  D、 記憶體回收程式可以在指定的時間釋放記憶體物件

 

  2.下面異常是屬於Runtime Exception 的是(abcd)(多選)

 

    AArithmeticException

  BIllegalArgumentException

  CNullPointerException

  DBufferUnderflowException

 

  3. Math.round(11.5)等於多少(). Math.round(-11.5)等於多少(c). c A11 ,-11 B11 ,-12 C12 ,-11 D12 ,-12

  

   4. 下列程式段的輸出結果是:(b )

  void complicatedexpression_r(){

  int x=20, y=30;

  boolean b;

  b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;

  System.out.println(b);

  }

  Atrue Bfalse C1 D011.activity

  

   5. 對一些資源以及狀態的操作儲存,最好是儲存在生命週期的哪個函式中進行(d) AonPause() BonCreate() C onResume() DonStart()

 

  6. Intent傳遞資料時,下列的資料型別哪些可以被傳遞(abcd)(多選) ASerializable Bcharsequence CParcelable DBundle

 

  7. android中下列屬於Intent的作用的是(c) A、實現應用程式間的資料共享

  B、是一段長的生命週期,沒有使用者介面的程式,可以保持應用在後臺執行,而不會因為切換頁面而消失

  C、可以實現介面間的切換,可以包含動作和動作資料,連線四大元件的紐帶

  D、處理一個應用程式整體性的工作

 

  8.下列屬於SAX解析xml檔案的優點的是(b) A、將整個文件樹在記憶體中,便於操作,支援刪除,修改,重新排列等多種功能

  B、不用事先調入整個文件,佔用資源少

  C、整個文件調入記憶體,浪費時間和空間

  D、不是長久駐留在記憶體,資料不是持久的,事件過後,若沒有儲存資料,資料就會

  消失

 

  9.下面的對自定style的方式正確的是

A <resources>
       <style name=
"myStyle">
                            <itemname=
"android:layout_width">fill_parent</item>
                     </style>
</resources>
     B
<style name="myStyle">
                            <itemname=
"android:layout_width">fill_parent</item>
   </style>
     C
<resources>
                            <itemname=
"android:layout_width">fill_parent</item>
  </resources>
     D
<resources>
                            <stylename=
"android:layout_width">fill_parent</style>
  </resources>

  

   10. android中使用Menu時可能需要重寫的方法有(ac)(多選) AonCreateOptionsMenu()

  BonCreateMenu()

  ConOptionsItemSelected()

  DonItemSelected()

 

  11.SQL Server Management Studio 中執行下列T-SQL語句,其輸出值(c) SELECT @@IDENTITY

  A、 可能為0.1

  B、 可能為3

  C、 不可能為-100

  D、 肯定為0

 

  12.SQL Server 2005中執行如下T-SQL語句,假定SALES表中有多行資料,執行查詢之 後的結果是(d) BEGIN TRANSACTION A

  Update SALES Set qty=30 WHERE qty<30

  BEGIN TRANSACTION B

  Update SALES Set qty=40 WHEREqty<40

  Update SALES Set qty=50 WHEREqty<50

  Update SALES Set qty=60 WHEREqty<60

  COMMIT TRANSACTION B

  COMMIT TRANSACTION A

  ASALES表中qty列最小值大於等於30

  BSALES表中qty列最小值大於等於40

  CSALES表中qty列的資料全部為50

  DSALES表中qty列最小值大於等於60

 

  13.android中使用SQLiteOpenHelper這個輔助類時,可以生成一個資料庫,並可以對資料庫版本進行管理的方法可以是(ab) AgetWriteableDatabase()

  BgetReadableDatabase()

  CgetDatabase()

  DgetAbleDatabase()

 

  14. android關於service生命週期的onCreate()onStart()說法正確的是(ad)(多選題) A、當第一次啟動的時候先後呼叫onCreate()onStart()方法

  B、當第一次啟動的時候只會呼叫onCreate()方法

  C、如果service已經啟動,將先後呼叫onCreate()onStart()方法

  D、如果service已經啟動,只會執行onStart()方法,不在執行onCreate()方法

 

  15.下面是屬於GLSurFaceView特性的是(abc)(多選) A、管理一個surface,這個surface就是一塊特殊的記憶體,能直接排版到android的檢視

  view上。

  B、管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。

  C、讓渲染器在獨立的執行緒裡運作,和UI執行緒分離。

  D、可以直接從記憶體或者DMA等硬體介面取得影象資料

 

  16.下面在AndroidManifest.xml檔案中註冊BroadcastReceiver方式正確的

A<receiver android:name="NewBroad">
                     <intent-
filter>
                            <action  
                   android:name=
"android.provider.action.NewBroad"/>
                <action>
                     </intent-
filter>
              </receiver>
     B
<receiver android:name="NewBroad">
                     <intent-
filter>
                   android:name=
"android.provider.action.NewBroad"/>
                     </intent-
filter>
              </receiver>
     C
<receiver android:name="NewBroad">
                     <action  
                  android:name=
"android.provider.action.NewBroad"/>
             <action>
              </receiver>
     D
<intent-filter>
         <receiver android:name=
"NewBroad">
                           <action>
                   android:name=
"android.provider.action.NewBroad"/>
                  <action>
                     </receiver>
</intent-
filter>

  

   17. 關於ContenValues類說法正確的是(a) A、他和Hashtable比較類似,也是負責儲存一些名值對,但是他儲存的名值對當中的

  名是String型別,而值都是基本型別

  B、他和Hashtable比較類似,也是負責儲存一些名值對,但是他儲存的名值對當中的

  名是任意型別,而值都是基本型別

  C、他和Hashtable比較類似,也是負責儲存一些名值對,但是他儲存的名值對當中的

  名,可以為空,而值都是String型別

  D、他和Hashtable比較類似,也是負責儲存一些名值對,但是他儲存的名值對當中

  的名是String型別,而值也是String型別

 

  18.我們都知道Hanlder是執行緒與Activity通訊的橋樑,如果執行緒處理不當,你的機器就會變得越慢,那麼執行緒銷燬的方法是(a) AonDestroy()

  BonClear()

  ConFinish()

  DonStop()

 

  19.下面退出Activity錯誤的方法是(c) Afinish()

  B、拋異常強制退出

  CSystem.exit()

  DonStop()

 

  20.下面屬於android的動畫分類的有(ab)(多項) ATween BFrame CDraw DAnimation

 

  21.下面關於Android dvm的程式和Linux的程式,應用程式的程式說法正確的是(d) ADVMdalivk的虛擬機器.每一個Android應用程式都在它自己的程式中執行,不一定擁有一個獨立的Dalvik虛擬機器例項.而每一個DVM都是在Linux中的一個程式,所以說可以認為是同一個概念.

  BDVMdalivk的虛擬機器.每一個Android應用程式都在它自己的程式中執行,不一定擁有一個獨立的Dalvik虛擬機器例項.而每一個DVM不一定都是在Linux中的一個程式,所以說不是一個概念.

  CDVMdalivk的虛擬機器.每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的Dalvik虛擬機器例項.而每一個DVM不一定都是在Linux中的一個程式,所以說不是一個概念.

  DDVMdalivk的虛擬機器.每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的 Dalvik虛擬機器例項.而每一個DVM都是在Linux中的一個程式,所以說可以認為是同一個概念.

 

  22. Android專案工程下面的assets目錄的作用是什麼bA、放置應用到的圖片資源。

  B、主要放置多媒體等資料檔案

  C、放置字串,顏色,陣列等常量資料

  D、放置一些與UI相應的佈局檔案,都是xml檔案

 

  23.關於res/raw目錄說法正確的是(a)A、 這裡的檔案是原封不動的儲存到裝置上不會轉換為二進位制的格式

  B、這裡的檔案是原封不動的儲存到裝置上會轉換為二進位制的格式

  C、 這裡的檔案最終以二進位制的格式儲存到指定的包中

  D、這裡的檔案最終不會以二進位制的格式儲存到指定的包中

 

  24.下列對android NDK的理解正確的是(abcd )A NDK是一系列工具的集合

  B NDK提供了一份穩定、功能有限的 API 標頭檔案宣告。

  C、 使 “Java+C” 的開發方式終於轉正,成為官方支援的開發方式

  D NDK將是 Android 平臺支援 C 開發的開端

 

  二.檔案儲存方式

  三.SQLite資料庫方式

  四.內容提供器(Content provider)方式

 

  二、Android面試填空題

 

  25. android中常用的四個佈局是framlayoutlinenarlayoutrelativelayouttablelayout

 

    26. android的四大元件是activieyservicebroadcastcontentprovide

 

    27. java.io包中的objectinputstreamobjectoutputstream類主要用於對物件(Object)的讀寫。

 

    28. androidservice的實現方法是:startservicebindservice

 

    29. activity一般會過載7個方法用來維護其生命週期,除了onCreate(),onStart(),onDestory()外還有onrestart,onresume,onpause,onstop

 

    30. android的資料儲存的方式sharedpreference,檔案,SQlite,contentprovider,網路。

 

    31.當啟動一個Activity並且新的Activity執行完後需要返回到啟動它的Activity來執行 的回撥函式是startActivityResult()

 

   32. 請使用命令列的方式建立一個名字為myAvd,sdk版本為2.2,sd卡是在d盤的根目錄下,名字為scard.img, 並指定螢幕大小HVGA.____________________________________

 

    33.程式執行的結果是:_____good and gbc__________

 public classExample{

  String str=new String("good");

  char[]ch={'a','b','c'};

  public static void main(String args[]){

  Example ex=new Example();

  ex.change(ex.str,ex.ch);

  System.out.print(ex.str+" and ");

  Sytem.out.print(ex.ch);

  }

  public void change(String str,char ch[]){

  str="test ok";

  ch[0]='g';

  }

  }

 

  34.android中,請簡述jni的呼叫過程。(8)1)安裝和下載Cygwin,下載 Android NDK

  2)ndk專案中JNI介面的設計

  3)使用C/C++實現本地方法

  4)JNI生成動態連結庫.so檔案

  5)將動態連結庫複製到java工程,在java工程中呼叫,執行java工程即可

 

  35.簡述Android應用程式結構是哪些?(7)Android應用程式結構是:

  Linux Kernel(Linux核心)Libraries(系統執行庫或者是c/c++核心庫)Application

  Framework(開發框架包)Applications (核心應用程式)

 

  36.請繼承SQLiteOpenHelper實現:(10)

    1).建立一個版本為1的“diaryOpenHelper.db”的資料庫,

  2).同時建立一個 “diary” 表(包含一個_id主鍵並自增長,topic字元型100

  長度, content字元型1000長度)

  3).在資料庫版本變化時請刪除diary表,並重新建立出diary表。

  publicclass DBHelper extends SQLiteOpenHelper{

  public final static String DATABASENAME ="diaryOpenHelper.db";

  public final static int DATABASEVERSION =1;

  //建立資料庫

  public DBHelper(Context context,Stringname,CursorFactory factory,int version)

  {

  super(context, name, factory,version);

  }

  //建立表等機構性檔案

  public void onCreate(SQLiteDatabase db)

  {

  String sql ="create tablediary"+

  "("+

  "_idinteger primary key autoincrement,"+

  "topicvarchar(100),"+

  "contentvarchar(1000)"+

  ")";

  db.execSQL(sql);

  }

  //若資料庫版本有更新,則呼叫此方法

  public void onUpgrade(SQLiteDatabasedb,int oldVersion,int newVersion)

  {

  String sql = "drop table ifexists diary";

  db.execSQL(sql);

  this.onCreate(db);

  }

  }

 

  37.頁面上現有ProgressBar控制元件progressBar,請用書寫執行緒以10秒的的時間完成其進度顯示工作。(10)答案

  publicclass ProgressBarStu extends Activity {

  private ProgressBar progressBar = null;

  protected void onCreate(BundlesavedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.progressbar);

  //從這到下是關鍵

  progressBar = (ProgressBar)findViewById(R.id.progressBar);

  Thread thread = new Thread(newRunnable() {

  @Override

  public void run() {

  int progressBarMax =progressBar.getMax();

  try {

  while(progressBarMax!=progressBar.getProgress())

  {

  intstepProgress = progressBarMax/10;

  intcurrentprogress = progressBar.getProgress();

  progressBar.setProgress(currentprogress+stepProgress);

  Thread.sleep(1000);

  }

  } catch(InterruptedException e) {

  // TODO Auto-generatedcatch block

  e.printStackTrace();

  }

  }

  });

  thread.start();

  //關鍵結束

  }

  }

 

  38.請描述下Activity的生命週期。 必呼叫的三個方法:onCreate() --> onStart() --> onResume(),用AAA表示

  (1)Activity啟動子Activity,子Actvity退出,父Activity呼叫順序如下

  AAA --> onFreeze() --> onPause() --> onStop() --> onRestart()--> onStart(),onResume()

  (2)使用者點選HomeActvity呼叫順序如下

  AAA --> onFreeze() --> onPause() --> onStop() -- Maybe -->onDestroy() Maybe

  (3)呼叫finish() Activity呼叫順序如下

  AAA --> onPause() --> onStop() --> onDestroy()

  (4)Activity上顯示dialogActivity呼叫順序如下

  AAA

  (5)在父Activity上顯示透明的或非全屏的activityActivity呼叫順序如下

  AAA --> onFreeze() --> onPause()

  (6)裝置進入睡眠狀態,Activity呼叫順序如下

  AAA --> onFreeze() --> onPause()

 

  39.如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前儲存當前狀態? onSaveInstanceState()

  當你的程式中某一個Activity A在執行時,主動或被動地執行另一個新的Activity B,這個時候A會執行onSaveInstanceState()B完成以後又會來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新呼叫onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上了引數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate()了。

 

  40.如何將一個Activity設定成視窗的樣式。 在AndroidManifest.xml中定義Activity的地方一句話android:theme="@android:style/Theme.Dialog"android:theme="@android:style/Theme.Translucent"就變成半透明的

 

  41.如何退出Activity?如何安全退出已呼叫多個ActivityApplication?對於單一Activity的應用來說,退出很簡單,直接finish()即可。

  當然,也可以用killProcess()System.exit()這樣的方法。

  但是,對於多Activity的應用來說,在開啟多個Activity後,如果想在最後開啟的Activity直接退出,上邊的方法都是沒有用的,因為上邊的方法都是結束一個Activity而已。

  當然,網上也有人說可以。

  就好像有人問,在應用裡如何捕獲Home鍵,有人就會說用keyCode比較KEYCODE_HOME即可,而事實上如果不修改framework,根本不可能做到這一點一樣。

  所以,最好還是自己親自試一下。

  那麼,有沒有辦法直接退出整個應用呢?

  在2.1之前,可以使用ActivityManagerrestartPackage方法。

  它可以直接結束整個應用。在使用時需要許可權android.permission.RESTART_PACKAGES

  注意不要被它的名字迷惑。

  可是,在2.2,這個方法失效了。

  在2.2新增了一個新的方法,killBackgroundProcesses(),需要許可權android.permission.KILL_BACKGROUND_PROCESSES

  可惜的是,它和2.2restartPackage一樣,根本起不到應有的效果。

  另外還有一個方法,就是系統自帶的應用程式管理裡,強制結束程式的方法,forceStopPackage()

  它需要許可權android.permission.FORCE_STOP_PACKAGES

  並且需要新增android:sharedUserId="android.uid.system"屬性

  同樣可惜的是,該方法是非公開的,他只能執行在系統程式,第三方程式無法呼叫。

  因為需要在Android.mk中新增LOCAL_CERTIFICATE := platform

  而Android.mk是用於在Android原始碼下編譯程式用的。

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

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

  1、拋異常強制退出:

  該方法通過拋異常,使程式ForceClose

  驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出Force Close的視窗。

  2、記錄開啟的Activity

  每開啟一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。

  3、傳送特定廣播:

  在需要結束應用時,傳送一個特定的廣播,每個Activity收到廣播後,關閉即可。

  4、遞迴退出

  在開啟新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞迴關閉。

  除了第一個,都是想辦法把每一個Activity都結束掉,間接達到目的。

  但是這樣做同樣不完美。

  你會發現,如果自己的應用程式對每一個Activity都設定了nosensor,在兩個Activity結束的間隙,sensor可能有效了。

  但至少,我們的目的達到了,而且沒有影響使用者使用。

  為了程式設計方便,最好定義一個Activity基類,處理這些共通問題。

 

  42.請介紹下Android中常用的五種佈局。FrameLayout(框架佈局)LinearLayout (線性佈局)AbsoluteLayout(絕對佈局)RelativeLayout(相對佈局)TableLayout(表格佈局)

 

  43.請介紹下Android的資料儲存方式。一.SharedPreferences方式

 

  .網路儲存方式

 

  44.請介紹下ContentProvider是如何實現資料共享的。建立一個屬於你自己的Content provider或者將你的資料新增到一個已經存在的Contentprovider中,前提是有相同資料型別並且有寫入Content provider的許可權。

 

 

  45.如何啟用Service,如何停用ServiceAndroid中的service類似於windows中的serviceservice一般沒有使用者操作介面,它執行於系統中不容易被使用者發覺,

  可以使用它開發如監控之類的程式。

  一。步驟

  第一步:繼承Service

  public class SMSService extends Service { }

  第二步:在AndroidManifest.xml檔案中的節點裡對服務進行配置:

  二。Context.startService()Context.bindService

  服務不能自己執行,需要通過呼叫Context.startService()Context.bindService()方法啟動服務。這兩個方法都可

  以啟動Service,但是它們的使用場合有所不同。

  1.使用startService()方法啟用服務,呼叫者與服務之間沒有關連,即使呼叫者退出了,服務仍然執行。

  使用bindService()方法啟用服務,呼叫者與服務繫結在了一起,呼叫者一旦退出,服務也就終止。

  2.採用Context.startService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,

  接著呼叫onStart()方法。如果呼叫startService()方法前服務已經被建立,多次呼叫startService()方法並

  不會導致多次建立服務,但會導致多次呼叫onStart()方法。

  採用startService()方法啟動的服務,只能呼叫Context.stopService()方法結束服務,服務結束時會呼叫

  onDestroy()方法。

  3.採用Context.bindService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,

  接著呼叫onBind()方法。這個時候呼叫者和服務繫結在一起,呼叫者退出了,系統就會先呼叫服務的onUnbind()方法,

  。接著呼叫onDestroy()方法。如果呼叫bindService()方法前服務已經被繫結,多次呼叫bindService()方法並不會

  導致多次建立服務及繫結(也就是說onCreate()onBind()方法並不會被多次呼叫)。如果呼叫者希望與正在繫結的服務

  解除繫結,可以呼叫unbindService()方法,呼叫該方法也會導致系統呼叫服務的onUnbind()-->onDestroy()方法。

 

  三。Service的生命週期

 

  1.Service常用生命週期回撥方法如下:

  onCreate()該方法在服務被建立時呼叫,該方法只會被呼叫一次,無論呼叫多少次startService()bindService()方法,

  服務也只被建立一次。 onDestroy()該方法在服務被終止時呼叫。

 

  2. Context.startService()啟動Service有關的生命週期方法

  onStart()只有採用Context.startService()方法啟動服務時才會回撥該方法。該方法在服務開始執行時被呼叫。

  多次呼叫startService()方法儘管不會多次建立服務,但onStart()方法會被多次呼叫。

 

  3. Context.bindService()啟動Service有關的生命週期方法

  onBind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務繫結時被呼叫,

  當呼叫者與服務已經繫結,多次呼叫Context.bindService()方法並不會導致該方法被多次呼叫。

  onUnbind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務解除繫結時被呼叫。

  備註:

  1.採用startService()啟動服務

  Intent intent =new Intent(DemoActivity.this, DemoService.class);

  startService(intent);

  2.Context.bindService()啟動

  Intent intent =new Intent(DemoActivity.this, DemoService.class);

  bindService(intent, conn, Context.BIND_AUTO_CREATE);

  //unbindService(conn);//解除繫結

 

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

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

  public class SmsBroadCastReceiverextends 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

  {

  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中配置廣播

  package="spl.broadCastReceiver"

  android:versionCode="1"

  android:versionName="1.0">

  android:label="@string/app_name">

  兩種註冊型別的區別是:

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

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

 

  47.請解釋下在單執行緒模型中MessageHandlerMessageQueueLooper之間的關係。Handler簡介:

  一個Handler允許你傳送和處理MessageRunable物件,這些物件和一個執行緒的MessageQueue相關聯。每一個執行緒例項和一個單獨的執行緒以及該執行緒的MessageQueue相關聯。當你建立一個新的Handler時,它就和建立它的執行緒繫結在一起了。這裡,執行緒我們也可以理解為執行緒的MessageQueue。從這一點上來看,HandlerMessageRunable物件傳遞給MessageQueue,而且在這些物件離開MessageQueue時,Handler負責執行他們。

  Handler有兩個主要的用途:(1)確定在將來的某個時間點執行一個或者一些MessageRunnable物件。(2)在其他執行緒(不是Handler繫結執行緒)中排入一些要執行的動作。

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

  post(Runnable):Runnablehandler繫結的執行緒上執行,也就是說不建立新執行緒。

  postAtTime(Runnable,long):

  postDelayed(Runnable,long):

  sendEmptyMessage(int):

  sendMessage(Message):

  sendMessageAtTime(Message,long):

  sendMessageDelayed(Message,long):

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

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

  當你的應用建立一個新的程式時,主執行緒(也就是UI執行緒)自帶一個MessageQueue,這個MessageQueue管理頂層的應用物件(activities,broadcast receivers)和主執行緒建立的窗體。你可以建立自己的執行緒,並通過一個Handler和主執行緒進行通訊。這和之前一樣,通過postsendmessage來完成,差別在於在哪一個執行緒中執行這麼方法。在恰當的時候,給定的RunnableMessage將在HandlerMessageQueue中被Scheduled

  Message簡介:

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

  儘管Message的建構函式是public的,但是獲取Message例項的最好方法是呼叫Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收物件池中獲取一個。

  MessageQueue簡介:

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

  你可以通過Looper.myQueue()從當前執行緒中獲取MessageQueue

  Looper簡介:

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

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

  下面是一個典型的帶有Looper的執行緒實現。

  class LooperThread extends Thread {

  public Handler mHandler;

  public void run() {

  Looper.prepare();

  mHandler = new Handler() {

  public voidhandleMessage(Message msg) {

  // process incomingmessages here

  }

  };

  Looper.loop();

  }

  }

 

 

  48. AIDL的全稱是什麼?如何工作?能處理哪些型別的資料?AIDL的英文全稱是Android Interface Define Language

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

  A工程:

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

  說明一:aidl檔案的位置不固定,可以任意

  然後定義自己的MyService類,在MyService類中自定義一個內部類去繼承RemoteService.stub這個內部類,實現get方法。在onBind方法中返回這個內部類的物件,系統會自動將這個物件封裝成IBinder物件,傳遞給他的呼叫者。

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

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

  說明:AIDL並不需要許可權

  B工程:

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

  繫結AIDL服務就是將RemoteServiceID作為intentaction引數。

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

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

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

 

  49.請解釋下Android程式執行時許可權與檔案系統許可權的區別。執行時許可權Dalvik( android授權)

  檔案系統 linux核心授權

 

  50.系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。通過直接傳送Uri把引數帶過去,或者通過manifest裡的intentfilter裡的data屬性

 

  51.你如何評價Android系統?優缺點。答:Android平臺手機 5大優勢:

  一、開放性

  在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著使用者和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。開放性對於Android的發展而言,有利於積累人氣,這裡的人氣包括消費者和廠商,而對於消費者來講,隨大的受益正是豐富的軟體資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機

  二、掙脫運營商的束縛

  在過去很長的一段時間,特別是在歐美地區,手機應用往往受到運營商制約,使用什麼功能接入什麼網路,幾乎都受到運營商的控制。從去年iPhone上市 ,使用者可以更加方便地連線網路,運營商的制約減少。隨著EDGEHSDPA這些2G3G行動網路的逐步過渡和提升,手機隨意接入網路已不是運營商口中的笑談,當你可以通過手機IM軟體方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是不是像噩夢一樣?網際網路巨頭Google推動的Android終端天生就有網路特色,將讓使用者離網際網路更近。

  三、豐富的硬體選擇

  這一點還是與Android平臺的開放性相關,由於Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到資料同步、甚至軟體的相容,好比你從諾基亞 Symbian風格手機 一下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟體帶到iPhone上使用、聯絡人等資料更是可以方便地轉移,是不是非常方便呢?

  四、不受任何限制的開發商

  Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別緻的軟體會誕生。但也有其兩面性,血腥、暴力、情色方面的程式和遊戲如可控制正是留給Android難題之一。

  五、無縫結合的Google應用

  如今叱詫網際網路的Google已經走過10年度歷史,從搜尋巨人到全面的網際網路滲透,Google服務如地圖、郵件、搜尋等已經成為連線使用者和網際網路的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。

  再說Android5大不足:

  一、安全和隱私

  由於手機與網際網路的緊密聯絡,個人隱私很難得到保守。除了上網過程中經意或不經意留下的個人足跡,Google這個巨人也時時站在你的身後,洞穿一切,因此,網際網路的深入將會帶來新一輪的隱私危機。

  二、首先開賣Android手機的不是最大運營商

  眾所周知,T-Mobile23日,於美國紐約釋出 了Android首款手機G1。但是在北美市場,最大的兩家運營商乃AT&TVerizon,而目前所知取得Android手機銷售權的僅有 T-MobileSprint,其中T-Mobile3G網路相對於其他三家也要遜色不少,因此,使用者可以買賬購買G1,能否體驗到最佳的3G網路服務則要另當別論了!

  三、運營商仍然能夠影響到Android手機

  在國內市場,不少使用者對購得移動定製機不滿,感覺所購的手機被人塗畫了廣告一般。這樣的情況在國外市場同樣出現。Android手機的另一發售運營商Sprint就將在其機型中內建其手機商店程式。

  四、同類機型使用者減少

  在不少手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,並分享軟體資源。而對於Android平臺手機,由於廠商豐富,產品型別多樣,這樣使用同一款機型的使用者越來越少,缺少統一機型的程式強化。舉個稍顯不當的例子,現在山寨機氾濫,品種各異,就很少有專門針對某個型號山寨機的討論和群組,除了哪些功能異常搶眼、頗受追捧的機型以外。

  五、過分依賴開發商缺少標準配置

  在使用PC端的Windows Xp系統的時候,都會內建微軟Windows Media Player這樣一個瀏覽器程式,使用者可以選擇更多樣的播放器,如Realplay或暴風影音等。但入手開始使用預設的程式同樣可以應付多樣的需要。在Android平臺中,由於其開放性,軟體更多依賴第三方廠商,比如Android系統的SDK中就沒有內建音樂 播放器,全部依賴第三方開發,缺少了產品的統一性。

 

  52.什麼是ANR 如何避免它?

  答:ANRApplication NotResponding,五秒

  在Android中,活動管理器和視窗管理器這兩個系統服務負責監視應用程式的響應。當出現下列情況時,Android就會顯示ANR對話方塊了:

  對輸入事件(如按鍵、觸控式螢幕事件)的響應超過5

  意向接受器(intentReceiver)超過10秒鐘仍未執行完畢

  Android應用程式完全執行在一個獨立的執行緒中(例如main)。這就意味著,任何在主執行緒中執行的,需要消耗大量時間的操作都會引發ANR。因為此時,你的應用程式已經沒有機會去響應輸入事件和意向廣播(Intentbroadcast)

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

 

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

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

 

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

 

  55.簡要解釋一下activity intent intent filterserviceBroadcaseBroadcaseReceiver

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

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

  可以連線到一個正在執行的服務中,連線後,可以通過服務中暴露出來的藉口與其進行通訊

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

  intent:content provider在接收到ContentResolver的請求時被啟用。

  activity, servicebroadcast receiver是被稱為intents的非同步訊息啟用的。

  一個intent是一個Intent物件,它儲存了訊息的內容。對於activityservice來說,它指定了請求的操作名稱和待運算元據的URI

  Intent物件可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基於manifest檔案中的宣告)並啟用它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component

  它是通過將Intent物件和目標的intent filter相比較來完成這一工作的。一個componentintent filter告訴androidcomponent能處理的intentintent filter也是在manifest檔案中宣告的。

 

  56. IntentService有何優點?

  答:IntentService的好處

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

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

  *非常容易使用

 

  57.橫豎屏切換時候activity的生命週期?

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

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

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

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

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

 

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

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

 

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

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

  其實回答這個問題的時候還可以這樣問,android為什麼要有那4大元件,現在的移動開發模型基本上也是照搬的web那一套MVC架構,只不過是改了點嫁妝而已。android的四大元件本質上就是為了實現移動或者說嵌入式裝置上的MVC架構,它們之間有時候是一種相互依存的關係,有時候又是一種補充關係,引入廣播機制可以方便幾大元件的資訊和資料互動。

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

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

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

 

  60. Android dvm的程式和Linux的程式,應用程式的程式是否為同一個概念

  DVMdalivk的虛擬機器。每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個DVM都是在Linux中的一個程式,所以說可以認為是同一個概念。

 

  61. sim卡的EF檔案有何作用

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

 

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

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

 

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

  嵌入式實時作業系統是指當外界事件或資料產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致執行的嵌入式作業系統。主要用於工業控制、軍事裝置、 航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而android是基於linux核心的,因此屬於軟實時。

 

  64.一條最長的簡訊息約佔多少byte?

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

 

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

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

 

  66.handler機制的原理

 

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

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

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

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

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

 

  67.說說mvc模式的原理,它在android中的運用

 

 

  MVC(Model_view_contraller)”模型_檢視_控制器”。 MVC應用程式總是由這三個部分組成。Event(事件)導致Controller改變ModelView,或者同時改變兩者。只要Controller改變了Models的資料或者屬性,所有依賴的View都會自動更新。類似的,只要Contro

 

  68. DDMSTraceView的區別? DDMS是一個程式執行檢視器,在裡面可以看見執行緒和堆疊等資訊,TraceView是程式效能分析器。

 

  69. java中如何引用本地語言 可以用JNI(java nativeinterface java本地介面)介面。

 

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

  71. NDK是什麼NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將sojava應用打成apk包。

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

 

 

轉載:http://tech.it168.com/a2012/0201/1305/000001305470_all.shtml

 

第二部分

 

1.activity的生命週期。

方法

描述

可被殺死

下一個

onCreate()

activity第一次被建立的時候呼叫。這裡是你做所有初始化設定的地方──建立檢視、繫結資料至列表等。如果曾經有狀態記錄(參閱後述Saving Activity State。),則呼叫此方法時會傳入一個包含著此activity以前狀態的包物件做為引數。 

總繼之以onStart()。

onStart()

    

onRestart()

activity停止後,在再次啟動之前被呼叫。 

總繼之以onStart()。

onStart()

onStart()

activity正要變得為使用者所見時被呼叫。 

activity轉向前臺時繼以onResume(),在activity變為隱藏時繼以onStop()。

onResume() 
or
onStop()

    

onResume()

activity開始與使用者進行互動之前被呼叫。此時activity位於堆疊頂部,並接受使用者輸入。 

繼之以onPause()。

onPause()

onPause()

當系統將要啟動另一個activity時呼叫。此方法主要用來將未儲存的變化進行持久化,停止類似動畫這樣耗費CPU的動作等。這一切動作應該在短時間內完成,因為下一個activity必須等到此方法返回後才會繼續。 

activity重新回到前臺是繼以onResume()。當activity變為使用者不可見時繼以onStop()。

onResume() 
or
onStop()

onStop()

activity不再為使用者可見時呼叫此方法。這可能發生在它被銷燬或者另一個activity(可能是現存的或者是新的)回到執行狀態並覆蓋了它。 

如果activity再次回到前臺跟使用者互動則繼以onRestart(),如果關閉activity則繼以onDestroy()。

onRestart() 
or
onDestroy()

onDestroy()

activity銷燬前呼叫。這是activity接收的最後一個呼叫。這可能發生在activity結束(呼叫了它的 finish() 方法)或者因為系統需要空間所以臨時的銷燬了此acitivity的例項時。你可以用isFinishing() 方法來區分這兩種情況。

nothing

2.橫豎屏切換時候activity的生命週期

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

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

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

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

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

4. 一條最長的簡訊息約佔多少byte?

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

5.handler機制的原理

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

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

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

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

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

 

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

 

  嵌入式實時作業系統是指當外界事件或資料產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致執行的嵌入式作業系統。主要用於工業控制、 軍事裝置、 航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而android是基於linux核心的,因此屬於軟實時。

7.android中執行緒與執行緒,程式與程式之間如何通訊

1、一個 Android 程式開始執行時,會單獨啟動一個Process
   預設情況下,所有這個程式中的Activity或者Service都會跑在這個Process
   預設情況下,一個Android程式也只有一個Process,但一個Process下卻可以有許多個Thread
2、一個 Android 程式開始執行時,就有一個主執行緒Main Thread被建立。該執行緒主要負責UI介面的顯示、更新和控制元件互動,所以又叫UI Thread
   一個Android程式建立之初,一個Process呈現的是單執行緒模型--Main Thread,所有的任務都在一個執行緒中執行。所以,Main Thread所呼叫的每一個函式,其耗時應該越短越好。而對於比較費時的工作,應該設法交給子執行緒去做,以避免阻塞主執行緒(主執行緒被阻塞,會導致程式假死 現象)。 

3Android單執行緒模型:Android UI操作並不是執行緒安全的並且這些操作必須在UI執行緒中執行。如果在子執行緒中直接修改UI,會導致異常。

8.Android dvm的程式和Linux的程式, 應用程式的程式是否為同一個概念 

  DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個DVM都是在Linux 中的一個程式,所以說可以認為是同一個概念。 

9.sim卡的EF 檔案有何作用 

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

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

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

11.Activity變成一個視窗:Activity屬性設定 

  講點輕鬆的吧,可能有人希望做出來的應用程式是一個漂浮在手機主介面的東西,那麼很 簡單你只需要設定 一下Activity的主題就可以了在AndroidManifest.xml 中定義 Activity的 地方一句話: 

  Xml程式碼 

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

  這就使你的應用程式變成對話方塊的形式彈出來了,或者 

  Xml程式碼 

  1. 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 ,('_'換成'.' < --注意:這個是文章內容不是笑臉)就可以用在描述檔案 中了,找找類定義和描述檔案中的對應關係就都明白了。 

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

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

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

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

14.在androidmvc的具體體現

Android 的官方建議應用程式的開發採用MVC 模式。何謂MVC?先看看下圖

MVC Model,View,Controller 的縮寫,從上圖可以看出MVC 包含三個部分:

.. 模型(Model)物件:是應用程式的主體部分,所有的業務邏輯都應該寫在該

層。

.. 檢視(View)物件:是應用程式中負責生成使用者介面的部分。也是在整個

MVC 架構中使用者唯一可以看到的一層,接收使用者的輸入,顯示處理結果。

.. 控制器(Control)物件:是根據使用者的輸入,控制使用者介面資料顯示及更新

Model 物件狀態的部分,控制器更重要的一種導航功能,想用使用者出發的相

關事件,交給哦得了處理。

Android 鼓勵弱耦合和元件的重用,在Android MVC 的具體體現如下

1)檢視層(view:一般採用xml檔案進行介面的描述,使用的時候可以非常方便的引入,當然,如何你對android瞭解的比較的多了話,就一定可 以想到在android中也可以使用javascript+html等的方式作為view層,當然這裡需要進行javajavascript之間的通 信,幸運的是,android提供了它們之間非常方便的通訊實現。

  2)控制層(controller):android的控制層的重 任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫程式碼,要通過activity交割model業務邏輯層處理, 這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這裡,程式就很容易被回收掉。

  3)模型層(model):對資料庫的操作、對網路等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。

15.Android系統的架構

android的系統架構和其作業系統一樣,採用了分層的架構。從架構圖看,android分為四個層,從高層到低層分別是應用程式層、應用程式框架層、系統執行庫層和linux核心層。

  1.應用程式

  Android會同一系列核心應用程式包一起釋出,該應用程式包包括email客戶端,SMS短訊息程式,日曆,地圖,瀏覽器,聯絡人管理程式等。所有的應用程式都是使用JAVA語言編寫的。

  2.應用程式框架

  開發人員也可以完全訪問核心應用程式所使用的API框架。該應用程式的架構設計簡化了元件的重用;任何一個應用程式都可以釋出它的功能塊並且任何其它的應用程式都可以使用其所釋出的功能塊(不過得遵循框架的安全性限制)。同樣,該應用程式重用機制也使使用者可以方便的替換程式元件。

  隱藏在每個應用後面的是一系列的服務和系統其中包括;

  豐富而又可擴充套件的檢視(Views),可以用來構建應用程式, 它包括列表(lists),網格(grids),文字框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。

  內容提供器(Content Providers)使得應用程式可以訪問另一個應用程式的資料(如聯絡人資料庫), 或者共享它們自己的資料

  資源管理器(Resource Manager)提供 非程式碼資源的訪問,如本地字串,圖形,和佈局檔案( layout files )

  通知管理器 (Notification Manager) 使得應用程式可以在狀態列中顯示自定義的提示資訊。

  活動管理器( Activity Manager) 用來管理應用程式生命週期並提供常用的導航回退功能。

  有關更多的細節和怎樣從頭寫一個應用程式,請參考 如何編寫一個 Android 應用程式.

  3.系統執行庫

  1)程式庫

  Android 包含一些C/C++庫,這些庫能被Android系統中不同的元件使用。它們通過 Android 應用程式框架為開發者提供服務。以下是一些核心庫:

  系統 庫 一個從 BSD 繼承來的標準 系統函式庫( libc ), 它是專門為基於 embedded linux 的裝置定製的。

  媒體庫 基於 PacketVideo OpenCORE;該庫支援多種常用的音訊、視訊格式回放和錄製,同時支援靜態影象檔案。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 

  * Surface Manager - 對顯示子系統的管理,並且為多個應用程式提 供了2D3D圖層的無縫融合。

  * LibWebCore - 一個最新的web瀏覽器引擎用,支援Android瀏覽器和一個可嵌入的web檢視。

  * SGL - 底層的2D圖形引擎

  * 3D libraries - 基於OpenGL ES 1.0 APIs實現;該庫可以使用硬體 3D加速(如果可用)或者使用高度優化的3D軟加速。

  * FreeType -點陣圖(bitmap)和向量(vector)字型顯示。

  * SQLite - 一個對於所有應用程式可用,功能強勁的輕型關係型資料庫引擎。

  2)Android 執行庫

  Android 包括了一個核心庫,該核心庫提供了JAVA程式語言核心庫的大多數功能。

  每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的Dalvik虛擬機器例項。Dalvik被設計成一個裝置可以同時高效地執行多個虛擬系統。 Dalvik虛擬機器執行(.dex)Dalvik可執行檔案,該格式檔案針對小記憶體使用做了優化。同時虛擬機器是基於暫存器的,所有的類都經由JAVA編譯器編譯,然後通過SDK中 的 “dx” 工具轉化成.dex格式由虛擬機器執行。

  Dalvik虛擬機器依賴於linux核心的一些功能,比如執行緒機制和底層記憶體管理機制。

  4.Linux 核心

Android 的核心繫統服務依賴於 Linux 2.6 核心,如安全性,記憶體管理,程式管理, 網路協議棧和驅動模型。 Linux 核心也同時作為硬體和軟體棧之間的抽象層。

16.Android常用控制元件的資訊

單選框(RadioButtonRadioGroup)

RadioGroup用於對單選框進行分組,相同組內的單選框只有一個單選框被選中。

事件:setOnCheckedChangeListener(),處理單選框被選擇事件。把RadioGroup.OnCheckedChangeListener例項作為引數傳入。

多選框(CheckBox):

每個多選框都是獨立的,可以通過迭代所有的多選框,然後根據其狀態是否被選中在獲取其值。

事件:setOnCheckChangeListener()處理多選框被選擇事件。把CompoundButton.OnCheckedChangeListener例項作為引數傳入

下拉選單框(Spring)

Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());獲取下拉選單框的值。

事件:setOnItemSelectedListener(),處理下拉選單框被選擇事件把AdapterView.OnItemSelectedListener例項作為引數傳入;

拖動條(SeekBar)

SeekBar.getProgress()獲取拖動條當前值

事件:setOnSeekBarChangeListener(),處理拖動條值變化事件,把SeekBar.OnSeekBarChangeListener例項作為引數傳入。

選單(Menu):

重寫ActivityonCreatOptionMenu(Menu menu)方法,該方法用於建立選項選單,咋使用者按下手機的"Menu"按鈕時就會顯示建立好的選單,在onCreatOptionMenu(Menu Menu)方法內部可以呼叫Menu.add()方法實現選單的新增。

重寫ActivityonMenuItemSelected()方法,該方法用於處理選單被選擇事件。

進度對話方塊(ProgressDialog)

建立並顯示一個進度對話方塊:ProgressDialog.show(ProgressDialogActivity.this,"請稍等""資料正在載入中...."true)

設定對話方塊的風格:setProgressStyle()

ProgressDialog.STYLE_SPINNER  旋轉進度條風格(為預設風格)

ProgressDialog.STYLE_HORIZONTAL 橫向進度條風格

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

Android佈局是應用介面開發的重要一環,在Android中,共有五種佈局方式,分別是:FrameLayout(框架佈局),LinearLayout (線性佈局),

AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)。 

  1.FrameLayout    

    這個佈局可以看成是牆腳堆東西,有一個四方的矩形的左上角牆腳,我們放了第一個東西,要再放一個,那就在放在原來放的位置的上面,這樣依次的放,會蓋住原來的東西。這個佈局比較簡單,也只能放一點比較簡單的東西。    

2.LinearLayout    

線性佈局,這個東西,從外框上可以理解為一個div,他首先是一個一個從上往下羅列在螢幕上。每一個LinearLayout裡面又可分為垂直佈局 (android:orientation="vertical")和水平佈局(android:orientation="horizontal" )。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每一個元素依次向右排列。    

linearLayout中有一個重要的屬性 android:layout_weight="1",這個weight在垂直佈局時,代表行距;水平的時候代表列寬;weight值越大就越大。    

3.AbsoluteLayout    

    絕對佈局猶如div指定了absolute屬性,用X,Y座標來指定元素的位置android:layout_x="20px" android:layout_y="12px" 這種佈局方式也比較簡單,但是在垂直隨便切換時,往往會出問題,而且多個元素的時候,計算比較麻煩。    

4.RelativeLayout    

    相對佈局可以理解為某一個元素為參照物,來定位的佈局方式。主要屬性有:    

    相對於某一個元素    

    android:layout_below="@id/aaa" 該元素在 idaaa的下面    

    android:layout_toLeftOf="@id/bbb" 改元素的左邊是bbb    

     相對於父元素的地方    

     android:layout_alignParentLeft="true"  在父元素左對齊    

     android:layout_alignParentRight="true" 在父元素右對齊    

     還可以指定邊距等,具體詳見API    

            

5.TableLayout    

     表格佈局類似Html裡面的Table。每一個TableLayout裡面有表格行TableRowTableRow裡面可以具體定義每一個元素,設定他的對齊方式 android:gravity="" 。    

     每一個佈局都有自己適合的方式,另外,這五個佈局元素可以相互巢狀應用,做出美觀的介面。

18.如何啟用Service,如何停用Service 

Android中的服務和windows中的服務是類似的東西,服務一般沒有使用者操作介面,它執行於系統中不容易被使用者發覺,可以使用它開發如監控之類的程式。服務的開發比較簡單,如下:

第一步:繼承Service

public class SMSService extends Service {

}

第二步:在AndroidManifest.xml檔案中的<application>節點裡對服務進行配置:

<service android:name=".SMSService" />

 

服務不能自己執行,需要通過呼叫Context.startService()Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。使用startService()方法啟用服務,呼叫者與服務之間沒有關連,即使呼叫者退出了,服務仍然執行。使用bindService()方法啟用服務,呼叫者與服務繫結在了一起,呼叫者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。

 

如果打算採用Context.startService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,接著呼叫onStart()方法。如果呼叫startService()方法前服務已經被建立,多次呼叫startService()方法並不會導致多次建立服務,但會導致多次呼叫onStart()方法。採用startService()方法啟動的服務,只能呼叫Context.stopService()方法結束服務,服務結束時會呼叫onDestroy()方法。

 

如果打算採用Context.bindService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,接著呼叫onBind()方法。這個時候呼叫者和服務繫結在一起,呼叫者退出了,系統就會先呼叫服務的onUnbind()方法,接著呼叫onDestroy()方法。如果呼叫bindService()方法前服務已經被繫結,多次呼叫bindService()方法並不會導致多次建立服務及繫結(也就是說onCreate()onBind()方法並不會被多次呼叫)。如果呼叫者希望與正在繫結的服務解除繫結,可以呼叫unbindService()方法,呼叫該方法也會導致系統呼叫服務的onUnbind()-->onDestroy()方法。

服務常用生命週期回撥方法如下:

onCreate() 該方法在服務被建立時呼叫,該方法只會被呼叫一次,無論呼叫多少次startService()bindService()方法,服務也只被建立一次。

onDestroy()該方法在服務被終止時呼叫。

 

與採用Context.startService()方法啟動服務有關的生命週期方法

onStart() 只有採用Context.startService()方法啟動服務時才會回撥該方法。該方法在服務開始執行時被呼叫。多次呼叫startService()方法儘管不會多次建立服務,但onStart() 方法會被多次呼叫。

 

與採用Context.bindService()方法啟動服務有關的生命週期方法

onBind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務繫結時被呼叫,當呼叫者與服務已經繫結,多次呼叫Context.bindService()方法並不會導致該方法被多次呼叫。

onUnbind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務解除繫結時被呼叫

[java] view plaincopy
  1. 採用Context. bindService()方法啟動服務的程式碼如下:  
  2. public class HelloActivity extends Activity {  
  3.      ServiceConnection conn = new ServiceConnection() {  
  4.               public void onServiceConnected(ComponentName name, IBinder service) {  
  5.            }  
  6.            public void onServiceDisconnected(ComponentName name) {  
  7.            }  
  8.      };  
  9.     @Override   
  10. public void onCreate(Bundle savedInstanceState) {   
  11.         Button button =(Button) this.findViewById(R.id.button);  
  12.         button.setOnClickListener(new View.OnClickListener(){  
  13.                public void onClick(View v) {  
  14.                   Intent intent = new Intent(HelloActivity.this, SMSService.class);  
  15.                   bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  16.                   //unbindService(conn);//解除繫結   
  17.           }});         
  18.     }  
  19. }  
[java] view plaincopy
  1. 採用Context. bindService()方法啟動服務的程式碼如下:  
  2. public class HelloActivity extends Activity {  
  3.      ServiceConnection conn = new ServiceConnection() {  
  4.               public void onServiceConnected(ComponentName name, IBinder service) {  
  5.            }  
  6.            public void onServiceDisconnected(ComponentName name) {  
  7.            }  
  8.      };  
  9.     @Override   
  10. public void onCreate(Bundle savedInstanceState) {   
  11.         Button button =(Button) this.findViewById(R.id.button);  
  12.         button.setOnClickListener(new View.OnClickListener(){  
  13.                public void onClick(View v) {  
  14.                   Intent intent = new Intent(HelloActivity.this, SMSService.class);  
  15.                   bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  16.                   //unbindService(conn);//解除繫結   
  17.           }});         
  18.     }  
  19. }  

[java] view plaincopy
  1. 採用Context. bindService()方法啟動服務的程式碼如下:  
  2. public class HelloActivity extends Activity {  
  3.      ServiceConnection conn = new ServiceConnection() {  
  4.               public void onServiceConnected(ComponentName name, IBinder service) {  
  5.            }  
  6.            public void onServiceDisconnected(ComponentName name) {  
  7.            }  
  8.      };  
  9.     @Override   
  10. public void onCreate(Bundle savedInstanceState) {   
  11.         Button button =(Button) this.findViewById(R.id.button);  
  12.         button.setOnClickListener(new View.OnClickListener(){  
  13.                public void onClick(View v) {  
  14.                   Intent intent = new Intent(HelloActivity.this, SMSService.class);  
  15.                   bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  16.                   //unbindService(conn);//解除繫結  
  17.           }});         
  18.     }  
  19. }  

19.ListView優化

工作原理:

ListView 針對List中每個item,要求 adapter “給我一個檢視” (getView)

一個新的檢視被返回並顯示

如果我們有上億個專案要顯示怎麼辦?為每個專案建立一個新檢視?NO!這不可能!

實際上Android為你快取了檢視。

Android中有個叫做Recycler的構件,下圖是他的工作原理:

如果你有10億個專案(item),其中只有可見的專案存在記憶體中,其他的在Recycler中。

1. ListView先請求一個type1檢視(getView)然後請求其他可見的專案。convertViewgetView中是空(null)

2. item1滾出螢幕,並且一個新的專案從螢幕低端上來時,ListView再請求一個type1檢視。convertView此時不是空值了,它的值是item1。你只需設定新的資料然後返回convertView,不必重新建立一個檢視。

20廣播接收者生命週期

一個廣播接收者有一個回撥方法:void onReceive(Context curContext, Intent broadcastMsg)。當一個廣播訊息到達接收者是,Android呼叫它的onReceive()方法並傳遞給它包含訊息的Intent物件。廣播接收者被認為僅當它執行這個方法時是活躍的。當onReceive()返回後,它是不活躍的。

有一個活躍的廣播接收者的程式是受保護的,不會被殺死。但是系統可以在任何時候殺死僅有不活躍元件的程式,當佔用的記憶體別的程式需要時。

這帶來一個問題,當一個廣播訊息的響應時費時的,因此應該在獨立的執行緒中做這些事,遠離使用者介面其它元件執行的主執行緒。如果onReceive()衍生執行緒然後返回,整個程式,包括新的執行緒,被判定為不活躍的(除非程式中的其它應用程式元件是活躍的),將使它處於被殺的危機。解決這個問題的方法是onReceive()啟動一個服務,及時服務做這個工作,因此係統知道程式中有活躍的工作在做。

21.設計模式和IoC(控制反轉)

Android 框架魅力的源泉在於IoC,在開發Android 的過程中你會時刻感受到IoC 帶來

的巨大方便,就拿Activity 來說,下面的函式是框架呼叫自動呼叫的:

protected void onCreate(Bundle savedInstanceState) 

不是程式編寫者主動去呼叫,反而是使用者寫的程式碼被框架呼叫,這也就反轉

了!當然IoC 本身的內涵遠遠不止這些,但是從這個例子中也可以窺視出IoC

帶來的巨大好處。此類的例子在Android 隨處可見,例如說資料庫的管理類,

例如說Android SAX Handler 的呼叫等。有時候,您甚至需要自己編寫簡

單的IoC 實現,上面展示的多執行緒現在就是一個說明。

22.Android中的長度單位詳解

現在這裡介紹一下dp spdp 也就是dip。這個和sp 基本類似。如果設定表示長度、高度等屬性時可以使用dp sp。但如果設定字型,需要使用spdp 是與密度無關,sp 除了與密度無關外,還與scale 無關。如果螢幕密度為160,這時dp sp px 是一樣的。1dp=1sp=1px,但如果使用px 作單位,如果螢幕大小不變(假設還是3.2 寸),而螢幕密度變成了320。那麼原來TextView 的寬度設成160px,在密度為320 3.2 寸螢幕裡看要比在密度為160 3.2 寸螢幕上看短了一半。但如果設定成160dp 160sp 的話。系統會自動將width 屬性值設定成320px 的。也就是160 * 320 / 160。其中320 / 160 可稱為密

度比例因子。也就是說,如果使用dp sp,系統會根據螢幕密度的變化自動

進行轉換。

下面看一下其他單位的含義

px:表示螢幕實際的象素。例如,320*480 的螢幕在橫向有320個象素,

在縱向有480 個象素。

in:表示英寸,是螢幕的物理尺寸。每英寸等於2.54 釐米。例如,形容

手機螢幕大小,經常說,3.2(英)寸、3.5(英)寸、4(英)寸就是指這個

單位。這些尺寸是螢幕的對角線長度。如果手機的螢幕是3.2 英寸,表示手機

的螢幕(可視區域)對角線長度是3.2*2.54 = 8.128 釐米。讀者可以去量

一量自己的手機螢幕,看和實際的尺寸是否一致。                      

23. 4activity的啟動模式

standard: 標準模式,一呼叫startActivity()方法就會產生一個新的例項。 

singleTop: 如果已經有一個例項位於Activity棧的頂部時,就不產生新的例項,而只是呼叫Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的例項。 

singleTask: 會在一個新的task中產生這個例項,以後每次呼叫都會使用這個,不會去產生新的例項了。 

singleInstance: 這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity例項所處的task中,只能有這個activity例項,不能有其他的例項。 

24.什麼是ANR 如何避免它?

ANRApplication Not Responding,五秒 

Android中,活動管理器和視窗管理器這兩個系統服務負責監視應用程式的響應。當出現下列情況時,Android就會顯示ANR對話方塊了: 

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

  意向接受器(intentReceiver)超過10秒鐘仍未執行完畢 

  Android應用程式完全執行在一個獨立的執行緒中(例如main)。這就意味著,任何在主執行緒中執行的,需要消耗大量時間的操作都會引發ANR。因為此時,你的應用程式已經沒有機會去響應輸入事件和意向廣播(Intent broadcast)。 

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

25.Android Intent的使用

在一個Android應用中,主要是由一些元件組成,(Activity,Service,ContentProvider,etc.)在這些元件之間的通訊中,由Intent協助完成。

正如網上一些人解析所說,Intent負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應的元件,將 Intent傳遞給呼叫的元件,並完成元件的呼叫。Intent在這裡起著實現呼叫者與被呼叫者之間的解耦作用。
Intent傳遞過程中,要找到目標消費者(另一個Activity,IntentReceiver或Service),也就是Intent的響應者,有兩種方法來匹配:
1,顯示匹配(Explicit): 

[java] view plaincopy
  1. public TestB extents Activity  
  2. {  
  3.  .........  
  4. };  
  5.  public class Test extends Activity  
  6. {  
  7.      ......  
  8.      public void switchActivity()  
  9.      {  
  10.             Intent i = new Intent(Test.this, TestB.class);  
  11.             this.startActivity(i);  
  12.      }  
  13. }  
[java] view plaincopy
  1. public TestB extents Activity  
  2. {  
  3.  .........  
  4. };  
  5.  public class Test extends Activity  
  6. {  
  7.      ......  
  8.      public void switchActivity()  
  9.      {  
  10.             Intent i = new Intent(Test.this, TestB.class);  
  11.             this.startActivity(i);  
  12.      }  
  13. }  

[java] view plaincopy
  1. public TestB extents Activity  
  2. {  
  3.  .........  
  4. };  
  5.  public class Test extends Activity  
  6. {  
  7.      ......  
  8.      public void switchActivity()  
  9.      {  
  10.             Intent i = new Intent(Test.this, TestB.class);  
  11.             this.startActivity(i);  
  12.      }  
  13. }  


程式碼簡潔明瞭,執行了switchActivity()函式,就會馬上跳轉到名為TestB的Activity中。 

2,隱式匹配(Implicit):
   
  隱式匹配,首先要匹配Intent的幾項值:Action, Category, Data/Type,Component
如果填寫了Componet就是上例中的Test.class)這就形成了顯示匹配。所以此部分只講前幾種匹配。匹配規則為最大匹配規則,

1,如果你填寫了Action,如果有一個程式的Manifest.xml中的某一個Activity的IntentFilter段中定義了包含了相同的Action那麼這個Intent就與這個目標Action匹配,如果這個Filter段中沒有定義Type,Category,那麼這個Activity就匹配了。但是如果手機中有兩個以上的程式匹配,那麼就會彈出一個對話可框來提示說明。
Action的值在Android中有很多預定義,如果你想直接轉到你自己定義的Intent接收者,你可以在接收者的IntentFilter中加入一個自定義的Action值(同時要設定Category值為"android.intent.category.DEFAULT"),在你的Intent中設定該值為Intent的Action,就直接能跳轉到你自己的Intent接收者中。因為這個Action在系統中是唯一的。
2,data/type,你可以用Uri來做為data,比如Uri uri = Uri.parse(http://www.google.com );
Intent i = new Intent(Intent.ACTION_VIEW,uri);手機的Intent分發過程中,會根據http://www.google.com 的scheme判斷出資料型別type
手機的Brower則能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能處理http:的type,

3,至於分類Category,一般不要去在Intent中設定它,如果你寫Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,這樣所有不設定Category(Intent.addCategory(String c);)的Intent都會與這個Category匹配。

4,extras(附加資訊),是其它所有附加資訊的集合。使用extras可以為元件提供擴充套件資訊,比如,如果要執行“傳送電子郵件”這個動作,可以將電子郵件的標題、正文等儲存在extras裡,傳給電子郵件傳送元件。

26.如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前儲存當前狀態?

當你的程式中某一個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取出來,程式就完整 一些。這也是看你的應用需不需要儲存什麼,比如你的介面就是讀取一個列表,那就不需要特殊記住什麼,哦, 沒準你需要記住滾動條的位置...

27.如何退出Activity

對於單一Activity的應用來說,退出很簡單,直接finish()即可。當然,也可以用killProcess()System.exit()這樣的方法。現提供幾個方法,供參考:
1、拋異常強制退出:該方法通過拋異常,使程式Force Close。驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出Force Close的視窗。
2、記錄開啟的Activity:每開啟一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
3、傳送特定廣播:在需要結束應用時,傳送一個特定的廣播,每個Activity收到廣播後,關閉即可。
4、遞迴退出在開啟新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞迴關閉。除了第一個,都是想辦法把每一個Activity都結束掉,間接達到目的。但是這樣做同樣不完美。你會發現,如果自己的應用程式對每一個Activity都設定了nosensor,在兩個Activity結束的間隙,sensor可能有效了。但至少,我們的目的達到了,而且沒有影響使用者使用。為了程式設計方便,最好定義一個Activity基類,處理這些共通問題。

28.請解釋下在單執行緒模型中MessageHandlerMessage QueueLooper之間的關係。

Message Queue(訊息佇列):用來存放通過Handler釋出的訊息,通常附屬於某一個建立它的執行緒,可以通過Looper.myQueue()得到當前執行緒的訊息佇列
   Handler:可以釋出或者處理一個訊息或者操作一個Runnable,通過Handler釋出訊息,訊息將只會傳送到與它關聯的訊息佇列,然也只能處理該訊息佇列中的訊息
   Looper:是Handler和訊息佇列之間通訊橋樑,程式元件首先通過Handler把訊息傳遞給LooperLooper把訊息放入佇列。Looper也把訊息佇列裡的訊息廣播給所有的
    HandlerHandler接受到訊息後呼叫handleMessage進行處理
   Message:訊息的型別,在Handler類中的handleMessage方法中得到單個的訊息進行處理.

29.你如何評價Android系統?優缺點。

答:優點:1、學習的開源性
   2、軟體相容性比較好
   3、軟體發展迅速
   4、介面佈局好
   缺點:1、版本過多
         2、先有軟體少  3、商務效能差

30.談談android資料儲存方式。

Android提供了5種方式儲存資料:
1)使用SharedPreferences儲存資料;它是Android提供的用來儲存一些簡單配置資訊的一種機制,採用了XML格式將資料儲存到裝置中。只能在同一個包內使用,不能在不同的包之間使用。
2)檔案儲存資料;檔案儲存方式是一種較常用的方法,在Android中讀取/寫入檔案的方法,與Java中實現I/O的程式是完全一樣的,提供了openFileInput()openFileOutput()方法來讀取裝置上的檔案。
3SQLite資料庫儲存資料;SQLiteAndroid所帶的一個標準的資料庫,它支援SQL語句,它是一個輕量級的嵌入式資料庫。
4)使用ContentProvider儲存資料;主要用於應用程式之間進行資料交換,從而能夠讓其他的應用儲存或讀取此Content Provider的各種資料型別。
5)網路儲存資料;通過網路上提供給我們的儲存空間來上傳(儲存)和下載(獲取)我們儲存在網路空間中的資料資訊。

  

31. AndroidActivity, Intent, Content Provider, Service各有什麼區別。

Activity: 活動,是最基本的android應用程式元件。一個活動就是一個單獨的螢幕,每一個活動都被實現為一個獨立的類,並且從活動基類繼承而來。
Intent: 意圖,描述應用想幹什麼。最重要的部分是動作和動作對應的資料。
Content Provider:內容提供器,android應用程式能夠將它們的資料儲存到檔案、SQLite資料庫中,甚至是任何有效的裝置中。當你想將你的應用資料和其他應用共享時,內容提供器就可以發揮作用了。
Service:服務,具有一段較長生命週期且沒有使用者介面的程式。

32.View, surfaceView, GLSurfaceView有什麼區別。

view是最基礎的,必須在UI主執行緒內更新畫面,速度較慢。
SurfaceView view的子類,類似使用雙緩機制,在新的執行緒中更新畫面所以重新整理介面速度比view
GLSurfaceView SurfaceView的子類,opengl 專用的

33.Manifest.xml檔案中主要包括哪些資訊?

manifest:根節點,描述了package中所有的內容。
uses-permission:請求你的package正常運作所需賦予的安全許可。
permission: 宣告瞭安全許可來限制哪些程式能你package中的元件和功能。
instrumentation:宣告瞭用來測試此package或其他package指令元件的程式碼。
application:包含packageapplication級別元件宣告的根節點。
activityActivity是用來與使用者互動的主要工具。
receiverIntentReceiver能使的application獲得資料的改變或者發生的操作,即使它當前不在執行。
serviceService是能在後臺執行任意時間的元件。
providerContentProvider是用來管理持久化資料併發布給其他應用程式使用的元件。

34.根據自己的理解描述下Android數字簽名。

(1)所有的應用程式都必須有數字證照,Android系統不會安裝一個沒有數字證照的應用程式
(2)Android程式包使用的數字證照可以是自簽名的,不需要一個權威的數字證照機構簽名認證
(3)如果要正式釋出一個Android ,必須使用一個合適的私鑰生成的數字證照來給程式簽名,而不能使用adt外掛或者ant工具生成的除錯證照來發布。
(4)數字證照都是有有效期的,Android只是在應用程式安裝的時候才會檢查證照的有效期。如果程式已經安裝在系統中,即使證照過期也不會影響程式的正常功能。

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

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

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

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

3、在Java檔案中實現AIDL中定義的介面編譯器會根據AIDL介面產生一個JAVA介面。這個介面有一個名為Stub的內部抽象類,它繼承擴充套件了介面並實現了遠端呼叫需要的幾個方法。接下來就需要自己去實現自定義的幾個介面了.
4、向客戶端提供介面ITaskBinder, 如果寫的是service,擴充套件該Service並過載onBind ()方法來返回一個實現上述介面的類的例項。
5、在伺服器端回撥客戶端的函式前提是當客戶端獲取的IBinder介面的時候,要去註冊回撥函式只有這樣伺服器端才知道該呼叫那些函式

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

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

2. String, CharSequence不需要特殊宣告

3. List, MapParcelables型別這些型別內所包含的資料成員也只能是簡單資料型別, 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

36.android:gravityandroid:layout_gravity的區別

LinearLayout有兩個非常相似的屬性:android:gravityandroid:layout_gravity。他們的區別在 於:android:gravity用於設定View元件的對齊方式,而android:layout_gravity用於設定Container元件的 對齊方式。

舉個例子,我們可以通過設定android:gravity="center"來讓EditText中的文字在EditText元件中居中顯示;同 時我們設定EditTextandroid:layout_gravity="right"來讓EditText元件在LinearLayout中居中 顯示。來實踐以下:

正如我們所看到的,在EditText中,其中的文字已經居中顯示了,而EditText元件自己也對齊到了LinearLayout的右側。

[html] view plaincopy
  1. <LinearLayout   
  2.     xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent">   
  6.     <EditText   
  7.         android:layout_width="wrap_content"   
  8.         android:gravity="center"   
  9.         android:layout_height="wrap_content"   
  10.         android:text="one"   
  11.         android:layout_gravity="right"/>   
  12. </LinearLayout>  
[html] view plaincopy
  1. <LinearLayout   
  2.     xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent">   
  6.     <EditText   
  7.         android:layout_width="wrap_content"   
  8.         android:gravity="center"   
  9.         android:layout_height="wrap_content"   
  10.         android:text="one"   
  11.         android:layout_gravity="right"/>   
  12. </LinearLayout>  

[html] view plaincopy
  1. <LinearLayout   
  2.     xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent">   
  6.     <EditText   
  7.         android:layout_width="wrap_content"   
  8.         android:gravity="center"   
  9.         android:layout_height="wrap_content"   
  10.         android:text="one"   
  11.         android:layout_gravity="right"/>   
  12. </LinearLayout>  



這兩個屬性也可以用於 Framlayout Textview 等等,表示的意思大同小異

37.paddingmargin的區別

padding填充的意思,指的是view中的contentview邊緣的距離,類似文字中的indent
margin表示的是view的左邊緣與parent view的左邊緣的距離
margin一般用來描述控制元件間位置關係,而padding一般描述控制元件內容和控制元件的位置關係。

簡單,padding是站在父 view的角度描述問題,它規定它裡面的內容必須與這個父view邊界的距離。margin則是站在自己的角度描述問題,規定自己和其他(上下左右)的 view之間的距離,如果同一級只有一個view,那麼它的效果基本上就和padding一樣了。例如我的XML layout程式碼如下:

view plaincopy to clipboardprint?

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="vertical"    
  4.     android:layout_width="fill_parent"    
  5.     android:layout_height="fill_parent"    
  6.     android:paddingLeft="10dip"    
  7.     android:paddingRight="10dip"    
  8.     android:paddingTop="10dip"    
  9.     android:paddingBottom="10dip"    
  10.     >    
  11. <TextView      
  12.     android:layout_width="wrap_content"     
  13.     android:layout_height="wrap_content"     
  14.     android:background="#FF0000"    
  15.     android:text="@string/hello"    
  16.     android:paddingLeft="50dip"    
  17.     android:paddingRight="50dip"    
  18.     android:paddingTop="50dip"    
  19.     android:paddingBottom="50dip"    
  20.     android:layout_marginBottom="10dip"    
  21.     />    
  22.     <TextView      
  23.     android:layout_width="wrap_content"     
  24.     android:layout_height="wrap_content"     
  25.     android:background="#FF0000"    
  26.     android:text="@string/hello"    
  27.     android:paddingLeft="50dip"    
  28.     android:paddingRight="50dip"    
  29.     android:paddingTop="50dip"    
  30.     android:paddingBottom="50dip"    
  31.     android:layout_marginBottom="10dip"    
  32.     />    
  33.     <TextView      
  34.     android:layout_width="wrap_content"     
  35.     android:layout_height="wrap_content"     
  36.     android:background="#FF0000"    
  37.     android:text="@string/hello"    
  38.     android:paddingLeft="50dip"    
  39.     android:paddingRight="50dip"    
  40.     android:paddingTop="50dip"    
  41.     android:paddingBottom="50dip"    
  42.     android:layout_marginBottom="10dip"    
  43.     />    
  44.     <TextView      
  45.     android:layout_width="wrap_content"     
  46.     android:layout_height="wrap_content"     
  47.     android:background="#FF0000"    
  48.     android:text="@string/hello"    
  49.     android:paddingLeft="50dip"    
  50.     android:paddingRight="50dip"    
  51.     android:paddingTop="50dip"    
  52.     android:paddingBottom="50dip"    
  53.     android:layout_marginBottom="10dip"    
  54.     />    
  55. </LinearLayout>    
[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="vertical"    
  4.     android:layout_width="fill_parent"    
  5.     android:layout_height="fill_parent"    
  6.     android:paddingLeft="10dip"    
  7.     android:paddingRight="10dip"    
  8.     android:paddingTop="10dip"    
  9.     android:paddingBottom="10dip"    
  10.     >    
  11. <TextView      
  12.     android:layout_width="wrap_content"     
  13.     android:layout_height="wrap_content"     
  14.     android:background="#FF0000"    
  15.     android:text="@string/hello"    
  16.     android:paddingLeft="50dip"    
  17.     android:paddingRight="50dip"    
  18.     android:paddingTop="50dip"    
  19.     android:paddingBottom="50dip"    
  20.     android:layout_marginBottom="10dip"    
  21.     />    
  22.     <TextView      
  23.     android:layout_width="wrap_content"     
  24.     android:layout_height="wrap_content"     
  25.     android:background="#FF0000"    
  26.     android:text="@string/hello"    
  27.     android:paddingLeft="50dip"    
  28.     android:paddingRight="50dip"    
  29.     android:paddingTop="50dip"    
  30.     android:paddingBottom="50dip"    
  31.     android:layout_marginBottom="10dip"    
  32.     />    
  33.     <TextView      
  34.     android:layout_width="wrap_content"     
  35.     android:layout_height="wrap_content"     
  36.     android:background="#FF0000"    
  37.     android:text="@string/hello"    
  38.     android:paddingLeft="50dip"    
  39.     android:paddingRight="50dip"    
  40.     android:paddingTop="50dip"    
  41.     android:paddingBottom="50dip"    
  42.     android:layout_marginBottom="10dip"    
  43.     />    
  44.     <TextView      
  45.     android:layout_width="wrap_content"     
  46.     android:layout_height="wrap_content"     
  47.     android:background="#FF0000"    
  48.     android:text="@string/hello"    
  49.     android:paddingLeft="50dip"    
  50.     android:paddingRight="50dip"    
  51.     android:paddingTop="50dip"    
  52.     android:paddingBottom="50dip"    
  53.     android:layout_marginBottom="10dip"    
  54.     />    
  55. </LinearLayout>    

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="vertical"    
  4.     android:layout_width="fill_parent"    
  5.     android:layout_height="fill_parent"    
  6.     android:paddingLeft="10dip"    
  7.     android:paddingRight="10dip"    
  8.     android:paddingTop="10dip"    
  9.     android:paddingBottom="10dip"    
  10.     >    
  11. <TextView      
  12.     android:layout_width="wrap_content"     
  13.     android:layout_height="wrap_content"     
  14.     android:background="#FF0000"    
  15.     android:text="@string/hello"    
  16.     android:paddingLeft="50dip"    
  17.     android:paddingRight="50dip"    
  18.     android:paddingTop="50dip"    
  19.     android:paddingBottom="50dip"    
  20.     android:layout_marginBottom="10dip"    
  21.     />    
  22.     <TextView      
  23.     android:layout_width="wrap_content"     
  24.     android:layout_height="wrap_content"     
  25.     android:background="#FF0000"    
  26.     android:text="@string/hello"    
  27.     android:paddingLeft="50dip"    
  28.     android:paddingRight="50dip"    
  29.     android:paddingTop="50dip"    
  30.     android:paddingBottom="50dip"    
  31.     android:layout_marginBottom="10dip"    
  32.     />    
  33.     <TextView      
  34.     android:layout_width="wrap_content"     
  35.     android:layout_height="wrap_content"     
  36.     android:background="#FF0000"    
  37.     android:text="@string/hello"    
  38.     android:paddingLeft="50dip"    
  39.     android:paddingRight="50dip"    
  40.     android:paddingTop="50dip"    
  41.     android:paddingBottom="50dip"    
  42.     android:layout_marginBottom="10dip"    
  43.     />    
  44.     <TextView      
  45.     android:layout_width="wrap_content"     
  46.     android:layout_height="wrap_content"     
  47.     android:background="#FF0000"    
  48.     android:text="@string/hello"    
  49.     android:paddingLeft="50dip"    
  50.     android:paddingRight="50dip"    
  51.     android:paddingTop="50dip"    
  52.     android:paddingBottom="50dip"    
  53.     android:layout_marginBottom="10dip"    
  54.     />    
  55. </LinearLayout>    

 那麼我會得到如下的效果,圖上已經很明確的標出來區別咯。

38. 註冊廣播接收者兩種方式的區別

  現在我們就來實現一個簡單的廣播程式。Android提供了兩種註冊廣播接受者的形式,分別是在程式中動態註冊和在xml中指定。他們之間的區別就是作用 的範圍不同,程式動態註冊的接收者只在程式執行過程中有效,而在xml註冊的接收者不管你的程式有沒有啟動有會起作用。

39.Dalvik基於JVM的改進

1.幾個class變為一個dexconstant pool,省記憶體

2.Zygotecopy-on-write shared,省記憶體,省cpu,省電

3.基於暫存器的bytecode,省指令,省cpu,省電

4.Trace-based JIT,cpu,省電,省記憶體

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

Ø DOM解析

    優點:

1.XML樹在記憶體中完整儲存,因此可以直接修改其資料和結構. 

2.可以通過該解析器隨時訪問XML樹中的任何一個節點. 

3.DOM解析器的API在使用上也相對比較簡單.

缺點:如果XML文件體積比較大時,將文件讀入記憶體是非常消耗系統資源的.

使用場景:DOM 是用與平臺和語言無關的方式表示 XML 文件的官方 W3C 標準.DOM 是以層次結構組織的節點的集合.這個層次結構允許開發人員在樹中尋找特定資訊.分析該結構通常需要載入整個文件和構造層次結構,然後才能進行任何工作.DOM是基於物件層次結構的.

Ø SAX解析

優點:

SAX 對記憶體的要求比較低,因為它讓開發人員自己來決定所要處理的標籤.特別是當開發人員只需要處理文件中所包含的部分資料時,SAX 這種擴充套件能力得到了更好的體現.

缺點:

用SAX方式進行XML解析時,需要順序執行,所以很難訪問到同一文件中的不同資料.此外,在基於該方式的解析編碼過程也相對複雜.

使用場景:

對於含有資料量十分巨大,而又不用對文件的所有資料進行遍歷或者分析的時候,使用該方法十分有效.該方法不用將整個文件讀入記憶體,而只需讀取到程式所需的文件標籤處即可.

Ø Xmlpull解析

android SDK提供了xmlpull api,xmlpull和sax類似,是基於流(stream)操作檔案,然後根據節點事件回撥開發者編寫的處理程式.因為是基於流的處理,因此xmlpull和sax都比較節約記憶體資源,不會象dom那樣要把所有節點以對橡樹的形式展現在記憶體中.xmlpull比sax更簡明,而且不需要掃描完整個流.

41.Android系統中GC什麼情況下會出現記憶體洩露呢?

出現情況:
1. 資料庫的cursor沒有關閉
2.構造adapter時,沒有使用快取contentview
   衍生listview的優化問題-----減少建立view的物件,充分使用contentview,可以使用一靜態類來優化處理getview的過程/
3.Bitmap物件不使用時採用recycle()釋放記憶體
4.activity中的物件的生命週期大於activity
除錯方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]

42.談談對Android NDK的理解

NDK 全稱: Native Development Kit 

2.誤解 
    誤解一: NDK 釋出之前, Android 不支援進行 C 開發 
    在Google 中搜尋 “NDK” ,很多 “Android 終於可以使用 C++ 開發 ” 之類的標題,這是一種對 Android 平臺程式設計方式的誤解.其實, Android 平臺從誕生起,就已經支援 C . C++ 開發.眾所周知, Android 的 SDK 基於 Java 實現,這意味著基於 Android SDK 進行開發的第三方應用都必須使用 Java 語言.但這並不等同於 “ 第三方應用只能使用 Java” .在 Android SDK 首次釋出時, Google 就宣稱其虛擬機器 Dalvik 支援 JNI 程式設計方式,也就是第三方應用完全可以通過 JNI 呼叫自己的 C 動態庫,即在 Android 平臺上, “Java+C” 的程式設計方式是一直都可以實現的.

 當然這種誤解的產生是有根源的:在Android SDK 文件裡,找不到任何 JNI 方面的幫助.即使第三方應用開發者使用 JNI 完成了自己的 C 動態連結庫( so )開發,但是 so 如何和應用程式一起打包成 apk 併發布?這裡面也存在技術障礙.我曾經花了不少時間,安裝交叉編譯器建立 so ,並通過 asset (資源)方式,實現捆綁 so 釋出.但這種方式只能屬於取巧的方式,並非官方支援.所以,在 NDK 出來之前,我們將 “Java+C” 的開發模式稱之為灰色模式,即官方既不宣告 “ 支援這種方式 ” ,也不宣告 “ 不支援這種方式 ” .

誤解二:有了 NDK ,我們可以使用純 C 開發 Android 應用 
 Android SDK採用 Java 語言釋出,把眾多的 C 開發人員排除在第三方應用開發外( 注意:我們所有討論都是基於“ 第三方應用開發 ” , Android 系統基於 Linux ,系統級別的開發肯定是支援 C 語言的. ).NDK 的釋出,許多人會誤以為,類似於 Symbian . WM ,在 Android 平臺上終於可以使用純 C . C++ 開發第三方應用了!其實不然, NDK 文件明確說明: it is not a good way .因為 NDK 並沒有提供各種系統事件處理支援,也沒有提供應用程式生命週期維護.此外,在本次釋出的 NDK 中,應用程式 UI 方面的 API 也沒有提供.至少目前來說,使用純 C . C++ 開發一個完整應用的條件還不完備.
   1.NDK 是一系列工具的集合.

NDK提供了一系列的工具,幫助開發者快速開發 C (或 C++ )的動態庫,並能自動將 so 和 java 應用一起打包成 apk .這些工具對開發者的幫助是巨大的. 
NDK整合了交叉編譯器,並提供了相應的 mk 檔案隔離 CPU .平臺. ABI 等差異,開發人員只需要簡單修改 mk 檔案(指出 “ 哪些檔案需要編譯 ” . “ 編譯特性要求 ” 等),就可以建立出 NDK可以自動地將 so 和 Java 應用一起打包,極大地減輕了開發人員的打包工作. 
   2.NDK 提供了一份穩定.功能有限的 API 標頭檔案宣告.

 Google明確宣告該 API 是穩定的,在後續所有版本中都穩定支援當前釋出的 API .從該版本的 NDK 中看出,這些 API 支援的功能非常有限,包含有: C 標準庫( libc ).標準數學庫( libm ).壓縮庫( libz ). Log 庫( liblog ).

3.NDK 帶來什麼 
1.NDK 的釋出,使 “Java+C” 的開發方式終於轉正,成為官方支援的開發方式.

使用NDK ,我們可以將要求高效能的應用邏輯使用 C 開發,從而提高應用程式的執行效率. 
使用NDK ,我們可以將需要保密的應用邏輯使用 C 開發.畢竟, Java 包都是可以反編譯的. 
NDK促使專業 so 元件商的出現.(樂觀猜想,要視乎 Android 使用者的數量) 
    2.NDK 將是 Android 平臺支援 C 開發的開端. NDK提供了的開發工具集合,使開發人員可以便捷地開發.釋出 C 元件.同時, Google承諾在 NDK 後續版本中提高 “ 可調式 ” 能力,即提供遠端的 gdb 工具,使我們可以便捷地除錯 C 原始碼.在支援 Android 平臺 C 開發,我們能感覺到 Google 花費了很大精力,我們有理由憧憬 “C 元件支援 ” 只是 Google Android 平臺上C 開發的開端.畢竟, C 程式設計師仍然是碼農陣營中的絕對主力,將這部分人排除在 Android 應用開發之外,顯然是不利於 Android 平臺繁榮昌盛的.

相關文章