1廣播的分類
標(biāo)準(zhǔn)廣播:完全異步的廣播,一旦發(fā)出后,所有監(jiān)聽它的廣播都會在同一時間收到該信息。
有序廣播:同步執(zhí)行的廣播,優(yōu)先級高的接收器會先收到消息,并且可被截?cái)唷?/p>
2廣播的注冊與接收
動態(tài)注冊
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private MyReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
receiver = new MyReceiver();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(receiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//動態(tài)注冊的廣播要在onDestroy()方法中取消注冊
unregisterReceiver(receiver);
}
}
廣播接收器類
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
}
}

GIF.gif
靜態(tài)注冊
在<receiver>標(biāo)簽下通過<intent-filter>標(biāo)簽添加<action>標(biāo)簽來實(shí)現(xiàn)
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!--開機(jī)監(jiān)聽-->
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
注意相應(yīng)權(quán)限的添加
發(fā)送自定義廣播
標(biāo)準(zhǔn)廣播
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.shaw.myapplication.MyBroadcastReceiver"/>
</intent-filter>
</receiver>
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new
Intent("com.example.shaw.myapplication.MyBroadcastReceiver");
sendBroadcast(intent);
}
});

GIF.gif
有序廣播
<receiver
android:name=".OrderBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100"> <!-- 設(shè)置接收器的優(yōu)先級 -->
<action android:name="com.example.shaw.myapplication.OrderBroadcastReceiver" />
</intent-filter>
</receiver>
<receiver
android:name=".OrderBroadcastReceiver2"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.shaw.myapplication.OrderBroadcastReceiver" />
</intent-filter>
</receiver>
有序廣播的發(fā)送
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new
Intent("com.example.shaw.myapplication.OrderBroadcastReceiver");
//第二個參數(shù)為與權(quán)限相關(guān)的字符串,null表示所有接收器都可以接收
sendOrderedBroadcast(intent,null);
}
});
廣播接收器1
public class OrderBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("OrderBroadcastReceiver", "OrderBroadcastReceiver in received");
//截?cái)鄰V播
abortBroadcast();
}
}
廣播接收器2
public class OrderBroadcastReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("OrderBroadcastReceiver", "OrderBroadcastReceiver2 in received");
}
}
運(yùn)行結(jié)果為

圖片.png
從Log打印日志可看出廣播接收器2沒有接受到廣播,也就說明了廣播被接收器1截?cái)嗔?/p>
本地廣播
產(chǎn)生原因:系統(tǒng)全局廣播因?yàn)榭赡鼙黄渌麛?shù)據(jù)截?cái)嘣斐蓴?shù)據(jù)泄露,其他程序也可能向我們的廣播接收器發(fā)送垃圾廣播。
本地廣播只能在程序內(nèi)部進(jìn)行傳遞。
localBroadcastManager = LocalBroadcastManager.getInstance(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.shaw.myapplication.LOCAL_BROADCAST");
//使用LocalBroadcastManager實(shí)例發(fā)送本地廣播
localBroadcastManager.sendBroadcast(intent);
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.shaw.myapplication.LOCAL_BROADCAST");
//注冊本地廣播監(jiān)聽器
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
registerReceiver(localReceiver2, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//使用LocalBroadcastManager實(shí)例取消注冊
localBroadcastManager.unregisterReceiver(localReceiver);
unregisterReceiver(localReceiver2);
}
public class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("LocalReceiver", "LocalReceiver received");
}
}
public class LocalReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("LocalReceiver", "LocalReceiver2 received");
}
}

圖片.png
該例子中,localReceiver采用的本地廣播注冊,而localReceiver2采用的是標(biāo)準(zhǔn)廣播注冊,從Log日志打印中可看出localReceiver2確實(shí)沒有接收到該廣播。
注意:本地廣播只能采用動態(tài)注冊的方式