Android BrocastRecevier广播应用
BroadcastReceiver
Broadcast直译广播,我们举个形象的例子来帮我理解下BroadcastReceiver,记得以前读书
的时候,每个班级都会有一个挂在墙上的大喇叭,用来广播一些通知,比如,开学要去搬书,广播:
“每个班级找几个同学教务处拿书”,发出这个广播后,所有同学都会在同一时刻收到这条广播通知,
收到,但不是每个同学都会去搬书,一般去搬书的都是班里的"大力士",这群"大力士"接到这条 广播后就会动身去把书搬回可是!
——好吧,上面这个就是一个广播传递的一个很形象的例子: 大喇叭–> 发送广播 --> 所有学生都能收到广播 --> 大力士处理广播
回到我们的概念,其实BroadcastReceiver就是应用程序间的全局大喇叭,即通信的一个手段,
系统自己在很多时候都会发送广播,比如电量低或者充足,刚启动完,插入耳机,输入法改变等,
发生这些时间,系统都会发送广播,这个叫系统广播,每个APP都会收到,如果你想让你的应用在接收到
这个广播的时候做一些操作,比如:系统开机后,偷偷后台跑服务~哈哈,这个时候你只需要为你的应用
注册一个用于监视开机的BroadcastReceiver,当接收到开机广播就做写偷偷摸摸的勾当~
当然我们也可以自己发广播,比如:接到服务端推送信息,用户在别处登录,然后应该强制用户下线回到
登陆界面,并提示在别处登录当然,这些等下都会写一个简单的示例帮大家了解广播给我们带来的好处
两种广播类型
两种注册广播的方式
动态广播注册
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接收到广播", Toast.LENGTH_SHORT).show();
}
};
//在Activity的onCreate注册该广播
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
registerReceiver(receiver,new IntentFilter("com.test.xie.send"));
}
//在onDestroy中注销该广播
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
//发送广播时
sendBroadcast(new Intent("com.test.xie.send"));
点击发送广播后
静态注册广播
在android 8.0以后,手机已经不能再接收隐式广播。所以在静态注册广播时,我们需要显示的去设置需要发送的广播。个人建议,尽量去使用动态注册的广播。如果业务需要,那就需要具体问题具体分析了。
本地广播与全局广播
上面写的广播都是全局广播!这同样意味着我们APP发出的广播,其他APP都会接收到, 或者其他APP发送的广播,我们的APP也同样会接收到,这样容易引起一些安全性的问题!而 Android中给我们提供了本地广播的机制,使用该机制发出的广播只会在APP内部传播,而且 广播接收者也只能收到本应用发出的广播!
上面的代码完全不变,在应用1中注册发送了一个广播
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接收到广播", Toast.LENGTH_SHORT).show();
}
};
//在Activity的onCreate注册该广播
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
registerReceiver(receiver,new IntentFilter("com.test.xie.send"));
}
//在onDestroy中注销该广播
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
//发送广播时
sendBroadcast(new Intent("com.test.xie.send"));
然后新创建一个应用2
public class MainActivity extends AppCompatActivity {
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"别的应用收到广播",Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver(receiver,new IntentFilter("com.test.xie.send"));
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
这个时候先启动应用2,再启动应用1,我们会发现。在应用1里面发送的广播,应用2也收到了。
个人感觉,这个确实存在很大的安全隐患,别人只要知道你广播的action,就能随时的接收你应用内传的数据了,所以这里这里建议最好用本地广播LocalBroadcastManager来管理
本地广播管理LocalBroadcastManager
核心用法:
PS:本地广播无法通过静态注册方式来接受,相比起系统全局广播更加高效
注意事项:
本地广播调用示例:
说白了,就是在全局广播前套一层localBroadcastManager,不管是注册广播,注销广播,还是发送广播。这样处理后就是本地广播了,别的应用也不会再接收到我们的广播了。
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(receiver,new IntentFilter("com.test.xie.send"));
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(receiver);
}
//发送广播
localBroadcastManager.sendBroadcast(new Intent("com.test.xie.send"));