文章参考:《第一行代码》
广播分为两种类型,标准广播和有序广播
标准广播是一种完全异步执行的广播,在广播发出后所有的广播接收器几乎会在同一时刻接收到这条广播消息,它们之间没有任何先后顺序,效率比较高,无法被截断
有序广播则是一种同步广播,广播发出后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完后,广播才会继续传递,优先级高的广播接收器可以先收到广播消息,并且前面的广播接收器可以截断正在传递的广播
- 广播接收器
创建广播接收器只需要新建一个类,让它继承自 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();
}
}
}