Android中Broadcast简介与使用

  • Broadcast与Broadcast Receiver的分类
    • Broadcast分类
    • Broadcast Receiver的分类
  • 动态与静态广播接收器注册
    • 两者的区别
    • 动态广播接收器的注册
    • 静态广播接收器的注册
  • 标准广播和有序广播
    • 标准广播
    • 有序广播
  • 本地广播的实现

Broadcast与Broadcast Receiver的分类

Broadcast分类

广播按照传播方式分为两类,不解释,先上图

Broadcast Receiver的分类

广播虽然传播了出来,但是没有相应的接收器,发了也是白发,而接收器也是分类的,按照注册方式分类,继续上图

动态与静态广播接收器注册

两者的区别

1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低>
2.动态注册广播不是 常驻型广播 ,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。静态注册是常驻型 ,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
3.在同一个优先级下,谁先启动的快,谁将先接收到广播.

动态广播接收器的注册

安卓在执行一些操作,比如开机,关机,或者连接网络,断开网络时,会发送一些系统广播,这些广播是可以被接收到的。
我们以接受网络变化的广播为例,网络如果连接,则发出一条Toast。已知信息:在网络连接发生变化时,安卓系统会发出一条“android.net.conn.CONNECTIVITY_CHANGE”的广播
1:在xml里添加权限:

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

2:写一个网络监听接收器类,继承自原有的广播接收器,并重写onReceive方法,因为当接收到广播时,这个方法就会被调用,用于告知我们网络是否发生变化,

class NetworkChangeReceiver extends BroadcastReceiver {             @Override        public void onReceive(Context context, Intent intent) {                  Toast.makeText(context,"network change",Toast.LENGTH_SHORT).show();        }    }

3:在onCreate()中创建一个IntentFilter实例,并添加广播信息,添加这个信息目的是为了第三步注册广播。

intentFilter = new IntentFilter();intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

4,声明一个实例,注册 广播接收器,并取消注册 广播接收器

 private NetworkChangeReceiver networkChangeReceiver;//声明
 networkChangeReceiver = new NetworkChangeReceiver();registerReceiver(networkChangeReceiver, intentFilter);//注册广播接收器,这两行代码在第二步后面
 @Override    protected void onDestroy() {             super.onDestroy();        unregisterReceiver(networkChangeReceiver);    }

注意:这里的取消注册 广播接收器 是写在onDestroy()内的,原因是,这是动态注册,只有在程序开启时才能使用,但我们的目的是为了检测网络的变化,需要切换程序,因此写在onDestroy()内,onDestroy()只有按下back键才会调用,因此我们直接按下home键,进入setting -> Data usage->关闭Cellular或者打开Cellular会出现Toast提醒。

静态广播接收器的注册

静态广播接收器的注册相对来说更为简单,我们还是以监听网络变化广播为例
1:在xml里添加权限:

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

2:New-other-Broadcast Receiver 如下图(全部勾选)

3:在xml内注册添加相应的action

  <receiver            android:name=".NetworkchangeReceiver"            android:enabled="true"            android:exported="true">            <intent-filter>                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />            </intent-filter>        </receiver>

4:在NetworkchangeReceiver中修改

public class NetworkchangeReceiver extends BroadcastReceiver {     @Overridepublic void onReceive(Context context, Intent intent) {             Toast.makeText(context,"network change now",Toast.LENGTH_LONG).show();        }}

好的,理论上来说上面的代码虽然简单,但是你应该了解了静态注册的基本过程。然后我要说的是,这个例子是无法达到效果的,你是无法接收到Toast消息的,为什么呢,因为我后来发现在Android7.0 上为了优化后台省电相关的东西,已经将静态注册这个广播方式取消了,7.0 版本上静态注册此广播的,已经无法收到这个广播了,Android 7.0 为了后台优化,推荐使JobScheduler 代替 BroadcastReceiver 来监听,具体的我就不详解了,跑题了。你可以参考Android 7.0 网络变化监听

标准广播和有序广播

标准广播

标准广播一般通过Intent来实现,代码极其简单,当然前提你需要写一个广播接收器,不然发出了广播也没用。如下图所示,我们就发送了一条"com.example.broadcasttest.LOCAL_BROADCAST"的广播

Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");                 sendBroadcast(intent);//标准广播

有序广播

有序广播与标准广播类似

ntent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");                sendOrderedBroadcast(intent, null);//发送有序广播,第二个参数一般为null

不过既然是有序广播,那接受这条广播的顺序,就有讲究了,我们可以通过android:priority来设置谁先接收这条广播,例如下列静态注册的 intent filter 内添加了这个优先级,优先级越高,接收有序广播的顺序越前。

<intent-filter android:priority="100">//设置优先级                <action android:name="com.example.broadcasttest.MY_BROADCAST" />            </intent-filter>

截断广播,有序广播的另一个优点就是能被截断,可以在当前接收这条广播的接收器onReceive()内完成这项操作。

 abortBroadcast();//截断

本地广播的实现

本地广播的意思就是说在应用内发起广播,且不会传到其他应用,自产自销。它的优势十分明显,高效,安全,而且实现起来简单。
1:写一个本地广播接收器,并注册,这里使用动态注册(因为之前讲过,就不加以详解),没有必要静态注册,因为这是应用内部的广播,启动后接收就可以。

 class LocalReceiver extends BroadcastReceiver {     //本地广播接收器        @Override        public void onReceive(Context context, Intent intent) {                 Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();        }    }
 private LocalReceiver localReceiver;
intentFilter = new IntentFilter();     、intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();        localBroadcastManager.registerReceiver(localReceiver, intentFilter);

记得取消注册,如下

 @Override    protected void onDestroy() {             super.onDestroy();      localBroadcastManager.unregisterReceiver(localReceiver);    }

2:利用LocalBroadcastManager对广播进行管理

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

3:发送广播

 Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");                 sendBroadcast(intent);//自定义广播                 localBroadcastManager.sendBroadcast(intent);//发送本地广播

总结:所谓本地广播,无论是发送还是接收,其实都是通过LocalBroadcastManager来管理的

写代码时的智障操作:在xml中加入中文注释不曾想导致mainifests文件丢失。

更多相关文章

  1. Android(安卓)应用程序开发基础
  2. Android——Tomcat+MySQL+Servlet,实现将Client传入的数据写入MyS
  3. Android(安卓)基础总结:(七)BroadcastReceiver详解(上)
  4. [原]Android应用程序注册广播接收器(registerReceiver)的过程分析
  5. 通过广播Intent控制Android系统自带的音乐播放器
  6. android:注册时的协议---》方法一:弹出框
  7. android 禁用解锁
  8. [Android] Android(安卓)监听WIFI
  9. Android实现开机自启动Service

随机推荐

  1. Android源码分析-消息队列和Looper
  2. android之PopUpWindow显示Listview(文件列
  3. android使用webview加载网页
  4. category
  5. Android anr异常测试
  6. Customize "share picture via" menu on
  7. 获取Android唯一设备号
  8. singleLine属性
  9. Android圆角图片封装类
  10. Android Material Design 实践(三)--Mate