2020-04-22 17:06:35
本系列文章目录:更多精品文章分类
本系列持续更新中.... 初级阶段内容参考《第一行代码》
前面已经学习了如何接受广播了,下面来学习如何发送自定义广播,广播类型分为:标准广播和有序广播,下面分别来说一下这两种广播如何发送。
首先我们先创建一个广播接收器,用来接收我们发送的自定义广播。
用静态广播来实现
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 来携带一些数据。
广播是一种跨进程的通信,也就是说可以让不同的应用程序进行通信
如何发送有序广播呢?
NetChangeActivity.this.sendOrderedBroadcast(intent,null);
这样就是发送有序广播了,第二个参数是与权限有关,传入 null 就可以了
那么如何设置接收器接受的顺序呢?
<intent-filter android:priority="100">
<action android:name="com.my_broadcast.MY_BROADCAST"/>
</intent-filter>
通过 android:priority
来设置。同样接收器在接收到消息后也可以通过 abortBroadcast()
来截取广播,让后面的接收器无法再接受到这条广播。
前面我们发送和接受的广播全部属于系统全局广播,也就是说这些广播可以被系统中的其他应用程序接收到,并且我们也可以接受到来自其他任何应用的广播。这样容易引起安全问题。
为了解决这个问题,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);
其实和之前动态注册发送都是一样的,只是换了一个类来执行而已。
本地广播是无法通过静态注册的 ,这很好理解,静态注册是为了让应用程序还没有启动就能接受广播,而发送本地广播的时候,程序肯定已经启动了,因此完全不需要静态注册了。
注意这里的本地指的是当前应用程序内
使用本地广播优势:
明确的知道发送的广播不会离开我们的应用程序,不用担心泄漏信息。 同样其他广播也无法发送到我们程序内部,不用担心有安全漏洞。 发送本地广播比发送系统全局广播将会更加高效Android JsBridge源码学习
06-07
Android Studio 查看源码出现throw new RuntimeException("Stub!"); 解决办法
07-03
Android 相机开发中的尺寸和方向问题
07-10
Android按钮单击事件的五种实现方式
04-22
Android的分屏模式开发注意事项
04-08
在WIN10上使用cmd窗口命令编译Android OpenCV
03-17
ThinkPad T40 -- SSID没有广播且Windows XP自动配置无线网络的情况下,系统无法和802.11b模式的接入点(Access Point)建立通讯
04-27
系统下不停提示“正在安装新键盘,点按可选择要使用此键盘执行的操作”
07-17
EDU 7.5.x网络同传后,接收端无法再次登录到发送端的解决方案
05-15
Lenovo G550在Windows XP操作系统下触控板驱动安装方法
07-17
Linux lsmod显示已载入系统的模块命令详解
07-24
M7655DHF/M7455DNF/M7675DXF如何实现PCFAX接收和发送传真
03-19
Redhat5系统安装网卡驱动报错
07-21
T270 G5服务器liunx系统运行过程报“nautilus崩溃”错误的原因?
07-18
ThinkPad笔记本Windows 10系统下如何设置电池充电阈值
07-14
Think产品使用出厂恢复光盘恢复vista系统
07-13
Vista系统中本地连接图标丢失,如何处理?
07-13
Win7系统下如何通过添加打印机方法安装打印机驱动程序?
07-15
Windows 8 Windows 8.1如何进行系统还原
07-12
Windows 8.1系统下rasman.dll丢失导致程序无法运行的处理技巧
07-24
Tenorshare UltData for Android v6.5.2.7 免费中文版
1.7M
下载Wondershare MobileGo for Android v7.1.0 破解版
511K
下载圆点校园广播系统下载
22.75M
下载TapinRadio Pro(网络广播电台软件)v2.14.4 中便携文版
30.0M
下载everest ultimate edition(测试软硬件系统信息的工具)v5.51 免费版
6.7M
下载gghost一键恢复(系统备份还原工具)v10.03.09 中文版
14.5M
下载hwinfo32(系统信息检测工具) v7.05.4490 中文版
10.1M
下载msvcp100(系统文件)2021 免费版
133.8K
下载oa系统下载
2.7M
下载packet.dll(Windows系统文件)2021 免费版
14.7K
下载wpcap.dll(系统文件)2021 免费版
0.1MB
下载xlive(系统U盘安装软件) v1.0 官方版
21.3MB
下载龙卷风网络收音机(网络广播软件) 7.6.2017.6292 官方版
7.6M
下载aida32下载
3.37MB
下载cinebench r15下载
108.1M
下载d3d9下载
530.9K
下载ghost11下载
15.8M
下载mt4下载
3.2M
下载ntbootautofix下载
736.6K
下载proteus下载
371.9MB
下载