使用广播-BroadcastReceiver最详细解析

标题图

  • 女孩:BroadcastReceiver是什么呀?
  • 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和广播接收器是Android中需要了解的,那么怎么样去了解呢~

广播,大家应该可以理解,我们在学校做眼保健操时,就有个广播,告诉我们要做眼保健操了。广播传递信息告诉我们要做什么,通知信息或传递数据等。广播接收器是用来接收来自系统和应用的广播。

在Android中提供了两种主要的类型广播:标准广播和有序广播。

什么是广播呢?在手机的消息提示框,对话框或通知的形式告诉我们,如我们手机没电了,会弹出提示,接收短信弹出提示等。而Broadcast Receiver为广播接收器,是接收广播的组件。

  • 女孩:那么哥,什么是普通广播和有序广播?
  • 男孩:额,在这里你要了解一下普通广播和有序广播,主要讲一下。~

普通广播:

Normal broadcasts,是一种完全异步执行的广播,当广播发出后,几乎所有广播接收器都会在同一时间收到这条广播。如下图:

图片

这相当于有人在广播室里,播放做眼保健操的信息,一同发出到每个教室一样,没有先后顺序之分,对于普通广播是无法终止广播的传播,一旦发送,无法截断其中一条,几乎被所有接受者收到,而我们做眼保健操的就是接受者了。对于普通广播,在Android中使用Context.sendBroadcast()方法来发送。

有序广播:

有序广播,Ordered broadcasts,是一种同步执行的广播,广播发出后,只会有一个广播接收器能接收到广播消息,当这个广播接收器接收到后,广播才会继承传递,对于有序广播有了先后顺序,在Android中提供了优先级的属性(priority)来控制先后,有序广播中可以截断广播,不被下一个广播接收器接收,这是有序广播的特点。

图片

在这里你了解了普通广播和有序广播的原理,这两种其实就是广播的接收的不同表现形式而已。

BroadcastReceiver的实现:

到头来还是要了解BroadcastReceiver的实现,接下来我列出主要的内容目录,对于广播接收器是我们要掌握的,是Android中重要的四大组件之一。

BroadcastReceiver.png

接收系统广播

你或许会问一下什么又是系统广播,对于掌握手机概念的,应用懂得系统,如:电池电量低,发送系统广播消息;安装新应用,广播安装信息等。

广播注册分动态和静态两种:

动态注册,需要继承BroadcastReceiver的,并重写onCreate()方法,和onReceive()方法,在onReceive()方法中,要实例接收器和IntentFilter实例。接着继续重写onDestroy()方法,加入unregisterReceiver()方法来实现取消注册。

在动态注册的广播接收器中最后一定要取消注册。

简化:

重写onCreate()
重写onDestroy()
extends BroadcastReceiver
重写onReceive()

静态注册,只要在配置文件中修改代码即可,在AndroidManifest.xml文件中:

<receiver android:name=包名.类名>
<intent-filter>
 <action android:name="发送的广播"
</intent-filter>
</receiver>

这里补充说一个自定义的广播接受者

步骤:同样

  1. 继承BroadcastReceiver基类
  2. 复写抽象方法onReceive()方法

以上为发送普通广播的实现形式,那么你还记得一个有序广播吗?对于有序广播的形式很简单,也是和普通广播一样实现。只在发送有差异而已。

有序广播和普通广播差异:只要修改普通广播中sendBroadcast()方法,改成sendOrderedBroadcast()方法即可,你会觉得难记吗?

广播接收器(Broadcast Reveiver)
标准广播(Normal broadcasts)
有序广播(Ordered broadcasts)

这里说一下,我把标准广播说错成标准广播了,其实这里标准和普通随意叫吧,不过为了显示技术牛逼,在外人前尽量说标准广播吧。ok?

使用本地广播:

什么又是本地广播呢?你会问道,本地广播是Android引入的一套机制,为本地广播机制,使用本地广播机制,有很多优点:

  1. 不用但系机密数据被泄漏;
  2. 不用担心安全漏洞的隐患;
  3. 更加高效。

在介绍本地广播之前,前面讲的广播室一种全局的,属于系统全局广播,广播室一个全局的监听器,在Android中,我们要知道广播有两种说法:广播发送者和广播接收者。

在本地广播重点说明:本地广播没有静态注册的方式,静态注册是为了程序在未启动前也能收到广播,而发送本地广播时,我们的程序是已开启了的。

  • 女孩:哥,讲的差不多了,已经掌握了,不过可以写一些代码例子吗?
  • 男孩:嗯,可以,掌握就牛逼了~

代码示例:

// 继承BroadcastReceivre基类
public class MyBroadcastReceiver extends BroadcastReceiver {

 // 复写onReceive()方法
 @Override
 public void onReceive(Context context, Intent intent) {
  //写入接收广播后的操作
 }
}

示例动态注册:

 private IntentFilter intentFilter;
 private MyReceiver myReceiver;

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  intentFilter = new IntentFilter();
  intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
  myReceiver = new MyReceiver();
  registerReceiver(myReceiver, intentFilter);
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();

  unregisterReceiver(myReceiver);
  
 }

示例静态注册:

<receiver android:name=".包名" >
  <intent-filter>
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>

最后都要加权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

发送自定义广播:

Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要发送的广播值
sendBroadcast(intent);

发送有序广播:

//sendOrderedBroadcast()方法
Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要发送的广播值
sendOrderBroadcast(intent,null);
<intent-filter android:priority="100">
...
</intent-filter>
//优先级

abortBroadcast();
//截断

本地广播:

localBroadcastManager = LocalBroadcastManager.getInstance(this);
//获取实例

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.....");
myReceriver = new MyReceriver();
localBroadcastManager.registerReceiver(myReceriver, intentFilter);

Intent intent = new Intent("com...");
localBroadcastManager.sendBroadcast(intent);
//发送本地广播

localBroadcastManager.unregisterReceiver(myReceiver);

总结

有关内容就到这里了,本篇介绍了四大组件中的广播组件的知识点。

 送心

posted @ 2018-07-31 06:20 达达前端小酒馆 阅读(...) 评论(...) 编辑 收藏