文档章节

android BroadcastReceiver 使用小结

bengozhong
 bengozhong
发布于 2017/01/05 15:03
字数 1039
阅读 26
收藏 0

BroadcastReceiver 作为android4大组件之一,使用的很普遍,下面是对使用BroadcastReceiver一些总结。

1. Android 广播机制的三要素:

广播(Broadcast) - 用于发送广播;
广播接收器(BroadcastReceiver) - 用于接收广播;
意图内容(Intent)-用于保存广播相关信息的媒介。
Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。

2.BroadcastReceiver的注册

BroadcastReceiver的注册有两种方式,静态注册和动态注册。

2.1静态注册

静态注册通过在

AndroidManifest.xml文件中进行注册。

 

[html] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. <receiver   
  2. <span style="white-space:pre">    </span>android:name="com.example.testbroadcastreceiver.TestBroadcastReceiver"   
  3.     android:enabled="true"  
  4.     android:exported="false"  
  5.     android:process=":test"  
  6.     >  
  7.     <intent-filter>  
  8.         <action android:name="android.intent.action.EDIT" />  
  9.     </intent-filter>  
  10. </receiver>  

 

涉及的属性包括:

android:name:broadcastReceiver的类名。

android:exported:决定此broadcastReceiver能否接收其他应用发送的广播,该属性默认值由receiver是否设 置<intent-filter>有关,当设置了<intent-filter>时,该属性的默认值为true,否则为 false。

android:permission:设置广播发送方的权限,具备相应权限的发送方发送的广播可以被该receiver接收。

android:process:设置receiver运行时所处的进程的名称。设置服务所在进程名称是由用户决定的,当进程名以冒号":"开始时 表示该进程是应用的私有进程,这时候会把进程名附加到包名后面形成新的进程名。当进程名是以小写字母开头时,则表示这个服务将运行在一个以这个名字命名的 全局的进程中,但前提是该进程必须具备相应的权限。

<intent-filter>用于指定此广播接收器将用于接收特定的广播类型。

2.2动态注册

BroadcastReceiver的动态注册通过在代码中调用registerReceiver函数,必须在合适的地方调用 unregisterReceiver()注销注动态注册的BroadcastReceiver,例如在Activity的onDestroy函数里注销 广播。

动态注册的代码:

 

[html] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. it = new Intent(Intent.ACTION_EDIT);  
  2. it.putExtra("msg", "boardreceiver test");  
  3. IntentFilter filter = new IntentFilter(Intent.ACTION_EDIT);  
  4. MainActivity.this.receiver = new TestBroadcastReceiver();  
  5. MainActivity.this.registerReceiver(receiver, filter);  


BroadcastReceiver注销:

 

 

[html] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. @Override  
  2. public void onDestroy()  
  3. {  
  4.     super.unregisterReceiver(receiver);  
  5.     super.onStop();  
  6. }  

 

 

3. BroadcastReceiver使用方法

3.1定义BroadcastReceiver

自定义BroadcastReceiver,重写onReceive()方法,当接收到广播时,会回调此方法,在此做需要处理的工作。代码例子如下:

 

[html] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. class TestBroadcastReceiver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         // TODO Auto-generated method stub  
  6.         System.out.println("onReceiver Boardcast test2");  
  7.         if("android.intent.action.EDIT".equals(intent.getAction()))  
  8.         {  
  9.             test.setText("已经接收广播");  
  10.             String msg = intent.getStringExtra("msg");  
  11.             System.out.println("msg" + msg);  
  12.             Toast.makeText(context, "TestBroadcastReceiver2", Toast.LENGTH_SHORT).show();  
  13.         }  
  14.     }  
  15. }  


3.2注册BroadcastReceiver,可以通过静态和动态注册广播。

 

静态注册直接在AndroidManifest.xml里面注册:

 

[html] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. <receiver   
  2.     android:name="com.example.testbroadcastreceiver.TestBroadcastReceiver"   
  3.     android:enabled="true"  
  4.     android:exported="false"  
  5.     android:process=":test"  
  6.     >  
  7.     <intent-filter>  
  8.         <action android:name="android.intent.action.EDIT" />  
  9.     </intent-filter>  
  10. </receiver>  

动态注册:

 

 

[html] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. IntentFilter filter = new IntentFilter(Intent.ACTION_EDIT);  
  2. MainActivity.this.receiver = new TestBroadcastReceiver();  
  3. MainActivity.this.registerReceiver(receiver, filter);  

3.3发送广播

 

调用Context的sendBroadcast()进行发送广播

 

[html] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. Intent it = new Intent(Intent.ACTION_EDIT);  
  2. it.putExtra("msg", "boardreceiver test2222");  
  3. MainActivity.this.sendBroadcast(it);  

3.4接收广播

广播接收完成后将会回调onReceive()方法,在此方法执行需要的操作。需要注意的是,BroadcastReceiver是运行在UI主线程的,所以不能在此做过多耗时的操作。

 

4. 注意问题

1. 一个广播使用了静态注册和动态注册,则会注册两次广播接收者。

2. 当发送广播被不想被除应用第三方接收时,应该给broadcast发送方设置permission权限。

3. 当自己广播接收器需要过滤特定广播来源时,需要给广播接收器设置intent-filter指定接收广播的类型。

4. onReceive()方法运行在主线程,不能做耗时的操作,否则会导致主线程阻塞,需要处理耗时操作时可以通过启动一个service进行处理。

5. 自定义BroadcastReceiver作为Activity的内部类时,需要使用动态注册的方式,否则会报Java.lang.InstantiationException:  no empty constructor异常。

6. 当接收到广播时,会重新创建BroadcastReceiver对象,回调onReceive()函数,之后BroadcastReceiver对象将被销毁。

© 著作权归作者所有

共有 人打赏支持
bengozhong
粉丝 19
博文 476
码字总数 485469
作品 0
深圳
程序员
私信 提问
BroadcastReceiver—简介

Android BroadcastReceiver 简介 在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver 活动(Activity) - 用于表现功能 服务(Service) - 相当于后台运行的 Activity 广播(Br......

zt1212
2012/10/12
0
0
Android 发送和接收自定义广播

android系统会发送许多系统级别的广播,比如屏幕关闭,电池电量低等广播。同样应用可以发起自定义“由开发者定义的”广播。广播是从一个应用内部向另一个应用发送消息的途径之一。 Broadcas...

oschina
2013/10/21
9.8K
0
Android Service 服务(二)—— BroadcastReceiver

一、 BroadcastReceiver简介 BroadcastReceiver,用于异步接收广播Intent,广播Intent是通过调用Context.sendBroadcast()发送、BroadcastReceiver()接收。 广播Intent的发送是通过调用Conte...

长平狐
2013/01/06
145
0
《Android深入透析》之广播(Broadcast)

概述 在android中,Broadcast作为四大组件之一,被广泛的应用在android程序之间的数据传递。举一个大家都比较熟悉的例子来说明。在车上的时候大家都有收听广播的习惯,广播电台通过发送不同频...

朵朵和糖糖
2014/11/12
0
0
Android 监听安装和卸载

Android 应用程序的安装和卸载事件,是由系统进行监听并全局广播的,支持1.5(android 3)以上 因此,如果想要监听获取应用的安装和卸载事件,只需要自定义一个BroadcastReceiver,来对系统广...

长平狐
2013/01/06
117
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 服务管理 Crontba、Ntpdate、Logrotate、Supervisor

crond linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。 另外, 由于使用者自己也可以设置计划任务,所以,...

狼王黄师傅
32分钟前
1
0
Sobel算子和Scharr滤波器

Sobel算子在数学上的本质是微分,对离散信号,是求邻域内的增量。 基本原理:在图像上,对图像信号在某点进行微分,表示图像的某个特征(如,强度、色调或者饱和度)在该点的变换程度。以强度...

yepanl
48分钟前
1
0
Jenkins API 使用

Jenkins 是一款流行的开源持续集成工具,可以用来做一些软件开发的自动化工作,如打包,测试,自动部署等。 Jenkins 中有 view 和 job 的概念, view 相当于组, job 则是具体的任务。 view...

YanWen
49分钟前
5
0
聊聊jest的NodeChecker

序 本文主要研究一下jest的NodeChecker NodeChecker jest-common-6.3.1-sources.jar!/io/searchbox/client/config/discovery/NodeChecker.java public class NodeChecker extends AbstractS......

go4it
57分钟前
3
0
深入分析String.intern和String常量的实现原理

背景 字符串类型在实际应用场景中使用非常频繁,如果为每个字符串常量都生成一个对应的String对象,明显会造成内存的浪费,针对这一问题,虚拟机实现一个字符串常量池的概念,提供了如下实现...

群星纪元
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部