亲宝软件园·资讯

展开

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

sydMobile 人气:1
### 从0系统学Android--52 发送广播 ![](https://user-gold-cdn.xitu.io/2019/11/13/16e63adec6819e45?w=1741&h=1541&f=png&s=301835) ![](https://user-gold-cdn.xitu.io/2019/11/13/16e63adabc8b9d2c?w=1132&h=208&f=png&s=49714) **本系列文章目录**:[更多精品文章分类](https://mp.weixin.qq.com/s/B8DP0UMg1fup2_sJVtgjMw) **本系列持续更新中....** 初级阶段内容参考《第一行代码》 ### 5.3 发送自定义广播 前面已经学习了如何接受广播了,下面来学习如何发送自定义广播,广播类型分为:标准广播和有序广播,下面分别来说一下这两种广播如何发送。 #### 5.3.1 发送标准广播 首先我们先创建一个广播接收器,用来接收我们发送的自定义广播。 用静态广播来实现 ```java public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"接收到了",Toast.LENGTH_SHORT).show(); } } 这里 action 里面写自己要发送的广播的名字就可以了 ``` 随便在一个页面添加发送代码: ```java 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 后进行了限制,限制通过静态注册来接受隐式广播[详见](https://blog.csdn.net/thezprogram/articlehttps://img.qb5200.com/download-x/details/83341501)。** 其实对于部分隐式广播也是可以的比如开机广播 通过这个限制我们可以得到解决办法有两种: 1.不通过静态注册接收器,通过动态注册就可以了 2.通过静态注册接收器,但是发送的广播不要是隐式的。 第一种很简单,就是动态注册,这里不演示了,演示第二种: ```java 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 发送有序广播 **广播是一种跨进程的通信,也就是说可以让不同的应用程序进行通信** 如何发送有序广播呢? ```java NetChangeActivity.this.sendOrderedBroadcast(intent,null); ``` 这样就是发送有序广播了,第二个参数是与权限有关,传入 null 就可以了 那么如何设置接收器接受的顺序呢? ```java ``` 通过 `android:priority` 来设置。同样接收器在接收到消息后也可以通过 `abortBroadcast()` 来截取广播,让后面的接收器无法再接受到这条广播。 ### 5.4 使用本地广播 前面我们发送和接受的广播全部属于系统全局广播,也就是说这些广播可以被系统中的其他应用程序接收到,并且我们也可以接受到来自其他任何应用的广播。这样容易引起安全问题。 为了解决这个问题,Android 引入了一套本地广播机制,使用这个机制广播只能够在程序内部进行传递。其实实现很简单就是通过 `LocalBroadcastManager` 来对广播进行管理。 下面我们就来列几个方法就可以了 ```java 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); ``` 其实和之前动态注册发送都是一样的,只是换了一个类来执行而已。 **本地广播是无法通过静态注册的** ,这很好理解,静态注册是为了让应用程序还没有启动就能接受广播,而发送本地广播的时候,程序肯定已经启动了,因此完全不需要静态注册了。 **注意这里的本地指的是当前应用程序内** 使用本地广播优势: - 明确的知道发送的广播不会离开我们的应用程序,不用担心泄漏信息。 - 同样其他广播也无法发送到我们程序内部,不用担心有安全漏洞。 - 发送本地广播比发送系统全局广播将会更加高效

加载全部内容

相关教程
猜你喜欢
用户评论