一、首先,先介紹一下廣播。
1.廣播是Android四大組件之一,全稱Broadcast Receiver。2.廣播分爲發送方和接收方,就算沒有接受方,發送方也會分發送數據。3.廣播可以實現跨多個頁面的數據通信。4.廣播可以實現跨進程間的數據通信。
廣播可分爲靜態註冊無序廣播、靜態註冊有序廣播和動態註冊無序廣播、動態註冊有序廣播。所謂靜態註冊簡單來說就是在Manifest中註冊,而動態註冊就是在代碼中註冊。所謂無序廣播是一種完全異步執行的廣播,在發出之後,所有的廣播接收器幾乎都會在同一時刻接收到這條廣播消息,他們之間沒有先後順序。有序廣播則是一種同步執行的廣播,在廣播發出之後,同一時刻只會有一個廣播接收器能夠收到這條廣播消息。
二、先來看一下靜態註冊無序廣播的使用。
1.先建一個廣播接收器MyReceiver繼承BroadcastReceiver,然後實現它的onReceive()方法
2.然後在Manifest中註冊,在<application><application/>的標籤之間
<receiver android:name="com.receiver.MyReceiver1"> -->
<intent-filter >
<action android:name="com.lk.broadcast1"/>
<action android:name="com.lk.broadcast2"/>
<action android:name="com.lk.broadcast3"/>
</intent-filter>
</receiver>
3.在需要發送廣播的地方寫發送廣播的邏輯
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.button_guangbo1:
Intent intent = new Intent();
// 相當於電臺,發送指定頻道的廣播
intent.setAction("com.lk.broadcast1");
intent.putExtra("FM", "我是央廣天下財經");
// 發送廣播
sendBroadcast(intent);
break;
4.在廣播接受器中再寫接收廣播的邏輯
public class MyReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String action = arg1.getAction();
if (action.equals("com.lk.broadcast1")) {
String fm = arg1.getStringExtra("FM");
Toast.makeText(arg0, "我接受到了廣播:" + fm, Toast.LENGTH_SHORT).show();
} else if (action.equals("com.lk.broadcast2")) {
Toast.makeText(arg0, "我接受到了廣播:" + "第二個", Toast.LENGTH_SHORT).show();
} else if (action.equals("com.lk.broadcast3")) {
}
}
}
1.邏輯和無序廣播一樣,不同的是Manifest中註冊是多了一個屬性android:priority設置優先級,優先級高的廣播接收器就可以先接受到。
<receiver android:name="com.receiver.MyReceiverYX" >
<intent-filter android:priority="10" >
<action android:name="com.lk.broadcast4" />
</intent-filter>
</receiver>
<receiver android:name="com.receiver.MyReceiverYx2" >
<intent-filter android:priority="100" >
<action android:name="com.lk.broadcast4" />
</intent-filter>
</receiver>
2.還有一點不同的是在發送廣播時,有序用的是sendOrderedBroadcast。
case R.id.button_guangbo2:
Intent intent2 = new Intent();
intent2.setAction("com.lk.broadcast4");
sendOrderedBroadcast(intent2, null);
break;
四、再來看一下動態註冊無序廣播的使用。
1.邏輯和靜態註冊也一樣,只是把在Manifest中註冊的邏輯改成在代碼中註冊的邏輯就OK了。
case R.id.button_guangbo3:
// 動態註冊廣播
myreceiver1 = new MyReceiver1();
IntentFilter filter = new IntentFilter();
filter.addAction("com.lk.broadcast1");
registerReceiver(myreceiver1, filter);
Intent intent3 = new Intent();
intent3.setAction("com.lk.broadcast1");
sendBroadcast(intent3);
break;
2.還有一點需要注意的是要在onDestroy()方法中取消註冊。
@Override
protected void onDestroy() {
super.onDestroy();
if (myreceiver1 != null) {
unregisterReceiver(myreceiver1);
}
if (myreceiveryx != null) {
unregisterReceiver(myreceiveryx);
}
if (myreceiveryx2 != null) {
unregisterReceiver(myreceiveryx2);
}
}
}
動態註冊有序廣播,只需要價格優先級屬性和發送時用sendOrderedBroadcast(),其餘都一樣,也需要在onDestroy()方法中取消註冊。
case R.id.button_guangbo4:
// 動態註冊廣播
myreceiveryx = new MyReceiverYX();
myreceiveryx2 = new MyReceiverYx2();
IntentFilter filter2 = new IntentFilter();
filter2.setPriority(100);
filter2.addAction("com.lk.broadcast4");
registerReceiver(myreceiveryx, filter2);
IntentFilter filter3 = new IntentFilter();
filter3.setPriority(10);
filter3.addAction("com.lk.broadcast4");
registerReceiver(myreceiveryx2, filter3);
Intent intent4 = new Intent();
intent4.setAction("com.lk.broadcast4");
sendOrderedBroadcast(intent4, null);
break;
五,系統廣播
Android內置了許多系統級別的廣播,我們可以在應用程序中通過監聽這些廣播來得到各種系統的狀態信息。比如手機開機完成後會發一條廣播,電池的電量發生變化會發出一條廣播,等等。例如:靜態註冊獲取網絡連接狀態。這裏必須在配置文件中聲明權限。
<receiver android:name="com.receiver.MyReceiverNet" >
<intent-filter >
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
然後在廣播接收器中接收
public class MyReceiverScreen extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent arg1) {
String action =arg1.getAction();
if(action.equals(Intent.ACTION_SCREEN_OFF)){
Log.e("SCREEN", "off");
}else if(action.equals(Intent.ACTION_SCREEN_ON)){
Log.e("SCREEN", "on");
}
}
}
注:動態註冊的廣播可以自由的控制註冊與註銷,在靈活性方面有很大的優勢,但是他也存在着一個缺點,即必須在程序啓動之後才能接受到廣播,因爲註冊的邏輯實在onCreate()方法中的。如果想讓程序在未啓動的情況下就能接受廣播就得用靜態註冊。