Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android Service服務(二) BroadcastReceiver

Android Service服務(二) BroadcastReceiver

編輯:Android開發教程

一、 BroadcastReceiver簡介

BroadcastReceiver,用於異步接收廣播Intent,廣播Intent是通過調用 Context.sendBroadcast()發送、BroadcastReceiver()接收。

廣播Intent的發送是通過調用Context.sendBroadcast()、 Context.sendOrderedBroadcast()、Context.sendStickyBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的 多個廣播接收者所接收,廣播接收者和JMS中的Topic消息接收者很相似。

廣播接收器只能接收廣播,對廣播的通知做出反應 ,很多廣播都產生於系統代碼,如:時區改變的通知、電池電量不足、用戶改變了語言偏好,或者開機啟動等

廣播接收器沒 有用戶界面,但是它可以為它們接收到信息啟動一個Activity或者使用NotificationManager來通知用 戶.

BroadcastReceiver 接收廣播方式:

1. Normal broadcasts(正常廣播),用 Context.sendBroadcast()發送是 完全異步的,它們都運行在一個未定義的順序,通常是在同一時間。這樣會更有效,但意味著receiver不能包含所要使用的結果 或中止的API。  

2. Ordered broadcasts(有序廣播),用 Context.sendOrderedBroadcast()發送每次被發送到一個 receiver。所謂有序,就是每個receiver執行後可以傳播到下一個receiver,也可以完全中止傳播——不傳播給其他receiver。 而receiver運行的順序可以通過matched intent-filter 裡面的android:priority來控制,當priority優先級相同的時候, Receiver以任意的順序運行。

二、 BroadcastReceiver注冊方式

1 靜態注冊

AndroidManifest.xml中, application裡面,定義receiver並設置要接收的action

<receiver android:name=".receiver.MusicReceiver" 

>     
    <intent-filter>     
        <action android:name="com.homer.receiver.musicReceiver" />     
    </intent-filter>     
</receiver>

2 動態注冊

Activity中,需在onStart()中調用registerReceiver()進行注冊和在onStop 中調用unregisterReceiver()釋放服務

private MusicReceiver receiver;     
         
@Override 
protected void onStart(){     
    super.onStart();     
             
    receiver = new MusicReceiver();     
    IntentFilter filter = new IntentFilter();     
    filter.addAction("com.homer.receiver.musicReceiver");     
    this.registerReceiver(receiver, filter);     
}     

@Override 
protected void onStop(){     
    this.unregisterReceiver(receiver);     

    super.onStop();     
}

3 兩種注冊方式的比較

靜態注冊方式,由系統來管理receiver,而且程序裡的所有receiver,可以在xml裡面一目 了然

動態注冊方式,隱藏在代碼中,比較難發現;需要特別注意的是,在退出程序前要記得調用 Context.unregisterReceiver()方法。一般在activity的onStart()裡面進行注冊, onStop()裡面進行注銷。官方提醒,如果在 Activity.onResume()裡面注冊了,就必須在Activity.onPause()注銷。

三、 BroadcastReceiver生命周期

一個 BroadcastReceiver 對象只有在被調用onReceive(Context, Intent)的才有效,當從該函數返回後,該對象就無效的了,結束生 命周期。

因此從這個特征可以看出,在所調用的onReceive(Context, Intent)函數裡,不能有過於耗時的操作,不能使用線 程來執行。對於耗時的操作,應該在startService中來完成。因為當得到其他異步操作所返回的結果時,BroadcastReceiver 可 能已經無效了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved