欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

从0系统学Android--5.2 发送广播

程序员文章站 2022-06-25 08:40:31
从0系统学Android 52 发送广播 本系列文章目录 : "更多精品文章分类" 本系列持续更新中.... 初级阶段内容参考《第一行代码》 5.3 发送自定义广播 前面已经学习了如何接受广播了,下面来学习如何发送自定义广播,广播类型分为:标准广播和有序广播,下面分别来说一下这两种广播如何发送。 5 ......

从0系统学android--52 发送广播

从0系统学Android--5.2 发送广播

从0系统学Android--5.2 发送广播
本系列文章目录更多精品文章分类

本系列持续更新中.... 初级阶段内容参考《第一行代码》

5.3 发送自定义广播

前面已经学习了如何接受广播了,下面来学习如何发送自定义广播,广播类型分为:标准广播和有序广播,下面分别来说一下这两种广播如何发送。

5.3.1 发送标准广播

首先我们先创建一个广播接收器,用来接收我们发送的自定义广播。

用静态广播来实现

public class myreceiver extends broadcastreceiver {

    @override
    public void onreceive(context context, intent intent) {
        toast.maketext(context,"接收到了",toast.length_short).show();
    }
}

   <receiver
            android:name="com.example.firstcode.fifty_chapter.norboardcast.myreceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="no">
            <intent-filter>
                <action android:name="com.my_broadcast"/>
            </intent-filter>
        </receiver>
                  
这里 action 里面写自己要发送的广播的名字就可以了

随便在一个页面添加发送代码:

      buttonsend.setonclicklistener(new view.onclicklistener() {
            @override
            public void onclick(view v) {
                intent intent = new intent("com.my_broadcast");
                sendbroadcast(intent);

            }
        });

需要注意一点,上面的这种做法在 android 8.0前是好用的,在 8.0 后进行了限制,限制通过静态注册来接受隐式广播。 其实对于部分隐式广播也是可以的比如开机广播

通过这个限制我们可以得到解决办法有两种:

1.不通过静态注册接收器,通过动态注册就可以了

2.通过静态注册接收器,但是发送的广播不要是隐式的。

第一种很简单,就是动态注册,这里不演示了,演示第二种:

 buttonsend.setonclicklistener(new view.onclicklistener() {
            @override
            public void onclick(view v) {
                intent intent = new intent("com.my_broadcast");
                // 明确指明要此广播要发送给的组件
                intent.setcomponent(new componentname(netchangeactivity.this, myreceiver.class));
                netchangeactivity.this.sendbroadcast(intent);
           

            }
        });

由于广播是通过 intent 来进行传递的因此我们可以通过 intent 来携带一些数据。

5.3.2 发送有序广播

广播是一种跨进程的通信,也就是说可以让不同的应用程序进行通信

如何发送有序广播呢?

 netchangeactivity.this.sendorderedbroadcast(intent,null);

这样就是发送有序广播了,第二个参数是与权限有关,传入 null 就可以了

那么如何设置接收器接受的顺序呢?

  <intent-filter android:priority="100">
                <action android:name="com.my_broadcast.my_broadcast"/>
            </intent-filter>

通过 android:priority 来设置。同样接收器在接收到消息后也可以通过 abortbroadcast() 来截取广播,让后面的接收器无法再接受到这条广播。

5.4 使用本地广播

前面我们发送和接受的广播全部属于系统全局广播,也就是说这些广播可以被系统中的其他应用程序接收到,并且我们也可以接受到来自其他任何应用的广播。这样容易引起安全问题。

为了解决这个问题,android 引入了一套本地广播机制,使用这个机制广播只能够在程序内部进行传递。其实实现很简单就是通过 localbroadcastmanager 来对广播进行管理。

下面我们就来列几个方法就可以了

localbroadcastmanager localbroadcastmanager = localbroadcastmanager.getinstance(this)// 获取实例
// 发送广播的时候
intent intent = new intent("com.broadcst.syd");
localbroadcastmanager.senbroadcast(intent);

// 注册广播接收器
intentfilter intentfilter = new intentfilter();
intentfilter.addaction("com.broadcst.syd");
localbroadcastmanager.registerreceiver(localreceiver,intentfilter);

// 取消注册
localbroadcastmanager.unregisterreceiver(localreceiver);

其实和之前动态注册发送都是一样的,只是换了一个类来执行而已。

本地广播是无法通过静态注册的 ,这很好理解,静态注册是为了让应用程序还没有启动就能接受广播,而发送本地广播的时候,程序肯定已经启动了,因此完全不需要静态注册了。

注意这里的本地指的是当前应用程序内

使用本地广播优势:

  • 明确的知道发送的广播不会离开我们的应用程序,不用担心泄漏信息。
  • 同样其他广播也无法发送到我们程序内部,不用担心有安全漏洞。
  • 发送本地广播比发送系统全局广播将会更加高效