在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的。Android提供了一整套完整的API,允许应用程序自由地发送和接收广播。发送广播就是借助之前了解过的Intent,接收广播则需要用到广播接收器(Broadcast Receiver)。.

1、广播的类型

  • 标准广播:Normal broadcast,是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此他们之间没有任何先后顺序可言。这种广播效率比较高,同时也意味着无法被截断
  • 有序广播:Ordered broadcast,是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有顺序的,优先级高的广播接收器可以先接受到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

2、广播接收器的使用方法

  Android系统内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。例如,手机开机完成后会发出一条广播消息,电池的电量发生变化时会发出一条广播,时间或时区发生改变时也会发出一条广播等等;我们如果想要接收到这些广播,则需要用到广播接收器。

  创建广播接收器的方法很简单,我们只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑可以在这个方法中进行处理。

3、广播接收器的注册

  广播接收器可以自由地对自己感兴趣的广播进行注册,这样才能在有相应的广播发出时,广播接收器就能够收到该广播,并在内部进行相应的逻辑处理。注册广播的方式有两种:

  1. 在代码内注册:也称动态注册。这种注册方法一般过程是
    1. 在Activity中创建一个IntentFilter的对象,然后用IntentFilter对象的addAction()方法添加相应的广播类型
    2. 我们还需要有一个我们自定义的广播接收器的对象,
    3. 然后通过Activity的registerReceiver(BroadcastReceiver , IntentFilter)将过滤器和广播接收器连接在一起,这样就完成了注册
    4. 最后要记得,动态注册的广播接收器一定要记得取消注册才行,取消时是通过unregisterReceiver(networkChangeReceiver);方法就可以取消注册
       public class ThirdActivity extends Activity {
      
           private IntentFilter intentFilter ;
      private NetworkChangeReceiver networkChangeReceiver ; @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_third);
      10
      11 intentFilter = new IntentFilter() ;
      12 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
      13 networkChangeReceiver = new NetworkChangeReceiver() ;
      14 registerReceiver(networkChangeReceiver, intentFilter) ;

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

      优缺点:动态注册的广播接收器可以自由地控制注册和注销,非常灵活,但是也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在Activity的onCreate()方法中的。

  2. 在AndroidManifest.xml中注册:也称静态注册。这种情况下,我们一般不用内部类的方法来定义广播接收器,因为需要在AndroidManifest.xml中进行注册时需要用到我们自定义的广播接收器的类名。其具体的注册方法同Activity的注册方法类似。在intent-filter中加入我们想要接收的广播就行了。
    <receiver android:name=".BootCompleteReceiver">
    <intent-filter >
    <action android:name="android.intent.action.BOOT_COMPLETED />
    </intent-filter>
    </receiver>

    静态注册的优点在于可以一开机就可以开始接收相应的广播,不会像动态注册那样必须要等到启动程序后才可以。

  • 此外,还有一点非常重要的是,android系统为了保证应用程序的安全性做了规定,如果程序中需要访问系统的关键性信息,必须在配置文件中声明权限才行,否则程序将会直接崩溃,比如像上面的查询网络状态就需要声明权限。
  • 不要在广播接收器的onReceive()方法中添加过多的逻辑或者进行任何耗时操作,因为在广播接收器中是不允许开启线程的当onReceive()方法运行太长时间而没有结束时,系统会报错

4、发送自定义广播

  广播是一种可以跨进程的通信方式,我们可以在我们的应用程序中发送广播,其他应用进程也可以收到我们的广播信息。发送广播是通过Intent来实现的。

  • 发送标准广播:通过创建一个Intent对象,然后通过Activity的sendBroadcast(Intent intent)方法来进行发送。广播的类型可以在我们创建Intent对象的时候通过构造方法Intent(String action)来自定义,eg:

     button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent("com.keli.MY_BROADCAST") ;
    sendBroadcast(intent);
    }
    });

    当然,我们也可以在发送广播的Intent中携带一些数据。然后在广播接收器的onReceive()方法中通过getIntent()方法来获取Intent,并取出相应的数据。

  • 发送有序广播:发送有序广播的方法和发送标准广播的方法基本相同,只是需要将最后的sendBroadcast(intent)发送方法换成sendOrderedBroadcast(intent,null)即可。这里的第二个参数是一个与权限相关的字符串。那么设定广播的先后顺序是根据广播的优先级来判断的,我们可以在AndroidManifest.xml中注册广播接收器时通过android:priority属性来设置优先级
     <receiver android:name=".MyBroascastReceiver">
    <intent-filter android:priority="100">
    <action android:name="com.keli.MY_BROADCAST"/>
    </intent-filter>
    </receiver>

    此外,对于有序广播,我们可以在我们的广播接收器中的onReceive()方法的逻辑中对该广播进行截断,截断广播的方法也很简单,直接调用abortBroadcast();方法就可以了。

  • 使用本地广播:Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。主要是使用了一个LocalBroadcastManager对象来对广播进行管理,并提供了发送和注册广播接收器的方法本地广播是无法通过静态注册的方法进行注册的

5、在广播接收器中启动活动

  在广播接收器中也可以启动一个活动,但是我们启动活动之前必须给intent加入FLAG_ACTIVITY_NEW_TASK标志,否则将无法启动。下面的代码是创建一个广播接收器,在接收到广播后弹出一个警告对话框,并且设置该对话框不可取消,只能通过点击确定按钮来启动另一个活动页面。

 public class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent) {
//构建对话框,并设置对话框的标题、内容
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context) ;
dialogBuilder.setTitle("Warning") ;
dialogBuilder.setMessage("You are forced to ofline. Please try to login again") ;
//设置对话框不可取消
dialogBuilder.setCancelable(false) ;
//设置对话框的确定按钮,第一个参数是按钮上显示的text,
11      //第二个参数是添加点击确定按钮的响应事件,这里我们设定为启动一个登陆界面
dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(context, LoginActivity.class) ;
//必须添加FLAG_ACTIVITY_NEW_TASK标志
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;
context.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBuilder.create() ;
//设置AlertDialog的类型,保证在广播接收器中可以正常弹出
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}
}

Android基础总结(4)——广播接收器的更多相关文章

  1. Android组件系列----BroadcastReceiver广播接收器

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. Android应用程序注册广播接收器(registerReceiver)的过程分析

    前 面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息:而对 Android应用程序来说,订阅消息其实就是注册广播接收器, ...

  3. android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题

    最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能.当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新, ...

  4. android基础(二)Broadcast Receiver知识

    1.广播的注册 (1)动态广播注册: 优点:可以灵活控制广播的注册与撤销 缺点:必须在程序启动时才能接收广播 IntentFilter :当Intent在组建之间传递时,组件想告诉android系统自 ...

  5. Android系统中的广播(Broadcast)机制简要介绍和学习计划

    在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...

  6. Android应用程序发送广播(sendBroadcast)的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6744448 前面我们分析了Android应用程 ...

  7. android#boardcast#发送自定义广播

    广播主要分为两种类型,标准广播和有序广播,通过实践的方式来看下这两种广播具体的区别. 一.发送标准广播 在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发出去也是白发.因此新 ...

  8. Xamarin.Android广播接收器与绑定服务

    一.前言 学习了前面的活动与服务后,你会发现服务对于活动而言似乎就是透明的,相反活动对于服务也是透明的,所以我们还需要一中机制能够将服务和活动之间架起一座桥梁,通过本节的学习,你将会学到广播与绑定服务 ...

  9. Android -- 简单广播接收与发送(2)--动态注册广播接收器

    1. 效果图

随机推荐

  1. TCP/IP四层模型和OSI七层模型的概念

    转:http://blog.csdn.net/superjunjin/article/details/7841099/ TCP/IP四层模型 TCP/IP是一组协议的代名词,它还包括许多协议,组成了T ...

  2. NeHe OpenGL教程 第三十五课:播放AVI

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. Oracle11G登录时提示:ORA-12557: TNS:协议适配器不可加载

    原文 Oracle11G登录时提示:ORA-12557: TNS:协议适配器不可加载 初步分析是ORACLE_HOME设置错误引起的.前几天不小心看到系统环境变量中的其值为空,就手贱的加载了一个ora ...

  4. centos6.5安装配置fastdfs+nginx实现分布式图片服务器

    一.准备 yum groupinstall -y "Development Tools"yum install -y wget libevent-devel pcre-devel ...

  5. 转-封装网络请求库,统一处理通用异常 (基于volley网络请求库)

    http://blog.csdn.net/kroclin/article/details/40540761 一.前言 volley的发布让网络请求也变得十分便利,但是我们通常懒得很想用一两句代码实现一 ...

  6. Error: L6218E: Undefined symbol TIM_ARRPreloadConfig (referred from pwm_output.o).

    出错原因:模板FWLIB中没有添加stm32f10x_tim.c文件.添加即可 一般利用库开发,将ppp.c(ppp.c又调用了库stm32f10x_xx.h)写好之后的调用步骤: 1 将ppp.c和 ...

  7. 在eclipse中下载包含子模块(Submodules)的git项目

    先将项目下载下来 , 这时由于是子项目的原因 , 下载的项目中不包含任何子项目 . 这时在eclipse的Git Repositories中 , 选中Submodules , 右键点击update即可 ...

  8. git相关网页

    git.apache2.gerrit安装 1.http://blog.csdn.net/benkaoya/article/details/8680886 2.http://fatalove.iteye ...

  9. 学习git遇到的一些简单错误

    From:http://stackoverflow.com/questions/7574459/prompted-for-password-on-git-pull-origin-branch [roo ...

  10. What is the difference between <%, <%=, <%# and -%> in ERB in Rails?

    http://stackoverflow.com/questions/998979/difference-between-and-in-rails/25617607#25617607 http://s ...