一、 广播注册
区别:
动态注册在活动中添加一个内部类继承自BroadcaseReceiver。
静态注册新建一个类继承自BroadcastReceiver并且在AndroidManifest.XML文件中添加标签。
1.1 动态注册
动态监听网络变化
public class MainActivity extends AppCompatActivity{
private TestReceiver mTestReceiver;
@Override
protected void onCreate(Bundle savedInstaceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建一个过滤器来获取需要监听的内容
IntentFilter filter = new IntentFilter();
filter.addAction("");
//action不一定非要系统定义的aciton,也可以自己创建
//在onCreate内部有了一个内部类必须通过new 才能获取,而由于TestReceiver继承自BroadcastReceiver,父类有一个默认的无参构造来为其创建
mTestReceiver = new TestReceiver();
regiseter(mTestReceiver, filter);
}
@Override
protected void onDestroy(){
unregister(mTestReceiver);
super.onDestroy();
}
//监听网络变化
class TestReceiver extends BroadCastReceiver{
@Override
public void onReceived(Context context, Intent intent){
//网络变化需要由系统服务监听,因此需要有一个系统服务类ConnectivityManager,专门用于管理网络连接
//通过网络变化管理器来获取网络信息,网络变化的监听需要获取权限
//在对网络信息进行处理
ConnectivityManager connectivity = getSystemService(Context.CONNECTIVITY_SERVICE);
Network networkInfo = connectivityManager.getActiveNetwork();
if (networkInfo != null) {
//
} else {
//
}
}
}
}
1.2静态注册
与动态注册的区别:可以发现在动态监听过程中,
1、需要通过IntentFilter 来获取需要监听的内容,在通过register注册广播,
2、在Acitivity内部创建内部类从而实现动态监听。
而静态注册,则是将这个过程转换:
IntentFilter放在于AndroidManifest.XML文件中的标签中获取,为了安全起见,一般exported是设为false。
创建内部类的过程则是新建一个java类并继承BroadcastReciver,并重写onReceive从而实现静态注册。
通过AS快捷方式创建一个BroadcastReceive。
public class TestReceiver extends BroadCastReceiver{
//监听网络变化
@Override
public void onReceived(Context context, Intent intent){
//网络变化需要由系统服务监听,因此需要有一个系统服务类ConnectivityManager,专门用于管理网络连接
//通过网络变化管理器来获取网络信息,网络变化的监听需要获取权限
//在对网络信息进行处理
ConnectivityManager connectivity = getSystemService(Context.CONNECTIVITY_SERVICE);
Network networkInfo = connectivityManager.getActiveNetwork();
if (networkInfo != null) {
//
} else {
//
}
}
}
在你需要调用广播的活动中,你需要
public class MainActivity extends AppCompatActivity{
private Button mBtnSendBroadcast;
@Override
protected void onCreate(Bundle savedInstaceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//若需要手动点击发送广播
mBtnSendBroadcast = findViewById(R.id.button);
mBtnSendBroadcast.setOnclickListener(new View.OnclickListener){
@Override
public void onClick(View v){
Intent intent = new Intent("");
sendBroadcast(intent);
}
}
}
}
并且使用静态注册还可以实现开机启动,监听系统开机广播也是需要权限android.permission.RECEIVE_BOOT_COMPLETED。
注意:
不要在onReceive()方法中添加过多的逻辑或者任何耗时操作,因为广播接收器是不允许开启线程。广播接收器更多的是扮演一种 打开程序其他组件的角色,比如创建以条状态栏通知,或者启动一个服务等。
二、 自定义广播
自定义广播其实在前文已经有讲过了,在动态注册是我们通常会通过IntentFilter 来获取我们需要的action,从而实现动态注册,事实上,actionn并不一定非要是系统定义的action(使用系统定义的则是相应行为发生改变时,获取系统的行为并监听),当然,我们也可以自定义(如com.test.receiver),除了这个改变之外,其实自定义广播和标准广播的动态注册过程无任何差异。
三、有序广播
有序广播的发送则是在自定义广播的基础上发送方式发生了改变,即sendBroadcast(intent)改为了sendOrderedBroadcast(intent,null),其中这个函数中第二个参数则是于权限相关的字符串。并且设置了priority优先级。
因此在发送广播时,由于接收了同一个action,但是由于设置了不同的优先级,所以会出现有序的状态。从而得到了有序广播。
四、本地广播
前面发送的均是系统全局广播,即发出的广播可以背其他任何应用程序接收到,并且可以接收来自于其他任何应用的广播,这样很容易引起安全问题,如当发送一些携带关键性数据的广播可能会被其他应用程序截取,或者其他应用程序向我们发送垃圾广播。
而本地广播值能够在应用程序内部进行传递,并且广播只能接收来自本应用程序发出的广播,这样就解决了安全问题。
本地广播使用了一个LocalBroadcastManager来对广播进行管理,并提供了广播注册与发送的方法。
public class MainActivity extends AppCompatActivity{
private TestReceiver mTestReceiver;
private TestReceiver mTestReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstaceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnSendBroadcast = findViewById(R.id.button);
mTestReceiver = new TestReceiver();
//LocalBroadcastManager的getInstance获取一个实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
mBtnSendBroadcast.setOnclickListener(new View.OnclickListener){
@Override
public void onClick(View v){
Intent intent = new Intent("");
localBroadcastManager.sendBroadcast(intent);
}
}
IntentFilter filter = new IntentFilter();
filter.addAction("");
mTestReceiver = new TestReceiver();
localBroadcastManager.regiseter(mTestReceiver, filter);
}
@Override
protected void onDestroy(){
localBroadcastManager.unregister(mTestReceiver);
super.onDestroy();
}
class TestReceiver extends BroadCastReceiver{
@Override
public void onReceived(Context context, Intent intent){
}
}
}
广播的内容大致分为以上几种,在实际开发中,通常动态注册使用的比较多,通常利用广播的动态注册来动态监听某一个状态的变化,因此灵活使用动态监听至关重要。