Broadcast分类
注册方式:
  • 动态广播

    • 在代码中注册receiver
    • 一定要手动在onDestroy()时调用unregisterReveiver()来取消注册
  • 静态广播
    • 在AndroidManifest.xml中注册receiver(主要是设定action)
动态广播:
1. 在代码中设置receiver、监听的广播类型并进行注册:
 public class MainActivity extends Activity {
private NetworkChangeReceiver receiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); receiver = new NetworkChangeReceiver();
registerReceiver(receiver, intentFilter);
} @Override
protected void onDestroy() {
unregisterReceiver(receiver);//remember to unregister manually
super.onDestroy();
}
}

2. 定义receiver的行为:继承BroadcastReceiver并在覆写onReceiver()时定义好接收到广播时处理的逻辑:

 public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable())
Toast.makeText(context, "Network is available.", Toast.LENGTH_SHORT).show();
else
Toast.makeText(context, "Network is unavailable.", Toast.LENGTH_SHORT).show();
}
}

3. 在AndroidManifest.xml中定义必要的权限,主要<uses-permission>标签位于<manifest>的下一级,即与<application>同级:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 
静态广播(以开机启动的广播为例)
1. 定义receiver的行为:
 public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot complete.", Toast.LENGTH_LONG).show();
}
}

2. 在AndroidManifest.xml中定义receiver(与<activity>同级,<application>的子元素):

 <receiver android:name=".MyBroadcast">
<intent-filter android:priority="100">
<action android:name="com.scv.lawrence.MY_BROADCAST"/>
</intent-filter>
</receiver>

3. 在AndroidManifest.xml中添加相应权限(<application>同级,<manifest>的子元素):

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 
接收顺序:
  • 标准(Normal broadcast)

    • 默认的广播方式,即broadcast发出后,所有receiver几乎在同时接收到。
  • 有序(Ordered broadcast)
    • receiver根据设定的优先级(priority)来决定broadcast的传递顺序,较高优先级的receiver可以选择拦截该broadcast阻止其向后传播
  • 二者区别
    • 发送广播时,标准广播调用的是sendBroadcast(),有序广播调用的是sendOrderedBroadcast()
    • 接收广播时(在AndroidManifest.xml中注册receiver),标准广播不用在<intent-filter>中设置android:priority属性,有序广播则需要设定一个整数,数值越大priority越高

在代码中发送自定义的标准/无序广播:

 Button sendBroadcast = (Button) findViewById(R.id.broadcast);
sendBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.scv.lawrence.MY_BROADCAST");
sendBroadcast(intent);
// sendOrderedBroadcast(intent, null);
}
});

在AndroidManifest.xml中定义(父元素为<application>,即与<activity>同级):

 <receiver android:name=".MyBroadcast">
<intent-filter android:priority="100">
<action android:name="com.scv.lawrence.MY_BROADCAST"/>
</intent-filter>
</receiver>
广播范围:
  • 全局广播

    • 非LocalBroadcastManager进行发送或接收的广播即为全局广播
  • 本地广播
    • 发送/接收的broadcast只限于当前app范围内,安全性比全局高
    • 与全局广播的区别在于本地广播依靠LocalBroadcastManager进行注册、发送及注销receiver
 本地广播:
1. 定义接收到广播的行为:
 public class LocalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Get the local broadcast.", Toast.LENGTH_SHORT).show();
}
}

2. 和动态广播差不多,区别主要在使用LocalBroadcastManager的实例来进行操作:

 public class MainActivity extends Activity {
private LocalBroadcastManager localBroadcastManager;
private LocalBroadcastReceiver localReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //Local Broadcast
localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this); final Button localBroadcast = (Button) findViewById(R.id.local_broadcast);
localBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.scv.lawrence.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
}); IntentFilter localIntentFilter = new IntentFilter();
localIntentFilter.addAction("com.scv.lawrence.LOCAL_BROADCAST"); localReceiver = new LocalBroadcastReceiver();
localBroadcastManager.registerReceiver(localReceiver, localIntentFilter);
} @Override
protected void onDestroy() {
localBroadcastManager.unregisterReceiver(localReceiver);
super.onDestroy();
}
}

3. 在AndroidManifest.xml中配置permission. (如有必要)

Android:BroadcastReceiver的更多相关文章

  1. Android四大组件之一:BroadCastReceiver(广播接收者)

    广播接受者是(BroadCastReceiver)是Android中的地大组件之一,之前学习了一些关于BroadCastReceiver方面的知识,今天回过头来发现已经快忘记的差不多了,毕竟现在是刚开 ...

  2. Android(java)学习笔记177:BroadcastReceiver之 应用程序安装和卸载 的广播接收者

           国内的主流网络公司(比如网易.腾讯.百度等等),他们往往采用数据挖掘技术获取用户使用信息,从而采用靶向营销.比如电脑上,我们浏览网页的时候,往往会发现网页上会出现我们之前经常浏览内容的商 ...

  3. Android(java)学习笔记176:BroadcastReceiver之 短信发送的广播接收者

    有时候,我们需要开发出来一个短信监听器,监听用户发送的短信记录,下面就是一个案例,这里同样需要使用广播机制. 下面同样是代码示例,MainActivity.java 和  activity_main. ...

  4. Android(java)学习笔记175:BroadcastReceiver之 外拨电话的广播接收者

    首先我们示例工程一览表如下: 1.首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中定义了监听到广播,要执行的操作: ...

  5. Android(java)学习笔记173:BroadcastReceiver之 静态注册 和 动态注册

    1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...

  6. Android(java)学习笔记179:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)

    之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播:   1.   我们首先了解一下有序广播和无序广播区别和联系? (1) 有序广播> 接受者 ...

  7. Android(java)学习笔记178:BroadcastReceiver之 自定义广播

    广播使用:               电台:对外发送信号.---------电台发送广播(可以自定义)               收音机:接收电台的信号.-----广播接收者 这里,我们就说明自定 ...

  8. Android(java)学习笔记122:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)

    之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1)有序广播> 接受者有优先级, ...

  9. Android(java)学习笔记121:BroadcastReceiver之 自定义广播

    广播使用:               电台:对外发送信号.---------电台发送广播(可以自定义)               收音机:接收电台的信号.-----广播接收者 这里,我们就说明自定 ...

随机推荐

  1. 【cs231n】反向传播笔记

    前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专业的翻译,在此我会直接copy他们翻译的笔记,有些地方会用红字写自己的笔记,本文只是作为自己的学习笔记.本文内容官网链接: ...

  2. mac 下测试各种IE版本

    背景 作为前端开发,在谈到兼容性时不得不谈到IE浏览器,那么,如果在mac上该怎么测试各种版本的IE呢 方法 1. 下载VirtualBox虚拟器 2. 下载安装了对应版本的windows系统,htt ...

  3. Linux CentOS 7 安装字体库 & 中文字体

    前言 报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效: 如上图可以看出,不仅没有中文字体,连字体库 ...

  4. 英语每日阅读---8、VOA慢速英语(翻译+字幕+讲解):脸肓症患者记不住别人的脸

    英语每日阅读---8.VOA慢速英语(翻译+字幕+讲解):脸肓症患者记不住别人的脸 一.总结 一句话总结: a.neural abnormalities are more widespread:Duc ...

  5. 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序

    最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例:  输入:[1,2,3,5,2, ...

  6. python脚本9_打印斐波那契数列

    #打印斐波那契数列 f0 = 0 f1 = 1 for n in range(2,101): fn = f1 + f0 if fn <= 100: print(fn) f0 = f1 f1 = ...

  7. 学习opencv(持续更新)

    redhat安装,报错解决方法 1 升级GCC,http://mirrors.kernel.org/gnu/gcc/ 2 更换稳定版本 #!/bin/bash yum -y install gcc g ...

  8. 解决SecureCRT下spark-shell中scala无法删除问题

    转自:http://blog.csdn.net/huanbia/article/details/51318278 问题描述 当使用SecureCRT来打开Spark-shell的时候,有时会出现如下问 ...

  9. linux-Centos7安装mysql5.7.19

    1.下载mysql 网址: https://dev.mysql.com/downloads/mysql/ 2.选择源码包,通用版点击下载 直接下载就可以了,不用登录 3.解压编译 先安装相关依赖包 y ...

  10. 字符串方法之-indexOf、lastIndexOf、等等一些方法

    1.indexOf():方法可返回某个指定的字符串值在字符串中首次出现的位置(从左往右找). 语法:stringObject.indexOf(searchvalue,fromindex) <sc ...