Android BrocastRecevier广播应用

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"));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值