广播-BroadcastReceiver简介

广播机制的总结

广播发送者

  • 可发送一种或多种广播
  • 不关心是谁接收
  • 具有实时性

广播接收者

  • 可接收一种或多种广播
  • 不关心是谁发送
  • 具有实时性

BroadcastReceiver简介

BroadcastReceiver组件本质上是一种全局的监听器,因此它的主要作用是实现系统间不同组件之间的通讯。

例如: 通过startService启动的服务如何返回状态给Activity。

Android手机中有很多应用采用广播机制:

  • 电话的接听和拨打
  • 短信的接收和发送
  • 电池的状态
  • 系统的闹钟
  • 手机连接电脑
  • 手机脱离电脑 ……

***接收广播***


广播接收者

BroadcastReceiver是Android中接收广播的类。

在BroadcastReceiver中可以接收广播,并做出相应处理,不会直接显示页面,一般处理为:

  • 启动Activity来显示相应内容。
  • 使用NotificationManager来通知用户。
  • 广播给其他应用程序。

BroadcastReceiver的生命周期:

使用步骤:

  1. 自定义一个类继承BroadcastReceiver,复写onReceive()方法。
  2. 设置BroadcastReceiver能够接收的广播类型并注册该BroadcastReceiver(静态注册/动态注册)。
  3. [ 添加相应权限 ]。
  4. 调用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:发送广播一般是自定义广播,一般系统会限制你发送系统广播。


***思维导图***


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值