Android之Broadcast, BroadcastReceiver(广播)

转载 2015年11月19日 13:25:47

在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver

活动(Activity) - 用于表现功能

服务(Service) - 相当于后台运行的 Activity

广播(Broadcast) - 用于发送广播

广播接收器(BroadcastReceiver) - 用于接收广播

Intent - 用于连接以上各个组件,并在其间传递消息

==========================================================================

BroadcastReceiver:

在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:

首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。

当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。

注册BroadcastReceiver有两种方式:

一种方式是,静态的在AndroidManifest.xml中用<receiver>标签生命注册,并在标签内用<intent- filter>标签设置过滤器。

另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter 对象,然后在需要注册的地方调Context.registerReceiver()方法,如果取消时就调用 Context.unregisterReceiver()方法。如果用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。(特别注意,有些可能需要后台监听的,如短信消息)

另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用<uses- permission>标签声明了拥有此权限的BroascastReceiver才会有可能接收到发送来的Broadcast。同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个 BroadcastReceiver所接收。

1.静态注册BroadcastReceiver:

静态注册比动态注册麻烦点,先新建一个类继承BroadcastReceiver,如:

clsReceiver2.java

复制代码
package com.testBroadcastReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; /* * 接收静态注册广播的BroadcastReceiver, * step1:要到AndroidManifest.xml这里注册消息 * <receiver android:name="clsReceiver2"> <intent-filter> <action android:name="com.testBroadcastReceiver.Internal_2"/> </intent-filter> </receiver> step2:定义消息的字符串 step3:通过Intent传递消息来驱使BroadcastReceiver触发 */ public class clsReceiver2 extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Toast.makeText(context, "静态:"+action, 1000).show(); } }
复制代码

然后到AndroidManifest.xml 添加receive标签

<receiver android:name="clsReceiver2"> <intent-filter> <action android:name="com.testBroadcastReceiver.Internal_2"/> </intent-filter> </receiver>

第一个name是类名,即你的继承BroadcastReceiver的类的名字,里面实现了BroadcastReceive的onReceive()方法,来处理你接到消息的动作。

第二个name是action的名称,即你要监听的消息名字(其它消息都会被过滤不监听)。

2.动态注册BroadcastReceiver:

  主要代码部分为:

     IntentFilter intentFilter = new IntentFilter();

  intentFilter.addAction(String); //为BroadcastReceiver指定action,即要监听的消息名字。

     registerReceiver(MyBroadcastReceiver,intentFilter); //注册监听

     unregisterReceiver(MyBroadcastReceiver); //取消监听

  (一般:在onStart中注册,onStop中取消unregisterReceiver)

     private class MyBroadcastReceive extends BroadcastReceiver

     {

           public void onReceive(Context context, Intent intent)

           {

               String action = intent.getAction();

                if(intent.ACTION_BATTERY_CHANGED.equals(action)) //判断是否接到电池变换消息 

                {

                   //处理内容

                 }

            }

      }

========================================================================

Broadcast:

发送广播消息,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。

例如:

Intent intent = new Intent(INTENAL_ACTION_3); intent.putExtra("Name", "hellogv"); intent.putExtra("Blog", "http://blog.csdn.net/hellogv"); sendBroadcast(intent);//传递过去

android四大组件启动流程-BroadcastReceiver启动流程(基于android 6.0)

前面已经写过Activity的启动流程:http://blog.csdn.net/newhope1106/article/details/53355189 和 Service的启动流程:http:/...
  • newhope1106
  • newhope1106
  • 2017年01月07日 17:07
  • 1414

动态BroadcastReceiver封装

在发送前先写个权限,要不然上线的时候什么检查工具什么的,会说你的广播没有设置权限要你设置.如: ...
  • m107119232
  • m107119232
  • 2016年10月13日 12:18
  • 590

关于BroadCastReceiver安全性的思考

介绍了避免自己app中的广播响应其他应用中的广播,增加广播安全性的四种解决方案...
  • yuanzeyao2008
  • yuanzeyao2008
  • 2014年08月30日 23:17
  • 4040

Android跨进程访问(四大组件)- Broadcast Receiver跨进程访问

(1)在应用中接收系统其他应用发出的广播 广播跨进程通讯是一种被动的访问方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与...
  • u010274120
  • u010274120
  • 2015年09月18日 14:51
  • 1145

android 基于BroadcastReceiver广播 完全退出应用的实现代码 亲测可以

关于android退出系统的代码网上很多 但大部分是不行的,比如    System.exit(0);//只能退出当前activity 还有 ActivityManager activity...
  • dxswzj
  • dxswzj
  • 2013年09月04日 21:46
  • 3364

Android 使用广播(BroadcastReceiver)传递数据

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • qq_28934205
  • qq_28934205
  • 2016年03月24日 16:57
  • 1373

关于Handler和BroadcastReceiver的联合使用

关于Handler和BroadcastReceiver的联合使用: 使用原则: 1. handler是在线程中或者异步任务里发出消息。     handler.sendMessage(handl...
  • iamwutianbao
  • iamwutianbao
  • 2015年06月03日 14:43
  • 1459

Android 解决BroadcastReceiver安全问题---LocalBroadcastManager

在Android中,一般我们发送和接收的广播都属于系统全局广播,也就是说发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他应用程序的广播。这样就很容易产生安全问题,比如说我们发送一些...
  • wubo_fly
  • wubo_fly
  • 2015年06月08日 15:01
  • 908

Android Broadcast 和 BroadcastReceiver的权限机制

在Android应用开发中,有时会遇到以下两种情况, 1. 一些敏感的广播并不想让第三方的应用收到 ; 2. 要限制自己的Receiver接收某广播来源,避免被恶意的同样的ACTION的广播所...
  • shineflowers
  • shineflowers
  • 2014年10月24日 13:51
  • 7881

详解基于Binder的BroadcastReceiver && 基于Handler的LocalBroadcastManager

一、BroadcastReceiver: 1.registerReceiver动态注册和通过标签静态注册广播的区别: a.对bindService的调用,注册的广播,在onReceive结束后广播即不...
  • boyupeng
  • boyupeng
  • 2015年09月02日 10:04
  • 1478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android之Broadcast, BroadcastReceiver(广播)
举报原因:
原因补充:

(最多只允许输入30个字)