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

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

本系列文章目录更多精品文章分类

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

5.3 发送自定义广播

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

5.3.1 发送标准广播

首先咱们先建立一个广播接收器,用来接收咱们发送的自定义广播。安全

用静态广播来实现markdown

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 里面写本身要发送的广播的名字就能够了
复制代码

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

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 后进行了限制,限制经过静态注册来接受隐式广播详见 其实对于部分隐式广播也是能够的好比开机广播oop

经过这个限制咱们能够获得解决办法有两种:学习

1.不经过静态注册接收器,经过动态注册就能够了this

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

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

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);
复制代码

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

本地广播是没法经过静态注册的 ,这很好理解,静态注册是为了让应用程序尚未启动就能接受广播,而发送本地广播的时候,程序确定已经启动了,所以彻底不须要静态注册了。

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

使用本地广播优点:

  • 明确的知道发送的广播不会离开咱们的应用程序,不用担忧泄漏信息。
  • 一样其余广播也没法发送到咱们程序内部,不用担忧有安全漏洞。
  • 发送本地广播比发送系统全局广播将会更加高效
相关文章
相关标签/搜索