Presentation is loading. Please wait.

Presentation is loading. Please wait.

第9章 BroadcastReceiver的使用

Similar presentations


Presentation on theme: "第9章 BroadcastReceiver的使用"— Presentation transcript:

1 第9章 BroadcastReceiver的使用

2 本章知识结构图

3 BroadcastReceiver介绍 广播是一种广泛运用在应用程序之间传输信息的机制,BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件。 BroadcastReceiver 本质上是一种全局监听器,用于监听系统全局的广播消息,因此它可以非常方便地实现系统中不同组件之间的通信。 BroadcastReceiver用于接收指定的广播,广播的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcat()来实现的。通常一个广播可以被订阅了该Intent的多个广播接收者所接收,如同一个广播台,可以被多位听众收听一样。

4 BroadcastReceiver介绍 BroadcastReceiver自身并不实现图形用户界面,但是当它收到某个消息后,可以启动Activity作为响应,或者通过NotificationManager提醒用户,或者启动Service等等。 启动BroadcastReceiver通常需要以下两步: 1、创建Intent,指定BroadcastReceiver的特征; 2、调用Context的sendBroadcast()(发送普通广播)或sendOrderedBroadcast()(发送有序广播)方法来发送广播,触发指定的BroadcastReceiver。 当应用程序发出一个广播之后,所有匹配该Intent的BroadcastReceiver都有可能被启动。

5 BroadcastReceiver介绍 开发自定义的BroadcastReceiver与开发其他组件一样,需要继承Android中的BroadcastReceiver基类,然后实现onReceive()处理业务逻辑。 public class MyBroadcastReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { } 在onReceive()方法中,接收了一个Intent的参数,通过它可以获取广播所携带的数据。

6 BroadcastReceiver介绍 创建完广播接收者后,并不能马上使用,还必须为它注册一个指定的广播,就如同我们有了收音机后,还必须选择收听哪个频道一样。在Android中为BroadcastReceiver注册广播有两种方式:静态注册和动态注册。 静态注册:是指在AndroidManifest.xml文件中进行注册。 <receiver android:name=".MyBroadcastReceiver"> <intent-filter > <action android:name="iet.jxufe.cn.android.myBroadcastReceiver"> </action> </intent-filter> </receiver>

7 BroadcastReceiver介绍 动态注册:需要在代码中动态的指定广播地址并注册,通常是在Activity或Service中调用ContextWrapper的registerReceiver(BroadcastReceiver receiver,IntentFilter filter)方法进行注册。 MyBroadcastReceiver myBroadcastReceiver=new MyBroadcastReceiver(); IntentFilter filter=new IntentFilter("iet.jxufe.cn.android.myBroadcastReceiver"); registerReceiver(myBroadcastReceiver, filter); 注册完成后,即可接收相应的广播消息。广播发生后,系统会创建对应的BroadcastReceiver实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。

8 BroadcastReceiver介绍 如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在onReceive()方法里执行一些耗时的操作,否则会弹出ANR(Application No Response)对话框。 如果确实需要根据广播来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作。不应考虑使用新线程去完成耗时的操作,因为BroadcastReceiver本身的生命周期极短,可能出现的情况是子线程可能还没有结束,BroadcastReceiver就已经退出了。 如果广播接收者所在的进程结束了,虽然该进程内还有用户启动的新线程,但由于该进程内不包含任何活动组件,因此系统可能在内存紧张时优先结束线程。这样就可能导致BroadcastReceiver启动的子线程不能执行完成。

9 发送广播的两种方式 广播接收者注册好了以后,并不会直接运行,必须在接收广播后才会被调用。因此,必须首先发送广播,在Android中提供了两种发送广播的方式,调用Context的sendBroadcast()或sendOrderedBroadcast()方法。 sendBroadcast(Intent intent):用于发送普通广播,其中intent参数表示接收该广播的广播接收者所需要满足的条件,以及广播所传递的数据; sendOrderedBroadcast(Intent intent, String receiverPermission):用于发送有序广播,intent参数同上,receiverPermission表示接收该广播的许可权限。

10 广播的分类 普通广播(Normal Broadcast):是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高。但缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止Broadcast Intent的传播。 有序广播(Ordered Broadcast):有序广播的接收者将按预先声明的优先级依次接收广播。有序广播接收者可以终止广播的传播(通过调用abortBroadcast()方法),广播的传播一旦终止,后面的接收者就无法接收到广播。另外,广播的接收者可以将数据传递给下一个接收者(通过setResultExtras(Bundle bundle)方法)。

11 案例—音乐播放器 案例实现简单音乐播放功能,能够播放、暂停和停止音乐,一首歌播放结束后能够自动播放下一首歌,并且界面显示会根据用户操作进行相应更新。当单击播放按钮时,会显示正在播放的歌曲,并且播放按钮变为暂停按钮。当一首歌曲播放结束后,会自动播放下一首,当单击停止按钮后,音乐停止播放,并且暂停按钮会变为播放按钮。

12 案例—音乐播放器 基于Service的音乐播放器
程序的音乐将会由后台运行的Service组件负责播放,当后台的播放状态发生改变时,程序将会发送广播通知前台Activity更新界面;当用户单击前台Activity的界面按钮时,系统将通过发送广播通知后台Service来改变播放状态。 此程序中包含两个BroadcastReceiver(广播接收器)和一个Service服务。 一个广播接收器用于接收播放状态发生改变的广播; 一个广播接收器用于接收歌曲播放完成时发送的广播。

13 案例—音乐播放器

14 案例—音乐播放器 开发步骤 1、Activity的界面布局,在Activity中内嵌一个广播接收器ActivityReceiver,用于接收来自Service的广播。 2、为相应的按钮添加单击事件,在单击事件中发送广播; 3、开发音乐播放的服务(MusicService),并在服务中内嵌一个广播接收器ServiceReceiver,用于接收来自Activity的广播; 4、分别编写广播接收器的业务逻辑处理;

15 案例—音乐播放器 注意事项 1、由于音乐文件比较大,如果直接放到应用程序中将会导致最终的apk非常大,运行也比较慢,实际上大部分的音乐播放器播放的都是手机上已有的音乐,或者在线音乐。如果要获取手机上的音乐,可通过ContentProvider进行操作,在此,简化操作,直接指定音乐的路径。 2、需在清单文件中对播放音乐的服务进行注册; 3、为了使广播接收器能够方便的访问Activity或Service中的成员,建议将广播接收器作为它们的内部类; 4、音乐播放需要使用到MediaPlayer类;

16 案例—音乐播放器 由播放到暂停 由暂停到播放 public void play(View view){
Intent intent=new Intent(MainActivity.Broadcast_Activity); if(isPlaying){ isPlaying=false; intent.putExtra("type",2); playBtn.setImageResource(R.drawable.play); }else{ intent.putExtra("type",1); isPlaying=true; playBtn.setImageResource(R.drawable.pause); } sendBroadcast(intent); 由播放到暂停 由暂停到播放 播放/暂停按钮事件处理

17 案例—音乐播放器 public void start(){ try {
mPlayer.setDataSource(paths[current]); mPlayer.prepare(); mPlayer.start(); Intent intent=new Intent(MainActivity.Broadcast_Service); intent.putExtra("title",titles[current]); intent.putExtra("singer",singers[current]); sendBroadcast(intent); } catch (IOException e) { e.printStackTrace(); } 设置音乐路径 准备 开始播放 创建并发送广播

18 测试题 1.注册广播接收器有哪两种方式? 2.有序广播有什么特点? 3.下列关于有序广播的说法错误的是( )。
3.下列关于有序广播的说法错误的是( )。 A)发送有序广播时,符合要求的广播接收者根据优先级来排序进行接收 B)优先级高的广播接收者可向优先级低的广播接收者传值 C)优先接收到广播的接收者可以终止广播,优先级低的则无法接收 D)优先级低的广播接收者只能得到它前一个广播接收者传递的值,而无法得到更前面的广播接收者传递的值 4.在原有音乐播放器基础之上,为其添加两个按钮用于控制播放上一首和下一首音乐。尝试添加拖动条(SeekBar)来控制音乐播放的进度。

19


Download ppt "第9章 BroadcastReceiver的使用"

Similar presentations


Ads by Google