一、知识点准备
LocalBroadcastManager类,该类用来注册和发送本地广播,所谓本地广播就是指在同一个process中运行的app,一般一个应用就是一个app,所以一般情况下你就认为其只是在同一个app中发送和接受的广播。要注意的是,广播接收着的onReceive是运行在主线程中的,所以不能在其中处理耗时的操作。本地广播只能通过动态的方式注册,如果使用静态注册是无法接收到广播的。LocalBroadcastManger的原理是把注册的广播接受者和其过滤器都存在一个map集合中,当接收到广播,也就是调用其sendBroadCast方法的时候,再遍历集合,从中找到匹配的接受者然后调用接受者的onReceive方法。这里有一个问题就是如果不是同一个实例那么就无法保证正常的运行,所以查看其没有发现其使用的是懒汉式的单例设计模式。其主要方法有下面几个:registerReceiver、unregisterReceiver、sendBroadcast、sendBroadcastSync,观察名字就知道是干嘛的,最后一个方法只是发送了一个同步的广播,也就是说要等广播接受者处理完intent才能往下执行。获取LocalBroadcast实例的方式是调用其getInstance方法,观察这个名字你就知道其为单例啦。
二、示例代码演示
我们在布局文件中有3个按钮,效果图如下:
ok,3个按钮的点击事件我们在布局文件中通过onClick指定,然后我们看下activity中的代码:
public class MainActivity extends AppCompatActivity {
private LocalBroadcastManager localBroadcastManager;
private MyBroadCastReceiver broadCastReceiver;
public static final String BRAODCASTACTION = "com.xinxue.LOCALBROADCAST";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
broadCastReceiver = new MyBroadCastReceiver();
}
public void registerBroadCast(View view) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BRAODCASTACTION);
localBroadcastManager.registerReceiver(broadCastReceiver, intentFilter);
}
public void unRegisterBroadCast(View view) {
localBroadcastManager.unregisterReceiver(broadCastReceiver);
}
public void send(View view) {
localBroadcastManager.sendBroadcast(new Intent(BRAODCASTACTION));
}
}
扫描关注我的微信公众号: