Android笔记三十三.BroadcastReceiver使用

广播是一种广泛运用在应用程序之间传输信息的机制,而BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件。

BroadcastReceiver本质上是一种全局监听器。用于监听系统全局的广播消息并接收指定的广播,因此它能够很方便地实现系统中不同组件之间的通信。例如以下为BroadcastReceiver知识点结构:

一、发送与接收广播

1.发送广播  

广播的发送通过调用Context.sendBroadcast()、Context.sendOderedBroadcast()来实现:

(1)Context.sendBroadcast(Intent
intent):用于发送普通广播。当中intent參数表示接收该广播的广播接收者所须要满足的条件,以及广播所传递的数据;

(2)Context.sendOderedBroadcast(Intent intent, String receiverPermission):用于发送有序广播。intent參数同上。receiverPermission表示接收该广播的许可权限。

2.接收广播  
 

广播的接收,则利用组件BroadcastReceiver是对发送出来的广播进行过滤接收并响应指定的广播。通常一个广播能够被订阅了该Intnet的多个广播接收者所接收。如同一个广播台。能够被多个多位听众收听一样。

启动BroadcastReceiver步骤:

(1)创建Intent,指定BroadcastReceiver的特征;

(2)调用Context的sendBroadcast()(发送普通广播)或sendOrderBroadcast()(发送有序广播)方法来发送广播,触发指定的BroadcasttReceiver。

为此,当应用程序发出一个广播之后,全部匹配该Intent的BroadcastReceiver都有可能被启动。

二、广播的分类

1.普通广播

是全然异步的。能够在同一时刻(逻辑上)被全部接收者接收到,消息传递的效率比較高。

但缺点是接收者不能将处理结果传递给下一个接收者。而且无法终止Broadcast
Intent的传播。

2.有序广播

该广播的接收者将按预先声明的优先级次序接收广播。

有序广播接收者能够终止广播的传播(通过调用abortBroadcast()方法)。广播的传播一旦终止,后面的接收者就无法接收到广播。另外,广播的接收者能够将数据传递给下一个接收者(通过setResultExtras(Bundle
bundle)方法)。

三、BroadcastReceiver应用开发步骤

BroadcastReceiver自身并不实现图形用户界面,可是当它收到某个消息之后,能够启动Activity作为响应,或者通过NotificationManager提醒用户,或者启动Service等等。

1.创建广播接收器

实现一个继承于BroadcastReceiver基类的子类,并实现里面的onReceiver()方法;

  1. public class MyBroadcastReceiver extends BroadcastReceiver
  2. {
  3. public void onReceiver(Context context,Intent intent){
  4. }
  5. }

在onReceiver()方法中,接收了一个Intent的參数,通过它能够获取广播所携带的数据。也能够启动一个Service服务来处理耗时任务等。

2.发送广播,并指定该广播的Intent属性

广播接收者注冊好了以后。并不会直接执行,必须在接收广播之后才会被调用。因此。必须首先发送广播,在Activity或Service调用Context的sendBroadcast(Intent
intent)或sendOrderedBroadcast(Intent intent, String receiverPermission)发送广播。

3.注冊广播接收器。指定其接收哪一个广播。

创建完广播接收者后。并不能立即使用,还必须为它(广播接收者)注冊一个指定的广播。就如同我们有了收音机后,还必须选择收听哪个频道一样。

(1)静态注冊:是指在AndroidManifest.xml文件里进行注冊。

  1. <receiver android:name=".MyBroadcastReceiver">
  2. <intent-filter>
  3. <action
  4. android:name = "com.jiangdongguo.android.myBroadcastReceover">
  5. <action/>
  6. </intent-filter>
  7. </receiver>

(2)动态注冊:须要在代码中动态的指定广播地址并注冊,一般是在Activity或Service中调用ContextWrapper的

  1. MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
  2. IntentFilter filter = new IntentFilter("com.jiangdongguo.android.myBroadcastReceover"); //指定接收哪个广播
  3. registerReceiver(BroadcastReceiver receiver。IntentFilter filter)方法进行注冊

当中,MyBroadcastReceiver为基类BroadcastReceiver子类。

注冊完毕后。就可以接收相应的广播消息。一旦广播(Broadcast)事件发生后,系统就会创建相应的BroadcastRecevier实例,并自己主动触发它的onReceiver()方法,onReceiver()方法运行后,BroadcastReceiver的实例就会被销毁。

三、源代码实战

实现:在Activity中启动一个广播,通过广播接收器接收该广播并作出响应。

1.MyBroadcastReceiver.java:

继承于BroadcastReceiver子类-广播接收器,用于接收指定广播并作出对应响应。

  1. package com.example.mybroadcast;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.widget.Toast;
  6. /*BroadcastReceiver子类
  7. * 用于接收指定发送广播*/
  8. public class MyBroadcastReceiver extends BroadcastReceiver {
  9. @Override
  10. public void onReceive(Context arg0, Intent arg1) {
  11. Toast.makeText(arg0, "我是BroadcastReceiver,我已经接收到发送的广播。", Toast.LENGTH_SHORT).show();
  12. }
  13. }

凝视:我们能够在onReceiver()方法中获取Intent携带的数据,也能够启动一个Service服务来运行耗时任务等。

2.MainActivity.java

主Activity。用于发送一个广播。或者能够取代AdroidManifest.xmlproject文件注冊广播接收器

  1. package com.example.mybroadcast;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.content.IntentFilter;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. public class MainActivity extends Activity {
  10. private Button sendBroad;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. /*1.广播接收器注冊方式二:注冊一个广播接收器*/
  16. MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
  17. IntentFilter filter = new IntentFilter("com.jiangdongguo.Android.BroadcastReceiver");
  18. registerReceiver(myBroadcastReceiver,filter);
  19. sendBroad = (Button)findViewById(R.id.send);
  20. sendBroad.setOnClickListener(new OnClickListener(){
  21. public void onClick(View v) {
  22. /*2.发送一个广播,并指明其action属性*/
  23. //a.指明该广播的action属性
  24. Intent intent = new Intent("com.jiangdongguo.Android.BroadcastReceiver");
  25. //b.发送广播
  26. sendBroadcast(intent);
  27. }
  28. });
  29. }
  30. }

3.AndroidManifest.xml

project文件。在这里的作用是添加对BroadcastReceiver注冊。

  1. <?xml version="1.0" encoding="utf-8"?

    >
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.mybroadcast"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="14" />
  9. <application
  10. android:allowBackup="true"
  11. android:icon="@drawable/ic_launcher"
  12. android:label="@string/app_name"
  13. android:theme="@style/AppTheme" >
  14. <activity
  15. android:name=".MainActivity"
  16. android:label="@string/app_name" >
  17. <intent-filter>
  18. <action android:name="android.intent.action.MAIN" />
  19. <category android:name="android.intent.category.LAUNCHER" />
  20. </intent-filter>
  21. </activity>
  22. <!--广播接收器注冊方式一: 接收的哪一个广播-->
  23. <!--         <receiver android:name=".MyBroadcastReceiver">
  24. <intent-filter >
  25. <action android:name="com.jiangdongguo.Android.BroadcastReceiver"/>
  26. </intent-filter>
  27. </receiver> -->
  28. </application>
  29. </manifest>

效果演示:

源代码分析:

(1)假设确定须要依据广播来完毕一项比較耗时的操作,则能够考虑通过Intent启动一个Service来完毕操作。不应考虑使用新线程去完毕耗时的操作。由于BroadcastReceiver本身的生命周期极短,可能出现的情况是子线程可能没有结束,BroadcastReceiver就已经退出了。

(2)假设广播接收者所在的进程结束了,尽管该进程内还实用户启动的新线程。但因为该进程内不包括不论什么活动组件,因此系统可能在内存紧张时优先结束线程。

这样就可能导致BroadcastReceiver启动的子线程不能运行完毕。

时间: 2024-08-03 08:38:24

Android笔记三十三.BroadcastReceiver使用的相关文章

【Unity 3D】学习笔记三十三:游戏元素——天空盒子

天空盒子 一般的3D游戏都会有着北京百年一遇的蓝天,让人惊叹不已.其实天空这个效果没有什么神秘的只需用到天空盒子这个组件就行,可以将天空设想成一个巨大的盒子,这个盒子将整个游戏视图和所有的游戏元素包含其中.在unity中制作天空盒子非常方便,只需要像设置其他组件一样设置下就行了.在制作天空盒子之前,我们需要搜集一些天空的贴图,不过,unity很方便的为开发者提供了天空盒子的资源包.首先在project视图中点击鼠标右键,然后选择import package--skyboxes即可添加天空盒子的资

Android笔记三十二.Android位置服务及核心API

一.位置服务概念 1.位置服务 位置服务(Location-Based Services,LBS),又称定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供了与个空间位置相关的综合应用服务. 2.GPS与网络位置提供器 Android平台支持提供位置服务的API,可以利用GPS(Global Positioning System,全球定位系统)和Network Location Provider(网络位置提供器)来获得用户的位置. (1)GPS相对来说更精确,但它只能在户外

Android笔记三十四.Service综合实例二

综合实例2:client訪问远程Service服务 实现:通过一个button来获取远程Service的状态,并显示在两个文本框中. 思路:如果A应用须要与B应用进行通信,调用B应用中的getName().getAuthor()方法,B应用以Service方式向A应用提供服务.所以.我们能够将A应用看成是client,B应用为服务端,分别命名为AILDClient.AILDServer. 一.服务端应用程序 1.src/com.example.aildserver/song.aidl:AILD文

Android笔记二十三.Android基于事件监听器处理机制

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.Android的事件处理 Android事件处理包括两个部分:Android事件处理机制(基本)和Android消息传递机制(进阶).前者包含三种处理方式,即基于监听的事件处理.基于回调的事件处理.直接绑定到标签;后者包含两种处理方式,即Handler消息传递.异步任务处理. 1.Android的事件处理机制 (1)基于监听的事件处理方式 通常做法是为Android界面组件绑定特定的事件监听

Android笔记(十三)AsyncTask

异步任务的主要作用是来处理一些耗时的操作,给用户带来良好的用户体验.下面我们就来新建一个异步任务,完成下载图片的任务. 一.建立布局,通过点击按钮来执行异步任务. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=&

Android笔记(七十三) Android权限问题整理 非常全面

Android权限系统非常庞大,我们在Android系统中做任何操作都需要首先获取Android系统权限,本文记录了所有的Android权限问题,整理一下分享给大家. 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~150

Android笔记(六十三) android中的动画——逐帧动画( frame-by-frame animation)

就好像演电影一样,播放实现准备好的图片,来实现动画效果. 逐帧动画需要用到AnimationDrawable类,该类主要用于创建一个逐帧动画,然后我们把这个动画设置为view的背景即可. android提供两种方法为AnimationDrawable添加帧:XML定义和JAVA代码创建. XML 因为动画帧的资源需要是一个Drawable对象,所以需要把它放到Drawable目录下.在<animation-list>使用<item>来添加一帧 anima.xml <?xml

学习笔记三十三:IO流(四)

一无所有是一种财富,它让穷人产生改变命运的行动. 本讲内容:RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件. RandomAccessFile不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOu

PHP学习笔记三十三【自定义错误处理器】

<?php //自定义错误处理器 //$errorno 错误号 //$errmes错误信息 //这两个参数是必须的 function my_error($errorno,$errmes) { echo "<font size='5' color='red'>$errorno</font><br/>"; echo "错误信息是:$errmes"; } //必须重写set_error_handler处理器 set_error_h