BroadcastReceiver—使用(III)

   3. 生命週期

  描述了 Android 中廣播的生命週期,其次它並不像 Activity 同樣複雜,運行原理很簡單以下圖:java

 生命週期只有十秒左右,若是在 onReceive() 內作超過十秒內的事情,就會報錯。

  每次廣播到來時 , 會從新建立 BroadcastReceiver 對象 , 而且調用 onReceive() 方法 , 執行完之後 , 該對象即被銷燬 . 當 onReceive() 方法在 10 秒內沒有執行完畢, Android 會認爲該程序無響應 . 因此在BroadcastReceiver 裏不能作一些比較耗時的操做 , 否側會彈出 ANR(Application No Response) 的對話框.

        怎麼用好 BroadcastReceiver

    若是須要完成一項比較耗時的工做 , 應該經過發送 Intent 給 Service, 由 Service 來完成 . 這裏不能使用子線程來解決 , 由於 BroadcastReceiver 的生命週期很短 , 子線程可能尚未結束BroadcastReceiver 就先結束了 .BroadcastReceiver 一旦結束 , 此時 BroadcastReceiver 的

  所在進程很容易在系統須要內存時被優先殺死 , 由於它屬於空進程 ( 沒有任何活動組件的進程 ). 若是它的宿主進程被殺死 , 那麼正在工做的子線程也會被殺死 . 因此採用子線程來解決是不可靠的.

  廣播類型及廣播的收發
  廣播類型

   普通廣播 (Normal broadcasts)

  發送一個廣播,因此監聽該廣播的廣播接收者均可以監聽到改廣播。
  異步廣播 , 當處理完以後的Intent ,依然存在,這時候registerReceiver(BroadcastReceiver,IntentFilter) 還能收到他的值,直到你把它去掉 , 不能將處理結果傳給下一個接收者 , 沒法終止廣播. 


   有序廣播 (Ordered broadcasts)

        廣播的收發

  該組件接收被廣播的 intent,Context 能夠經過 sendBroadcast() 和 sendOrderedBroadcast()
  方法實現廣播的發送.

  首先在須要發送信息的地方 ,把要發送的信息和用於過濾的信息 ( 如 Action 、 Category) 裝入一個 Intent 對象 ,而後經過調用 Context.sendBroadcast() 、 sendOrderBroadcast() 或 sendStickyBroadcast() 方法,把 Intent 對象以廣播方式發送出去。

  使用 sendBroadcast() 或 sendStickyBroadcast() 方法發出去的 Intent ,全部知足條件的 BroadcastReceiver 都會隨機地執行其 onReceive() 方法

   普通廣播的發送和接收:

sendBroadcast(intent);
Intent intent = new Intent( "cn.lenovo.yangguangf " );
sendBroadcast(intent);



     priority :這個是 AndroidManifest.xml 中 intent-filter 的參數。android

< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "1000" >
< action android:name = "cn.lenovo.yangguangfu" />
相關文章
相關標籤/搜索