Android中的广播用途很广,是四大组件之一。在android中可以看到它的各种应用,从系统发出的广播,用户自定义的广播等。

这里详细记录下广播的分类以及使用方法。

广播,是由两方面组成一个流程:广播发送者、广播接收者。

有以下场景:

当网络状态发生变化时,系统(广播发送者)会发出一条广播,这条广播的标识是:android.net.conn.CONNECTIVITY_CHANGE。当开发人员(广播接收者)也添加了这个标识,那开发人员就可以在代码中接收到这条广播。广播接收者可以是多个。

一、广播的分类,按有无顺序区分,可以分为:标准广播、有序广播。

(1)标准广播。就是多个广播接收者,接收到广播是无序的,没有规定谁先谁后。按理想状况来说,是同一时间接收到系统发出的广播。

(2)有序广播。在广播接收者,注册添加这条广播时,有增加了优先熟悉的设置。优先级高的先接收,优先级高的广播接收者,还可以控制是否将广播往下继续传递;

二、广播的注册。

根据注册方式不同有静态注册、动态注册。下面以接收系统广播为例:

(1)静态注册:

有两种方式实现:AndroidManifest.xml中注册+内部类;AndroidManifest.xml中注册+外部类。

这两种的实现都是在AndroidManifest.xml中注册,在代码中写BroadCastReceive的重载即可。

以下是,AndroidManifest.xml中注册+内部类:

package="com.example.broadcasttest_csdn"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="8"

android:targetSdkVersion="18" />

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name="com.example.broadcasttest_csdn.MainActivity"

android:label="@string/app_name" >

package com.example.broadcasttest_csdn;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.os.Bundle;

import android.R.anim;

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.view.Menu;

import android.widget.Toast;

public class MainActivity extends Activity {

BroadcastReceiver bReceiver;

IntentFilter iFilter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

/*

iFilter=new IntentFilter();

iFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

bReceiver=new myBroadCast();

registerReceiver(bReceiver, iFilter);

*/

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

//unregisterReceiver(bReceiver);

}

public static  class myBroadCast extends BroadcastReceiver

{

@Override

public void onReceive(Context arg0, Intent arg1) {

// TODO Auto-generated method stub

ConnectivityManager connectivityManager=(ConnectivityManager)arg0.getSystemService(arg0.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();

if(networkInfo!=null&&networkInfo.isAvailable())

{

Toast.makeText(arg0, "网络已连接", Toast.LENGTH_SHORT).show();

}

else {

Toast.makeText(arg0, "网络未连接", Toast.LENGTH_SHORT).show();

}

}

}

}

有几个要注意的地方:

AndroidManifest.xml区域:

权限需要添加,因为我们测试的是网络变化(这个系统变化最容易模拟);

receiver中的name不是activity的name,是BroadcastReceiver继承类的name。如果是内部类,则要像上方写法一样,用$来得到方法name;

intent-filter中是要过滤下来的广播,就是你想要接收的广播标识。

代码红字标识区域:

广播接收的内部类,需要定义为static。否则会报错。

那如果我不想把广播接收类写为内部类,我要写在外面,方便android工程的其他页面调用,可行吗?

这个也是可以的,我们定义一个独立于activity的类,类名我们写为:BroadReceive。

类的内容,如下:

package com.example.broadcasttest_csdn;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.widget.Toast;

public class BroadReceive extends BroadcastReceiver{

@Override

public void onReceive(Context paramContext, Intent paramIntent) {

// TODO Auto-generated method stub

ConnectivityManager connectivityManager=(ConnectivityManager)paramContext.getSystemService(paramContext.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();

if(networkInfo!=null&&networkInfo.isAvailable())

{

Toast.makeText(paramContext, "网络已连接", Toast.LENGTH_SHORT).show();

}

else {

Toast.makeText(paramContext, "网络未连接", Toast.LENGTH_SHORT).show();

}

}

}AndroidManifest.xml的定义如下:

package="com.example.broadcasttest_csdn"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="8"

android:targetSdkVersion="18" />

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name="com.example.broadcasttest_csdn.MainActivity"

android:label="@string/app_name" >

与内部类方式相比,区别在上方receive的name,用的是外部类name。

有些同学还会问,我如果在代码中,在activity类外,定义一个普通类继承BroadCastReceiver。能否在AndroidManifest.xml中静态注册。

答案是不行的,你会发现,这里需要static标识,而这个类没办法加这个static标识。

(2)动态注册。从上方的静态注册,我们看到还是有挺多要注意的,有的地方也不是很方便灵活。那我们可以考虑用动态注册。

动态注册,除了权限外,我们不需要在AndroidManifest.xml中操作其他内容,其他的都在代码中实现;

如下:

package com.example.broadcasttest_csdn;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.os.Bundle;

import android.R.anim;

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.view.Menu;

import android.widget.Toast;

public class MainActivity extends Activity {

BroadcastReceiver bReceiver;

IntentFilter iFilter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

iFilter=new IntentFilter();

iFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

bReceiver=new myBroadCast();

registerReceiver(bReceiver, iFilter);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

unregisterReceiver(bReceiver);

}

public static  class myBroadCast extends BroadcastReceiver

{

@Override

public void onReceive(Context arg0, Intent arg1) {

// TODO Auto-generated method stub

ConnectivityManager connectivityManager=(ConnectivityManager)arg0.getSystemService(arg0.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();

if(networkInfo!=null&&networkInfo.isAvailable())

{

Toast.makeText(arg0, "网络已连接", Toast.LENGTH_SHORT).show();

}

else {

Toast.makeText(arg0, "网络未连接", Toast.LENGTH_SHORT).show();

}

}

}

}

AndroidManifest.xml的定义如下:

package="com.example.broadcasttest_csdn"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="8"

android:targetSdkVersion="18" />

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name="com.example.broadcasttest_csdn.MainActivity"

android:label="@string/app_name" >

如代码中几个步骤,定义过滤器intent-filter、定义广播接收类、在activity开启的时候绑定二者、在activity销毁的时候解除绑定。

与静态注册相比,大家应该更习惯用动态注册。

二、广播使用实例

(1)标准广播。

上方例子中接收系统广播,都可以算是标准广播。因为没有做优先级设置。为了更好的说明,我们发送自定义广播,并接收。

package com.example.broadcasttest_csdn;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.os.Bundle;

import android.R.anim;

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.util.Log;

import android.view.Menu;

import android.widget.Toast;

public class MainActivity extends Activity {

BroadcastReceiver bReceiver;

IntentFilter iFilter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

iFilter=new IntentFilter();

iFilter.addAction("myAction");

bReceiver=new myBroadCast();

registerReceiver(bReceiver, iFilter);

Intent intent=new Intent();

intent.setAction("myAction");

intent.putExtra("info", "附带信息");

sendBroadcast(intent);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

unregisterReceiver(bReceiver);

}

public static  class myBroadCast extends BroadcastReceiver

{

@Override

public void onReceive(Context arg0, Intent arg1) {

// TODO Auto-generated method stub

if(arg1!=null)

{

Log.i("Action", arg1.getAction()) ;

Log.i("获取的信息", arg1.getStringExtra("info"));

}

}

}

}

代码里没有做太多的修改。偷懒了,刚启动就先注册一个广播接收,然后直接就发送广播。

你在onReceive里,可以收到广播的信息。Intent我们知道可以附带一些内容的,我也一起传了个值过去。

(2)有序广播

package com.example.broadcasttest_csdn;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.os.Bundle;

import android.R.anim;

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.util.Log;

import android.view.Menu;

import android.widget.Toast;

public class MainActivity extends Activity {

BroadcastReceiver bReceiver;

IntentFilter iFilter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

iFilter=new IntentFilter();

iFilter.addAction("myAction");

iFilter.setPriority(100);

bReceiver=new myBroadCast();

registerReceiver(bReceiver, iFilter);

Intent intent=new Intent();

intent.setAction("myAction");

intent.putExtra("info", "附带信息");

sendOrderedBroadcast(intent, null);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

unregisterReceiver(bReceiver);

}

public static  class myBroadCast extends BroadcastReceiver

{

@Override

public void onReceive(Context arg0, Intent arg1) {

// TODO Auto-generated method stub

if(arg1!=null)

{

Log.i("Action", arg1.getAction()) ;

Log.i("获取的信息", arg1.getStringExtra("info"));

abortBroadcast();

}

}

}

}和以前的代码相比,唯二的区别就在发送广播和截断广播的地方。一个是order、abort,按字面意思就是按顺序和截断。

这样的广播,到onReceive中就被截断了,不会再往下传递了。

至于广播出来后,谁第一个接收,是根据优先级来的。100->99->98....,类似这样的。

(3)本地广播

这是刚漏了,补上这个的说明。

本地广播和以上两个的区别在于:本地广播,只供本应用使用,有效的提高广播的安全性。

写法与以往的写法没有太大的区别:

package com.example.broadcasttest_csdn;

import android.os.Bundle;

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.support.v4.content.LocalBroadcastManager;

import android.util.Log;

public class MainActivity extends Activity {

LocalBroadcastManager localBroadcastManager;

BroadcastReceiver bReceiver;

IntentFilter iFilter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

iFilter=new IntentFilter();

iFilter.addAction("myAction");

iFilter.setPriority(100);

bReceiver=new myBroadCast();

//registerReceiver(bReceiver, iFilter);

localBroadcastManager=LocalBroadcastManager.getInstance(MainActivity.this);

localBroadcastManager.registerReceiver(bReceiver, iFilter);

Intent intent=new Intent();

intent.setAction("myAction");

intent.putExtra("info", "附带信息");

//sendOrderedBroadcast(intent, null);

localBroadcastManager.sendBroadcastSync(intent);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

//unregisterReceiver(bReceiver);

localBroadcastManager.unregisterReceiver(bReceiver);

}

public static  class myBroadCast extends BroadcastReceiver

{

@Override

public void onReceive(Context arg0, Intent arg1) {

// TODO Auto-generated method stub

if(arg1!=null)

{

Log.i("Action", arg1.getAction()) ;

Log.i("获取的信息", arg1.getStringExtra("info"));

//abortBroadcast();

}

}

}

}

将原来的BroadCastReceiver替换,就是修改的地方。将有些定义注释,用local的定义替换。这就得到我们要的本地广播。

以上,总结了我们会遇到的所有广播形式以及注册方式,仅供参考。

广播就到这里。O 。

android 增加一条广播,Android中BroadcastReceiver广播使用及注意点相关推荐

  1. android简单进度条对话框,android进度条对话框实例

    郑州app开发android进度条对话框实例.下面是java代码. package cn.xhhkj.cyd; import androidx.appcompat.app.AppCompatActiv ...

  2. android 加载条封装,Android基于JsBridge封装的高效带加载进度的WebView

    图片发自简书App 概述 从去年4月项目就一直用起了JsBridge,前面也针对jsBridge使用姿势介绍过一篇入门篇,<Android JsBridge实战 打造专属你的Hybrid APP ...

  3. android自定义进度条样式,Android 自定义进度条

    效果 国际惯例,效果图奉上 在这里插入图片描述 目录 在这里插入图片描述 前言 写在前面,由于之前其实已经写了部分自定义View的方法,所以本来应该按照之前的系列,来进行下载暂停动画进度条,但是我把之 ...

  4. android横向进度条宽度,Android - 条纹进度条实现,调整view宽度仿进度条

    Android 自定义UI custom view 美工同学指定了一个进度条样式 这斑斓的进度条,如果要自己画实在是劳民伤财.于是请美工切了一张素材(样例). 如果用shape或者.9图片不太好处理这 ...

  5. android自定义进度条样式,android 进度条ProgressBar样式设置

    普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中.一般只要在XML布局中定义就可以了. android:layout_width ...

  6. android圆环进度条动画,Android 圆形进度条,类似一些计步软件的进度显示!

    Android 圆形的进度条,类似于一些计步的进度显示.其实也是我们项目中的效果,只不过后来迭代中改进了,所以现在才拿出来.浏览更多安卓源码 usage android:id="@+id/a ...

  7. android 自定义进度条 水量,Android自定义带水滴的进度条样式(带渐变色效果)...

    一.直接看效果 二.直接上代码 1.自定义控件部分 package com.susan.project.myapplication; import android.app.Activity; impo ...

  8. android获取进度条数值,android 进度条值的获取与显示/计时器

    控件: RatingBar 显示:TextView 方法: RatingBar.setOnRatingBarChangeListener类的onRatingChanged()方法. XML: xmln ...

  9. android 水平进度条 自定义颜色,android 水平进度条的颜色设置

    首先在布局文件中定义如下: 再在drawable目录下新增progressbar.xml文件,可以设置默认背景色和进度条的颜色(值得一提的是支持渐变色) 内容如下:

最新文章

  1. vivo AI 计算平台的 ACK 混合云实践
  2. 计算机与外部设备通讯的接口,总线接口与计算机通信(四)USB外部总线(初级认识)...
  3. 蓝桥杯 基础练习 高精度加法
  4. 如何迁移outlook邮件到另一个硬盘_猎头如何有效的搜寻与筛选简历
  5. mysql bcp数据文件_BCP 数据的导入和导出
  6. 通俗易懂的机器学习入门
  7. 【深度学习】学习深度学习的最好方法
  8. 《转》SAP RM07扩展
  9. 使用SCCM Toolkit2中的Trace32来查看MDT日志
  10. 双系统下如何切换到ubantu界面及如何切换到windows界面
  11. 如何查看自己电脑安装的jdk版本
  12. (拓扑排序+并查集)HDU - 1811 Rank of Tetris
  13. Mac eclipse下载地址 Java开发
  14. bilibili弹幕获取api
  15. 计算机管理员工作目标任务书,毕业论文任务书中主要任务及目标怎么写
  16. 新浪微博一键分享手机版JS代码
  17. [行为识别论文详解]TSN(Temporal Segment Networks)
  18. Colorful Image Colorization原理及源码详解
  19. C# 文件相关---新建文件、文件另存为、读写文件
  20. 大学计算机实验报五告,大学计算机实验报告二_相关文章专题_写写帮文库

热门文章

  1. QIIME 2教程. 13训练特征分类器TrainingFeatureClassifiers(2021.2)
  2. MPB:河湖着生硅藻样品采集、永久玻片制作及鉴定
  3. 青岛能源所提出微生物组相似度新算法DMS
  4. 宏基因组学习交流4群成立
  5. R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象
  6. R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)
  7. R语言distVincentySphere函数计算大圆距离实战(Great Circle Distance)
  8. 使用optuna为机器学习模型挑选最优参数进行模型构建实战
  9. 分类(classification)是认知的基础、分类步骤及主要算法、分类与回归的区别、分类过程
  10. monocle3包的安装