广播机制的总结
广播发送者
- 可发送一种或多种广播
- 不关心是谁接收
- 具有实时性
广播接收者
- 可接收一种或多种广播
- 不关心是谁发送
- 具有实时性
BroadcastReceiver简介
BroadcastReceiver组件本质上是一种全局的监听器,因此它的主要作用是实现系统间不同组件之间的通讯。
例如: 通过startService启动的服务如何返回状态给Activity。
Android手机中有很多应用采用广播机制:
- 电话的接听和拨打
- 短信的接收和发送
- 电池的状态
- 系统的闹钟
- 手机连接电脑
- 手机脱离电脑 ……
***接收广播***
广播接收者
BroadcastReceiver是Android中接收广播的类。
在BroadcastReceiver中可以接收广播,并做出相应处理,不会直接显示页面,一般处理为:
- 启动Activity来显示相应内容。
- 使用NotificationManager来通知用户。
- 广播给其他应用程序。
BroadcastReceiver的生命周期:
使用步骤:
- 自定义一个类继承BroadcastReceiver,复写onReceive()方法。
- 设置BroadcastReceiver能够接收的广播类型并注册该BroadcastReceiver(静态注册/动态注册)。
- [ 添加相应权限 ]。
- 调用Context的sendBroadcast()或sendOrderedBroadcast()启动BroadcastReceiver。
// 自定义BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接收到的Intent的Action为:" + intent.getAction() + "\n消息的内容是:" + intent.getStringExtra("msg"), Toast.LENGTH_SHORT)
.show();
}
}
// 设置BroadcastReceiver能够接收的广播类型
IntentFilter filter = new IntentFilter("net.onest.lww.CUSTOM_BROADCAST");
// 注册BroadcastReceiver(动态注册方式)
MyReceiver myReceiver = new MyReceiver();
registerReceiver(myReceiver, filter);
// 发送广播
Intent intent = new Intent(
"net.onest.lww.CUSTOM_BROADCAST");
intent.putExtra("msg", "测试携带内容");
sendBroadcast(intent);
注册BroadcastReceiver的两种方式区别:
静态注册
静态注册的广播,即使Activity销毁了,仍然可以收到广播。
常驻型,也就是当应用程序关闭后,仍然会接收广播消息,程序也会被系统调用运行。一旦安装应用就注册,不可注销。(Android API26 取消大部分自定义的静态广播注册)
动态注册
动态注册的广播会受Activity的生命周期的影响, 当Activity销毁的时候,广播就失效了。
不是常驻型,可以手工注册,手工注销。
在BroadcastReceiver的onReceive()中可使用abortBroadcast()中止广播,这样其他接收同样广播的应用就不会再接收到这个广播了。
Android中的权限
- Android是一个以Linux为核心的操作系统,所以也像Linux一样拥有严格的权限管理机制。
- 一般的程序在其AndroidManifest文件中要声明其应用程序的权限,例如:打电话需要有打电话的权限,发短信要有发短信的权限。
<uses-permission android:name="android.permission.RECEIVE_SMS" />
***发送广播***
广播的类型:
普通广播:完全异步,可在同一时刻被所有接受者接收到,接受者无法将处理结果传递给下一个接受者,无法终止Broadcast的传播
有序广播:接收者按照优先级依次接收广播,优先级声明在intent-filter元素的priority属性中。广播可被终止,可以将处理结果传给下一个接收者。
- 数越大优先级别越高,最大值是2147483647
- 可以调用IntentFilter对象的setPriority()进行设置
-
//在AndroidManifest.xml文件当中进行注册 <receiver android:name="包名.广播接收者类名" > <intent-filter android:priority="广播拦截的优先级(最大:2147483647)" > <action android:name="广播监听的动作 可以是自定义的或者系统广播" /> </intent-filter> </receiver>
PS:发送广播一般是自定义广播,一般系统会限制你发送系统广播。
***思维导图***