动态注册
如何创建一个广播接收器,首先创建一个新类,让其继承BroadcastReceiver,并重写父类的onReceive方法。当有广播来到时,onReceive方法就会得到执行,具体的逻辑可以在这个方法中处理。这里我们以监听网络变化为例。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private IntentFilter intentFilter;
private NetworkChangReceiver networkChangReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangReceiver = new NetworkChangReceiver();
registerReceiver(networkChangReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangReceiver); //动态注册的广播器一定要记得注销
}
class NetworkChangReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(context, "network is available", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "network is unavailable", Toast.LENGTH_LONG).show();
}
}
}
}
需要注意的是,这里访问系统的网络状态需要声明权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
发送自定义广播
静态注册一个广播 MyBroadcastReceiver,右击项目,New->Service。
MyBroadcastReceiver代码如下
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}
编写AndroidManifest.xml,让MyBroadcastReceiver 接收一条值为test的广播。
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="test"/>
</intent-filter>
</receiver>
接着,添加一个按钮,注册对这个按钮的监听事件,发送值为test的广播。
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button:
Intent intent =new Intent("test");
sendBroadcast(intent);
}
}
发送有序广播
- 使用sendOrderBroadcast()发送有序广播,里面有两个参数,一个是Intent,另外一个和权限相关
- 在receiver的intent-filter中给广播设置priority,也就是优先级,数字越大优先级越高
- 得到接收广播的优先权后,就可以选择是否继续传递广播,在创建的广播接收器中使用abortBroadcast()可以截断广播
使用本地广播
前面我们发送和接收的广播属于系统全局广播,即发出的广播可以被其他人任何应用程序接收,并且我们也可以接收来自于其他应用任何应用程序的广播。这样很容易引起安全问题,为此Android引入一套本地广播机制,使用这个机制发出的广播只能够在应用程序内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。本地广播的用法并不复杂,主要就是使用一个LocalBroadcastManager来对广播进行管理,并提供发送广播和注册广播的方法。
首先我们通过LocalBroadcastManager的getInstance()得到它的一个实例。
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
剩下的和动态注册的代码基本一致,不同的地方是,我们是用localBroadcastManager.registerReceiver()来注册监听器,用
localBroadcastManager.unregisterReceiver()来销毁监听器,用localBroadcastManager.sendBroadcast()发送广播。