1.广播类型

Android中的广播有两种类型:标准广播和有序广播。其中,标准广播是完全异步发送的广播,发出之后,几乎所有的广播接收者都会在同一时刻收到这条广播消息,因而,这种类型的广播消息是不可拦截,不可修改的;而有序广播是一种同步发送的广播,广播发出后,只有优先级最高的广播接收者能够收到这条广播消息,它处理完自己的逻辑之后,广播才会向后继续传递给低优先级的广播接收者,因此,高优先级的广播接收者可以对广播消息进行拦截,修改操作。

2.接收系统广播

要接收系统广播,就要有自己的广播接收者。定义一个自己的广播接收者的方式就是自定义一个类继承自BroadcastReceiver,然后重写其onReceive()方法即可,在onReceive()方法中可以实现广播消息的获取,修改等操作,当然能修改的只有有序广播。

BroadcastReceiver中的常用方法:

getResultCode()、getResultData()、getResultExtras()分别用来获取广播的代码,数据及附加数据信息,一般是前一个广播接收者所设定的。

setXX()与上面的getXX()对应,用来进行相应的设置,后一个广播接收者获取的将是当前设置的数据。

abortBradcast()截断当前广播。

2.1接收向外拨号的广播

1)定义广播接收器并重写onReceive()方法:

  1. public class OutCallingReceiver extends BroadcastReceiver {
  2.  
  3. @Override
  4.  
  5. public void onReceive(Context context, Intent intent) {
  6.  
  7. // TODO Auto-generated method stub
  8.  
  9. String number = this.getResultData();
  10.  
  11. if(number.equals("10086")){
  12.  
  13. this.setResultData("110");
  14.  
  15. }else if(number.equals("10000")){
  16.  
  17. this.setResultData("120");
  18.  
  19. }else{
  20.  
  21. this.setResultData("2222");
  22.  
  23. }
  24.  
  25. Toast.makeText(context, "转发成功", Toast.LENGTH_SHORT).show();
  26.  
  27. }
  28.  
  29. }

2)在Manifest.xml清单文件的<application>节点下中注册广播接收者组件,声明其能接收的广播为向外拨号:

  1. <receiver android:name="cn.csc.broadcast.OutCallingReceiver">
  2.  
  3. <intent-filter >
  4.  
  5. <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
  6.  
  7. </intent-filter>
  8.  
  9. </receiver>

3)由于重写的onReceive()方法中修改了广播,对向外拨出的号码进行了修改,所以需要配置权限:

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

4)运行结果:

部署到模拟器后,然后拨号:

被处理之后:

2.2接收网络状态变化的广播:参考《第一行代码》

1)定义广播接收器并重写onReceive()方法:

  1. public class NetworkReceiver extends BroadcastReceiver {
  2.  
  3. @Override
  4.  
  5. public void onReceive(Context context, Intent intent) {
  6.  
  7. // TODO Auto-generated method stub
  8.  
  9. ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  10.  
  11. NetworkInfo info = connManager.getActiveNetworkInfo();
  12.  
  13. if(info != null && info.isAvailable()){
  14.  
  15. Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show();
  16.  
  17. }else{
  18.  
  19. Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show();
  20.  
  21. }
  22.  
  23. }
  24.  
  25. }

2)在Manifest.xml清单文件的<application>节点下中注册广播接收者组件:

  1. <receiver android:name="cn.csc.broadcast.NetworkReceiver">
  2.  
  3. <intent-filter >
  4.  
  5. <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  6.  
  7. </intent-filter>
  8.  
  9. </receiver>

3)需要配置权限读取网络状态的权限:

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

4)运行结果:

部署到模拟器后,在配置中修改网络状态:

设置为飞行模式,网络不可用:

关闭飞行模式,网络变为可用:

关闭手机移动网络:

开启手机移动网络:

3.发送广播:

需要用到Context的以下方法:

sendBroadcast(Intent intent):传入一个意图,然后根据意图发出一个标准广播。

sendBroadcast(Intent intent, String receiverPermission):传入一个意图及一个字符串表示的权限,指定声明改权限的广播接收者才能收到这个广播,第二个参数为null的话,表示不需要声明权限。

sendOrderedBroadcast(Intent intent, String receiverPermission):参数含义同上一个方法,不同的是该方法发送一个有序广播。

sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras):同样是发送一个有序广播,多出来的参数含义如下:

resultReceiver:指定最终的接收者,不需要则设为null

scheduler:指定自定义的Handler执行resultReceiver的回调,null则在主线程执行

initalCode:为resultCode设置初始值

initalData:为resultData设置初始值

initalExtras:为resultExtras设置初始值

3.1发送标准广播

1)修改应用的Activity,添加一个按钮,按钮的单击响应监听中发送自定义广播:

  1. Button btn = (Button) findViewById(R.id.btn_send_normal);
  2.  
  3. btn.setOnClickListener(new OnClickListener() {
  4.  
  5. @Override
  6.  
  7. public void onClick(View v) {
  8.  
  9. // TODO Auto-generated method stub
  10.  
  11. Intent intent = new Intent("cn.csc.broadcast.PARTY");
  12.  
  13. intent.putExtra("content", "明天下午16点校南门集合,一起去龙湖看电影,聚餐");
  14.  
  15. sendBroadcast(intent);
  16.  
  17. }
  18.  
  19. });

2)自定义广播接收器,接收自己发送的聚餐广播:

  1. public class PartyReceiver extends BroadcastReceiver {
  2.  
  3. @Override
  4.  
  5. public void onReceive(Context context, Intent intent) {
  6.  
  7. // TODO Auto-generated method stub
  8.  
  9. Toast.makeText(context, intent.getStringExtra("content"), Toast.LENGTH_LONG).show();
  10.  
  11. }
  12.  
  13. }

3)在清单文件中,配置PartyReceiver:

  1. <receiver android:name="cn.csc.broadcast.PartyReceiver">
  2.  
  3. <intent-filter >
  4.  
  5. <action android:name="cn.csc.broadcast.PARTY"/>
  6.  
  7. </intent-filter>
  8.  
  9. </receiver>

4)运行结果:

3.2发送有序广播:

1)修改按钮单击事件监听:

  1. sendOrderedBroadcast(intent, null, null, null, 0, "明天下午16点校南门集合,一起去龙湖看电影,聚餐", null);

2)新建几个接收聚餐广播的接收者:

可以直接复制原来的那个,简单修改标识即可,采用Logcat输出消息:

  1. public class PartyReceiver1 extends BroadcastReceiver {
  2.  
  3. @Override
  4.  
  5. public void onReceive(Context context, Intent intent) {
  6.  
  7. // TODO Auto-generated method stub
  8.  
  9. Log.i("PARTY","F1:"+ getResultData());
  10.  
  11. }
  12.  
  13. }

3)在清单文件中注册:

  1. <receiver android:name="cn.csc.broadcast.PartyReceiver1">
  2.  
  3. <intent-filter >
  4.  
  5. <action android:name="cn.csc.broadcast.PARTY"/>
  6.  
  7. </intent-filter>
  8.  
  9. </receiver>
  10.  
  11. <receiver android:name="cn.csc.broadcast.PartyReceiver2">
  12.  
  13. <intent-filter >
  14.  
  15. <action android:name="cn.csc.broadcast.PARTY"/>
  16.  
  17. </intent-filter>
  18.  
  19. </receiver>
  20.  
  21. <receiver android:name="cn.csc.broadcast.PartyReceiver3">
  22.  
  23. <intent-filter >
  24.  
  25. <action android:name="cn.csc.broadcast.PARTY"/>
  26.  
  27. </intent-filter>
  28.  
  29. </receiver>

4)运行结果:

多点几次按钮,顺序仍然一样。这里没有设置优先级,就按清单文件中的顺序一个个向下传递。

5)修改清单文件,添加优先级:

  1. <receiver android:name="cn.csc.broadcast.PartyReceiver1">
  2.  
  3. <intent-filter android:priority="0">
  4.  
  5. <action android:name="cn.csc.broadcast.PARTY"/>
  6.  
  7. </intent-filter>
  8.  
  9. </receiver>
  10.  
  11. <receiver android:name="cn.csc.broadcast.PartyReceiver2">
  12.  
  13. <intent-filter android:priority="500">
  14.  
  15. <action android:name="cn.csc.broadcast.PARTY"/>
  16.  
  17. </intent-filter>
  18.  
  19. </receiver>
  20.  
  21. <receiver android:name="cn.csc.broadcast.PartyReceiver3">
  22.  
  23. <intent-filter android:priority="1000">
  24.  
  25. <action android:name="cn.csc.broadcast.PARTY"/>
  26.  
  27. </intent-filter>
  28.  
  29. </receiver>

6)重新运行:

优先级数字越大,优先级就越高。

若优先级全设置为500:

可见,优先级相同则按注册顺序依次传递。

7)设置不同的优先级,然后在高优先级Receiver中修改消息内容:

Receiver1:

  1. Log.i("PARTY","F1:"+getResultData());
  2.  
  3. setResultData("明天早上5点校西门集合,一起去春熙路看美女");

Receiver2:

  1. Log.i("PARTY","F2:"+getResultData());
  2.  
  3. setResultData("明天自由活动");

Receiver3:

  1. Log.i("PARTY","F3:"+getResultData());

8)运行结果:

9)高优先级截断广播消息:

Receiver1:

  1. Log.i("PARTY","F1:"+getResultData());
  2.  
  3. setResultData("明天早上5点校西门集合,一起去春熙路看美女");
  4.  
  5. abortBroadcast();

运行结果:

10)设置sendOrderedBroadcast()方法的resultReceiver参数:

  1. sendOrderedBroadcast(intent, null, new PartyReceiver3(), null, 0, "明天下午16点校南门集合,一起去龙湖看电影,聚餐", null);

Receiver1中任然截获广播消息:

  1. Log.i("PARTY","F1:"+getResultData());
  2.  
  3. setResultData("明天早上5点校西门集合,一起去春熙路看美女");
  4.  
  5. abortBroadcast();

运行结果:

可见,resultReceiver指定的接收者,即使高优先级接收者截获广播消息,它也一定能收到广播消息。

以上,就是学到的Android中关于广播接收者的内容。

补充:本地广播的简单使用,参考《第一行代码》

1)修改Activity代码:

  1. public class MainActivity extends ActionBarActivity {
  2.  
  3. private LocalBroadcastManager manager;
  4.  
  5. private LocalReceiver localReceiver;
  6.  
  7. @Override
  8.  
  9. protected void onCreate(Bundle savedInstanceState) {
  10.  
  11. super.onCreate(savedInstanceState);
  12.  
  13. setContentView(R.layout.activity_main);
  14.  
  15. Button btn = (Button) findViewById(R.id.btn_send_normal);
  16.  
  17. manager = LocalBroadcastManager.getInstance(this);
  18.  
  19. btn.setOnClickListener(new OnClickListener() {
  20.  
  21. @Override
  22.  
  23. public void onClick(View v) {
  24.  
  25. // TODO Auto-generated method stub
  26.  
  27. Intent intent = new Intent("cn.csc.broadcast.PARTY");
  28.  
  29. intent.putExtra("content", "明天下午16点校南门集合,一起去龙湖看电影,聚餐");
  30.  
  31. manager.sendBroadcast(intent);
  32.  
  33. }
  34.  
  35. });
  36.  
  37. IntentFilter filter = new IntentFilter();
  38.  
  39. filter.addAction("cn.csc.broadcast.PARTY");
  40.  
  41. localReceiver = new LocalReceiver();
  42.  
  43. manager.registerReceiver(localReceiver, filter);
  44.  
  45. }
  46.  
  47. @Override
  48.  
  49. protected void onDestroy() {
  50.  
  51. // TODO Auto-generated method stub
  52.  
  53. manager.unregisterReceiver(localReceiver);
  54.  
  55. }
  56.  
  57. }

主要就是之前有Context调用sendBroadcast()改为由LocalBroadcastManager调用,及注册接收者。

2)新建一个接收本地广播的接收者:

  1. public class LocalReceiver extends BroadcastReceiver {
  2.  
  3. @Override
  4.  
  5. public void onReceive(Context context, Intent intent) {
  6.  
  7. // TODO Auto-generated method stub
  8.  
  9. Toast.makeText(context, intent.getStringExtra("content"), Toast.LENGTH_LONG).show();
  10.  
  11. }
  12.  
  13. }

这样,这个广播就只能在本应用中可见,该应用之外不可见了。

注意一点,本地广播中这种广播接收者注册方式称之为动态注册,而前面的全局广播接收者注册是在清单文件中注册的,称之为静态注册,前面的广播接收者的注册也都可以使用动态注册,在此就不一一测试了。静态注册的好处是即使不启动应用,也能够接收广播消息进行需要的简单处理。而本地广播是当前应用发出的只在本应用内部可见的广播消息,所以只能采用动态注册,而且完全没必要采用静态注册,能发出广播消息就说明该应用已然处于启动的状态了。

android菜鸟学习笔记26----Android广播消息及BroadcastReceiver的更多相关文章

  1. Android:日常学习笔记(9)———探究广播机制

    Android:日常学习笔记(9)———探究广播机制 引入广播机制 Andorid广播机制 广播是任何应用均可接收的消息.系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播.通过将 In ...

  2. android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结

    常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在 ...

  3. android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据

    主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...

  4. Android开发学习笔记-关于Android的消息推送以及前后台切换

    下面是最简单的Android的消息推送的实现方法 package com.example.shownotic; import java.util.Random; import android.supp ...

  5. android菜鸟学习笔记31----Android使用百度地图API(二)获取地理位置及地图控制器的简单使用

    1.获取当前地理位置: Android中提供了一个LocationManager的类,用于管理地理位置.不能通过构造函数获取该类的实例,而是通过Context的getSystemService(): ...

  6. android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图

    1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台http://developer.baidu.com/ 3)进入LBS云 ...

  7. android菜鸟学习笔记21----ContentProvider(一)ContentProvider的简单使用

    ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用.只有当需要在多个应用之间共享数据时才会用到ContentPro ...

  8. android菜鸟学习笔记17----Android数据存储(一)文件读写

    假如有如下需求,要求能够记录用户输入的用户名和密码,下次登录时,能直接获取之前保存的用户名密码,并在相应的EditText中显示. 要保存用户输入的数据,最先想到的应该就是文件读写了. 通过对andr ...

  9. android菜鸟学习笔记7----android布局(二)

    3.FrameLayout:帧布局 如同Flash或者photoshop中图层的概念,在上面的图层遮盖下面的图层,没被遮到的地方仍然显示出来. 右击res/layout,然后在弹出的菜单中选择new, ...

随机推荐

  1. PowerDesigner 将表的字段name属性设置到comment凝视

    1.首先copy以下的vbs脚本.并将其另存为name2comment.vbs '*********************************************************** ...

  2. formidable 模块化开发 代码拆分(解耦) nodejs图片服务器架构

    引言:程序要做到:健壮性.低耦合.可扩展.方便程序员分工合作 上传图片值nodejs服务器并显示图片的源代码: post.html : <!DOCTYPE html> <html l ...

  3. android adt 最新下载地址

    打开这个网址就可以看到adt的详细信息:  http://developer.android.com/sdk/installing/installing-adt.html 或者直接在你的eclipse ...

  4. JSON——Java中的使用

    1. 构建JSON方法(数据——>JSON) 这里使用Maven构建项目 在pom.xml中添加如下依赖 <dependency> <groupId>org.json&l ...

  5. dbHelper类操作数据库

    using System; using System.Collections; using System.Configuration; using System.Data; using System. ...

  6. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  7. ImageBox Control with Zoom/Pan Capability

    Download source files - 10.8 Kb Download demo project - 6.81 Kb Introduction This control extends th ...

  8. nginx location 或操作

    location ~* (\.(7z|bat|bak|ini|log|rar|sql|swp|tar|zip|gz|git|asp|svn)|/phpmyadmin) { deny all; }

  9. FZU2171:防守阵地 II(线段树)

     Problem Description 部队中总共同拥有N个士兵,每一个士兵有各自的能力指数Xi.在一次演练中,指挥部确定了M个须要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务.获得 ...

  10. 开源管理系统OSSIM设置 语言为中文简体

    最近研究OSSIM系统,OSSIM的安装是做好的ISO,操作系统选择的是CentOS 64Bit系统.我使用的OSSIM 4.11 的ISO安装,虽然系统说明支持中文,实际上,只是台湾的繁体中文而以. ...