概述:
是一种在应用程序之间传输信息的机制。
过程:
1.在发送消息处,用Intent包装发送的信息和用于过滤的消息;
2.调用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把Intent对象以广播方式发送出去;
3.Intent发送后,所有已注册的BroadcastReceiver会检查注册时的IntentFiter是否与发送的Intent相匹配,如果匹配则调用onReceiver()方法。
注册的两种方式:
1.静态注册:在AndroidManifest.xml用标签注册,并设置过滤器。在程序未启动的情况下就能接收到广播,可实现开机启动。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootCompleteReceiver" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
public class BootCompleteReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
动态注册:在代码中注册
1.代码中预先设置好一个IntentFilter对象;
2.在需要注册的地方调用Context.registReceiver()方法,取消注册调用Context.unregisterReceiver()方法。Context对象被销毁时,BroadcastReceiver也自动取消注册。
代码示例(第一行代码):
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.wangweiwei.java.MY_BROADCAST");
sendOrderedBroadcast(intent, null);
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
// 网络改变监听
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "网络不可用",Toast.LENGTH_SHORT ).show();
}
}
}
}
加入权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
应用场景:
多数广播由系统发起,如电量不足、来电来信等。
Broadcast Receiver可以通过多种方式通知用户:启动Activity、使用通知、打开LED灯、震动、铃声等。
发送自定义标准广播:
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
abortBroadcast();// 截断广播
}
}
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter android:priority="100">
<action android:name="com.wangweiwei.java.MY_BROADCAST" />
</intent-filter>
</receiver>
在MainActovity中发送:
@Override
public void onClick(View v) {
Intent intent = new Intent("com.wangweiwei.java.MY_BROADCAST");
sendBroadcast(intent);
}
发送有序广播:同步执行的广播,有先后顺序,依次传递
只需改动一行代码:
@Override
public void onClick(View v) {
Intent intent = new Intent("com.wangweiwei.java.MY_BROADCAST");
// sendBroadcast(intent);
sendOrderedBroadcast(intent, null);
}
使用本地广播:可简单的解决广播的安全性问题。
public class LocalBroadcast extends Activity {
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.wangweiwei.java.LOCAL_BROADCAST");
// 发送本地广播
localBroadcastManager.sendBroadcast(intent);
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.wangweiwei.java.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
// 注册本地广播监听器
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(localReceiver);
}
// 本地广播
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
}
}
}