文章參考:《第一行代碼》
廣播分爲兩種類型,標準廣播和有序廣播
標準廣播是一種完全異步執行的廣播,在廣播發出後所有的廣播接收器幾乎會在同一時刻接收到這條廣播消息,它們之間沒有任何先後順序,效率比較高,無法被截斷
有序廣播則是一種同步廣播,廣播發出後,同一時刻只會有一個廣播接收器能夠收到這條廣播消息,當這個廣播接收器中的邏輯執行完後,廣播纔會繼續傳遞,優先級高的廣播接收器可以先收到廣播消息,並且前面的廣播接收器可以截斷正在傳遞的廣播
- 廣播接收器
創建廣播接收器只需要新建一個類,讓它繼承自 BroadcastReceiver,並重寫 onReceive() 方法。當有廣播到來時,onReceive() 方法就會得到執行
創建好廣播接收器後,還需要進行註冊,一般有兩種註冊方法,動態註冊:在代碼中註冊,靜態註冊:在 AndroidManifest.xml 中註冊
動態註冊示例:
/*
* 監聽網絡變化的程序
*/
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// 動態註冊廣播接收器
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
}
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
class NetworkChangeReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent){
Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
}
}
}
別忘了申明權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
靜態註冊實例:
// 創建接收器
public class BootCompleteReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent){
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
先創建一個接收器,接着在 AndroidManifest.xml 文件中註冊
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
先通過 android:name 指定具體註冊哪一個廣播接收器,然後在 <intent-filter> 標籤里加入想要接收的廣播就行了,這裏是啓動完成廣播,也要加上權限聲明
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- 自定義廣播
除了系統可以發送廣播外,應用程序中也可以發送自定義的廣播
先創建一個廣播接收器
/*
* 創建廣播接收器
*/
public class MyBroadcastReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent){
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}
並對其進行註冊
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
這裏讓 MyBroadcastReceiver 接收一條 com.example.broadcasttest.MY_BROADCAST 類型的廣播,接下來發送一條這個廣播
先在佈局文件中定義一個按鈕,id 爲 button,接着實現點擊按鈕發送一條 com.example.broadcasttest.MY_BROADCAST 廣播
Button btn = (Button)findViewById(R.id.button);
btn.setOnClickListener(new OnClickListener(){
public void onClick(View v){
/*
* 發送 com.example.broadcasttest.MY_BROADCAST 廣播
*/
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
有序廣播與無序廣播的發送方式類似,只需把 sendBroadcast(intent) 改成 sendOrderedBroadcast(intent, null);
豐有序廣播中要設定廣播接收器的先後順序,可以通過 android:priority 屬性指定優先級
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
如果要截斷有序廣播,只需在廣播接收器中調用 abortBroadcast();
全局廣播在創建時可以加入下面這行限制,廣播將永遠只能被本實例的 DataReceiver 接收
intent.setClass(MainActivity.this, DataReceiver.class);
- 本地廣播
前面發送和接收的廣播都屬於全局廣播,即發出的廣播可以被其他任何應用程序接收到,並且也可以接收來自於其他應用程序的廣播,本地廣播機制發出的廣播只能夠在應用程序的內部進行傳遞,並且廣播接收器也只能接收來自本應用程序發出的廣播
主要使用了一個 LocalBroadcastManager 來對廣播進行管理,並提供了發送廣播和註冊廣播接收器的方法
本地廣播示例:
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// 獲取 LocalBroadcastManager 實例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button btn = (Button)findViewById(R.id.button);
btn.setOnClickListener(new OnClickListener(){
public void onClick(View v){
// 發送本地廣播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
// 註冊本地廣播接收器
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
}
// 創建廣播接收器
class LocalReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent){
Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
}
}
}