前輩推薦的 Android 70道面試題匯總寶典面試(5)

發表于:2012-02-02來源:未知作者:admin點擊數: 標簽:
public class SmsBroadCastReceiverextends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); Object[] object = (Object[])bundle.ge

  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. 請解釋下在單線程模型中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的線程實現。

  class LooperThread extends Thread {

  public Handler mHandler;

  public void run() {

  Looper.prepare();

  mHandler = new Handler() {

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97