Android 广播(接收,发送,标准,有序,全局,本地,实战,填坑)
前言
写完了,人也麻了,本来想着挺好李姐的东西,咋能写这么长一串,确实,难顶。写的还挺仔细的。
一、广播是什么?
通俗点李姐,广播就是安卓系统本身发出的声音,我们可以通过安卓提供给我们的一系列内容来接收和发出广播,以此来简单快捷地实现一些功能。
二、广播分类
1.标准广播
标准广播是完全异步执行(异步同步详情见百度,概念很好李姐)同时不可被截断,也就是说当前发出的一号广播,会被ABC三个接收器同时接收到。如下图
2.有序广播
顾名思义,一种有序的,同步的广播,它是按照次序来传递,先被优先级高的接收器接收到,响应完成后再传递给接收器B然后C,同时可以进行截断,比如在A处截断,后续B和C就无法接收到广播。如下图
三、广播的使用(接收器)
上面介绍了广播的基本信息,接下来进行一些广播的简单使用。
1.广播的注册
使用广播我们首先要进行广播的注册,注册广播有两种方式,动态注册和静态注册。动态注册的优点是可以实现灵活的广播注册和注销,但缺点就是必须要程序启动后才能接收到广播。如果想要在程序未启动时,比如刚开机的情况下接受到系统的开机广播,那就需要使用静态注册,但静态注册长期监听,消耗更多资源,因此大部分情况建议优先使用动态注册解决问题。
1.1动态注册实例
广播动态注册需要我们在代码中进行注册,首先写一个广播接收器,继承自BroadcastReceiver类
public class myReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//事务处理代码
//在这里写上相关的处理代码,一般来说,不要此添加过多的逻辑或者是进行任何的耗时操作
//因为广播接收器中是不允许开启多线程的,过久的操作就会出现报错
//因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动某个服务
String action = intent.getAction();
if (Intent.ACTION_SCREEN_OFF.equals(action)) {
//屏幕关闭
Log.d(TAG, "屏幕关闭");
} else if (Intent.ACTION_SCREEN_ON.equals(action)) {
Log.d(TAG, "屏幕打开");
}
}
}
这里我们实现的广播功能是监听屏幕的亮起和关闭。上面这片代码整体结构很容易理解,定义一个action作为接收到的广播信息,同时屏幕亮起和关闭的相关广播内容是安卓自带的,直接使用就行。
逻辑部分就更容易理解了,equals方法判断打印。
到此是我们接收器中写的东西。接下来看主活动中要做什么。
首先第一步,将接收器实例化,这个用牛牛想都知道要做这个,然后,广播对吧,要设置频道,然后完成对广播的注册,在使用完广播后,要对广播进行注销。一步一步来,首先实例化接收器:
// 创建接收器
myreceiver = new myReceiver();
ps:将其设置为全局变量,便于注册和注销。
然后,
// 意图过滤器
intentFilter = new IntentFilter();
// 添加要监听的广播action
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
/* 这个意图过滤器先李姐成标准流程就行 */。
这里意图过滤器简单点解释就是选择你想要监听的广播,因为系统中广播的使用是非常频繁的,而我们某一个广播接收器其实只处理某一个或者某几个广播,而过滤的内容其实就是这个功能,上述我们addAction加入的就是屏幕亮起和熄灭的广播内容。
注册广播接收器
// 注册广播接收器
registerReceiver(myreceiver,intentFilter);
注意,到这还没完,还有最后一步,广播的注销。什么时候注销?不需要用到的时候,在这里咱们直接搞成活动销毁的时候,当个栗子直接用。
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册 注销
unregisterReceiver(myreceiver);
}
这玩意应该还比较眼熟吧。销毁活动的方法,我们重写一下,别忘了把它本来的东西放进去。
到这完工,测试一下效果。
1.2 静态注册实例
首先还是,接收器先搞一个。
public class bReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"芜湖",Toast.LENGTH_LONG).show();
}
}
然后就到了和动态注册有区别的地方,静态注册是在AndroidMainfest.xml文件中注册,打开AndroidMainfest.xml文件,我们需要添加如下内容
<receiver
android:name=".broadcastreceiver.aReceiver"
android:enabled="true"
android:exported="true">
</receiver>
enable这个属性是设置是否启用这个广播接收器,exported这个属性是设置是否允许这个接收器接收到本程序以外的广播(这个涉及到全局广播和局部广播相关内容,咱们等会再讲)。
然后再为其添加:
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
对比动态添加,这个就是action。广播内容也是由系统发出,我们只管接收。
全部内容如下:
<receiver
android:name=".broadcastreceiver.aReceiver"
android:enabled="true"
android:exported="true">
<intent