編輯:關於Android編程
簡介:
BroadcastReceiver本質上就是一種全局的監聽器,用於監聽系統全局的廣播消息,因此它可以非常方便地實現系統中不同組件之間的通信。
特點:
1.BroadcastReceiver用於接收程序所發出的Broadcast Intent,與應用程序啟動Activity、Service相同;
2.當應用程序發出一個Broadcast Intent之後,所有匹配該Intent的BroadcastReceiver都有可能被啟動;
用法:
網上流行的一張圖片可以很好的感受到broadcastreceiver的主要用法:

本次我們通過一個小的示例來一起學習BroadcastReceiver:
建立三個廣播類,前兩個在manifest裡面注冊,稱為靜態注冊,最後一個沒有在manifest裡面注冊而在代碼中注冊,稱為動態注冊,發送廣播的時候有顯示發送和隱式發送兩種區別。
首先我們來看一下三個廣播接收器類的定義以及manifest裡面的片段內容如下:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver01 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getExtras().getString(data);
Toast.makeText(context, MyReceiver01收到消息: + msg, Toast.LENGTH_SHORT).show();
}
}
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver02 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getExtras().getString(data);
Toast.makeText(context, MyReceiver02收到消息: + msg, Toast.LENGTH_SHORT)
.show();
}
}
public class MyReceiver03 extends BroadcastReceiver {
public final static String INTENT_ACTION_MYRECEIVER03 = com.bear.broadcastreceiver.intent.action.receiver03;
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getExtras().getString(data);
Toast.makeText(context, MyReceiver03收到消息: + msg, Toast.LENGTH_SHORT)
.show();
// abortBroadcast(); 取消廣播,後續receiver將無法接收到消息
}
}
主界面共有5個按鈕用來測試,主界面類的定義如下:
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity implements OnClickListener{
private IntentFilter intentFilter;
private MyReceiver03 receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupViews();
intentFilter = new IntentFilter(MyReceiver03.INTENT_ACTION_MYRECEIVER03);
receiver = new MyReceiver03();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
//顯式發送廣播
Intent intent = new Intent(MainActivity.this, MyReceiver01.class);
intent.putExtra(data, bear);
sendBroadcast(intent);
break;
case R.id.button2:
//隱式發送廣播
Intent intent02 = new Intent(com.bear.broadcastreceiver.intent.action.receiver02);
intent02.putExtra(data, bear02);
sendBroadcast(intent02);
break;
case R.id.button3:
//動態注冊廣播
registerReceiver(receiver, intentFilter);
break;
case R.id.button4:
Intent intent03 = new Intent(MyReceiver03.INTENT_ACTION_MYRECEIVER03);
intent03.putExtra(data, bear03);
sendBroadcast(intent03);
// sendOrderedBroadcast(intent03, receiverPermission); 按優先級發送廣播
break;
case R.id.button5:
//注銷廣播
unregisterReceiver(receiver);
break;
default:
break;
}
}
private void setupViews(){
findViewById(R.id.button1).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
findViewById(R.id.button3).setOnClickListener(this);
findViewById(R.id.button4).setOnClickListener(this);
findViewById(R.id.button5).setOnClickListener(this);
}
}
總結:
1. 每次系統廣播(Broadcast)事件發生後,系統就會創建對應的BroadcastReceiver實例,並自動觸發它的onReceive()方法,onReceive()方法執行完後,BroadcastReceiver的實例就會被銷毀;
2.如果BroadcastReceiver的onReceive()方法不能在10秒內執行完成,Android會認為該程序無響應。所以不要在廣播接收者的onReceive()方法裡執行一些耗時的操作,否則會彈出ANR(Application No Response)的對話框;
3.如果確實需要根據廣播來完成一項比較耗時的操作,則可以考慮通過Intent啟動一個Service來完成該操作。不應考慮使用新線程去完成耗時的操作,因為BroadcastReceiver本身的生命周期極短,可能出現的情況是子線程可能還沒有結束,BroadcastReceiver就已經退出了;
最後在這裡附上整個demo工程源碼:
Android BroadcastReceiver
Android實現幾種推送方式解決方案
本文介紹在Android中實現推送方式的基礎知識及相關解決方案。推送功能在手機開發中應用的場景是越來起來了,不說別的,就我們手機上的新聞客戶端就時不j時的推送過來新的消息
Android4.4 Telephony流程分析——SIM卡開機時的數據加載
本文代碼以MTK平台Android 4.4為分析對象,與Google原生AOSP有些許差異,請讀者知悉。 本文主要介紹sim卡數據的讀取過程,當射頻狀態處於
Android Vector曲折的兼容之路
兩年前寫書的時候,就在研究Android L提出的Vector,可研究下來發現,完全不具備兼容性,相信這也是它沒有被廣泛使用的一個原因,經過Google的不懈努力,現在V
java/android 設計模式學習筆記(2)---觀察者模式
這篇來講一下觀察者模式,觀察者模式在實際項目中使用的也是非常頻繁的,它最常用的地方是GUI系統、訂閱——發布系統等。因為這個模式的一個重要作用就是