发布时间: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);
其实和之前动态注册发送都是一样的,只是换了一个类来执行而已。
本地广播是无法通过静态注册的 ,这很好理解,静态注册是为了让应用程序还没有启动就能接受广播,而发送本地广播的时候,程序肯定已经启动了,因此完全不需要静态注册了。
注意这里的本地指的是当前应用程序内
使用本地广播优势:
明确的知道发送的广播不会离开我们的应用程序,不用担心泄漏信息。 同样其他广播也无法发送到我们程序内部,不用担心有安全漏洞。 发送本地广播比发送系统全局广播将会更加高效Tenorshare UltData for Android v6.5.2.7 免费中文版
1.7M
圆点校园广播系统下载
22.75M
TapinRadio Pro(网络广播电台软件)v2.14.4 中便携文版
30.0M
cinebench r15(电脑系统测试软件)v15.0.3.7 绿色版
108.1M
d3d9(系统文件)2021 绿色版
530.9K
everest ultimate edition(测试软硬件系统信息的工具)v5.51 免费版
6.7M
mt4(多帐户云跟单管理系统)v4.0 免费版
3.2M
ntbootautofix(多系统修复软件)v2.5.7 免费版
736.6K
oa系统(办公系统)v2.2.5 官方版
2.7M
packet.dll(Windows系统文件)2021 免费版
14.7K
xlive(系统U盘安装软件) v1.0 官方版
21.3MB
龙卷风网络收音机(网络广播软件) 7.6.2017.6292 官方版
7.6M
Wondershare MobileGo下载
511K
aida32下载
3.37MB
gghost一键恢复下载
14.5M
ghost11下载
15.8M
hwinfo32下载
10.1M
msvcp100下载
133.8K
proteus下载
371.9MB
wpcap.dll下载
0.1MB
2020-07-19
启动报错Error 1962的原因分析及解决方法
关于使用外接USB设备时系统蓝屏报错问题相关说明
无线网卡无法开启N模式
nginx 全局变量
GitHub是如何无缝迁移到Kubernetes的?
Centos 7 JDK、Tomcat9 安装并配置
系统拯救2.0及一键恢复5.0/1使用方法图解
如何在CentOS 7上安装Nginx
正确的记录日志