Broadcast Receiver(广播接收器)

本文介绍了Android平台上的广播接收器BroadcastReceiver的基本概念及其使用方法,并通过示例演示了自定义广播接收器的过程。此外,还讲解了如何利用Notification和NotificationManager显示通知,以及AlarmManager的常见用途和设置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Braodcast Receiver顾名思义就是广播接收器,它和时间处理机制类似,但是事件处理机制是程序组件级别的(比如:按钮的单击事件),而广播事件处理机制是系统级别的。我们可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。我们同样可以在自己的应用程序中实现Broadcast Receiver来监听和响应广播的Intent。

事件的广播通过创建Intent对象并调用sendBroadcast()方法将广播发出。事件的接受是通过定义一个继承BroadcastReceiver的类来实现的,继承该类后覆盖其onReceive()方法,在该方法中响应时间。

下面是android系统中定义了很多标准的Broadcast Action来响应系统的广播事件。

①ACTION_TIME_CHANGED(时间改变时触发)

②ACTION_BOOT_COMPLETED(系统启动完成后触发)--比如有些程序开机后启动就是用这种方式来实现的

③ACTION_PACKAGE_ADDED(添加包时触发)

④ACTION_BATTERY_CHANGED(电量低时触发)

详细:标准广播ACTION常量

常量名称

常量值

意义

ACTION_BOOT_COMPLETED

android.intent.action.BOOT_COMPLETED

系统启动完成

ACTION_TIME_CHANGED

android.intent.action.ACTION_TIME_CHANGED

时间改变

ACITON_DATE_CHANGED

android.intent.action.ACTION_DATE_CHANGED

日期改变

ACTION_TIMEZONE_CHANGED

android.intent.action.ACTION_TIMEZONE_CHANGED

时区该表

ACTION_BATTERY_LOW

android.intent.action.ACTION_BATTERY_LOW

电量低

ACTION_MEDIA_EJECT

android.intent.action.ACTION_MEDIA_EJECT

插入或拔出外部媒体

ACTION_MEDIA_BUTTON

android.intent.action.ACTION_MEDIA_BUTTON

按下媒体按钮

ACTION_PACKAGE_ADDED

android.intent.action.ACTION_PACKAGE_ADDED

添加包

ACTION_PACKAGE_REMOVED

android.intent.action.ACTION_PACKAGE_REMOVED

删除包

在这里,要练习3个内容

①自定义Broadcast Receiver

②Notification和NotificationManager的使用

③AlarmManager的使用

1、首先看一个自定义的广播事件的例子

Java代码 收藏代码
  1. packageorg.hualang.broadcast;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.Button;
  8. publicclassBroadCastTestextendsActivity{
  9. /**Calledwhentheactivityisfirstcreated.*/
  10. privatestaticfinalStringMY_ACTION="org.hualang.broadcast.action.MY_ACTION";
  11. privateButtonbtn;
  12. @Override
  13. publicvoidonCreate(BundlesavedInstanceState){
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. btn=(Button)findViewById(R.id.button);
  17. btn.setOnClickListener(newOnClickListener()
  18. {
  19. @Override
  20. publicvoidonClick(Viewarg0){
  21. //TODOAuto-generatedmethodstub
  22. Intentintent=newIntent();
  23. intent.setAction(MY_ACTION);
  24. intent.putExtra("msg","同志们好!同志们辛苦啦!");
  25. sendBroadcast(intent);
  26. }
  27. });
  28. }
  29. }

MyReceiver.java

Java代码 收藏代码
  1. packageorg.hualang.broadcast;
  2. importandroid.content.BroadcastReceiver;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. importandroid.widget.Toast;
  6. publicclassMyReceiverextendsBroadcastReceiver{
  7. @Override
  8. publicvoidonReceive(Contextarg0,Intentarg1){
  9. //TODOAuto-generatedmethodstub
  10. Stringmsg=arg1.getStringExtra("msg");
  11. Toast.makeText(arg0,msg,Toast.LENGTH_LONG).show();
  12. }
  13. }

注意:在AndroidManifest.xml文件中注册

Java代码 收藏代码
  1. <receiverandroid:name="MyReceiver">
  2. <intent-filter>
  3. <actionandroid:name="org.hualang.broadcast.action.MY_ACTION"/>
  4. </intent-filter>
  5. </receiver>



我们还可以在AndroidManifest.xml文件中注销一个广播接收器,一般在Activity.onResume()方法中使用Context.registerReceiver()方法来注册一个广播接收器,在Activity.onPause()中使用unregisterReceiver(r)方法注销一个广播接收器,例如:

//实例化intent过滤器

IntentFilter filter = new IntentFilte();

//实例化Receiver

MyReceiver r = new Receiver();

//注册Receiver

registerReceiver(r,filter);

为了注销一个BroadcastReceiver,应使用Context.unregisterReceiver方法,传入一个BroadcastReceiver实例

//注销

unregisterReceiver(r);

2、下面的是Notification的例子,比如手机来短信的时候,会在屏幕最上边有一个通知,那个就是Notification

DisplayActivity.java

Java代码 收藏代码
  1. packageorg.hualang.notify;
  2. importandroid.app.Activity;
  3. importandroid.app.Notification;
  4. importandroid.app.NotificationManager;
  5. importandroid.app.PendingIntent;
  6. importandroid.content.Intent;
  7. importandroid.os.Bundle;
  8. importandroid.view.View;
  9. importandroid.view.View.OnClickListener;
  10. importandroid.widget.Button;
  11. publicclassDisplayActivityextendsActivity{
  12. privateButtoncancelbtn;
  13. privateNotificationn;
  14. privateNotificationManagernm;
  15. privatestaticfinalintID=1;
  16. publicvoidonCreate(BundlesavedInstanceState)
  17. {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main2);
  20. cancelbtn=(Button)findViewById(R.id.button2);
  21. Stringservice=NOTIFICATION_SERVICE;
  22. nm=(NotificationManager)getSystemService(service);
  23. n=newNotification();
  24. inticon=n.icon=R.drawable.icon;
  25. StringtickerText="喜欢HTC的样子,喜欢defy的配置";
  26. longwhen=System.currentTimeMillis();
  27. n.icon=icon;
  28. n.tickerText=tickerText;
  29. n.when=when;
  30. Intentintent=newIntent(this,NotifyTest2.class);
  31. PendingIntentpi=PendingIntent.getActivity(this,0,intent,0);
  32. n.setLatestEventInfo(this,"MyTitle","MyContent",pi);
  33. nm.notify(ID,n);
  34. cancelbtn.setOnClickListener(cancelListener);
  35. }
  36. privateOnClickListenercancelListener=newOnClickListener()
  37. {
  38. publicvoidonClick(Viewv)
  39. {
  40. nm.cancel(ID);
  41. }
  42. };
  43. }

MyReceiver.java

Java代码 收藏代码
  1. packageorg.hualang.notify;
  2. importandroid.content.BroadcastReceiver;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. publicclassMyReceiverextendsBroadcastReceiver{
  6. @Override
  7. publicvoidonReceive(Contextcontext,Intentintent){
  8. //TODOAuto-generatedmethodstub
  9. Intenti=newIntent();
  10. i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  11. i.setClass(context,DisplayActivity.class);
  12. context.startActivity(i);
  13. }
  14. }

NotifyTest2.java

Java代码 收藏代码
  1. packageorg.hualang.notify;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.Button;
  8. publicclassNotifyTest2extendsActivity{
  9. /**Calledwhentheactivityisfirstcreated.*/
  10. privateButtonbtn;
  11. privatestaticfinalStringMY_ACTION="org.hualang.notify.aciton.MY_ACITON";
  12. @Override
  13. publicvoidonCreate(BundlesavedInstanceState){
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. btn=(Button)findViewById(R.id.button);
  17. btn.setOnClickListener(listener);
  18. }
  19. privateOnClickListenerlistener=newOnClickListener()
  20. {
  21. publicvoidonClick(Viewv)
  22. {
  23. Intentintent=newIntent();
  24. intent.setAction(MY_ACTION);
  25. sendBroadcast(intent);
  26. }
  27. };
  28. }

注册AndroidManifest.xml

Java代码 收藏代码
  1. <receiverandroid:name="MyReceiver">
  2. <intent-filter>
  3. <actionandroid:name="org.hualang.notify.aciton.MY_ACITON"/>
  4. </intent-filter>
  5. </receiver>
  6. <activityandroid:name="DisplayActivity">
  7. </activity>

运行结果如下:




3、下面是AlarmManager的例子,它是一个闹钟,感兴趣的朋友可以自己写一个小闹钟

AlarmManager常用的属性和方法

属性或方法名称

说明

ELAPSED_REALTIME

设置闹钟时间,从系统启动开始

ELAPSED_REALTIME_WAKEUP

设置闹钟时间,从系统启动开始,如火设备休眠则唤醒

INTERVAL_DAY

设置闹钟时间,间隔一天

INTERVAL_FIFTEEN_MINUTES

间隔15分钟

INTERVAL_HALF_DAY

间隔半天

INTERVAL_HALF_HOUR

间隔半小时

INTERVAL_HOUR

间隔1小时

RTC

设置闹钟时间,从系统当前时间开始(System.currentTimeMillis())

RTC_WAKEUP

设置闹钟时间,从系统当前时间开始,设备休眠则唤醒

set(int type,long tiggerAtTime,PendingIntent operation)

设置在某个时间执行闹钟

setRepeating(int type,long triggerAtTiem,long interval,PendingIntent operation)

设置在某个时间重复执行闹钟

setInexactRepeating(int type,long triggerAtTiem,long interval,PendingIntent operation)

是指在某个时间重复执行闹钟,但不是间隔固定时间

AlarmTest.java

Java代码 收藏代码
  1. packageorg.hualang.alarm;
  2. importandroid.app.Activity;
  3. importandroid.app.AlarmManager;
  4. importandroid.app.PendingIntent;
  5. importandroid.content.Intent;
  6. importandroid.os.Bundle;
  7. importandroid.util.Log;
  8. importandroid.view.View;
  9. importandroid.view.View.OnClickListener;
  10. importandroid.widget.Button;
  11. publicclassAlarmTestextendsActivity{
  12. /**Calledwhentheactivityisfirstcreated.*/
  13. privateButtonbtn1,btn2;
  14. privatestaticfinalStringBC_ACTION="org.hualang.alarm.action.BC_ACTION";
  15. @Override
  16. publicvoidonCreate(BundlesavedInstanceState){
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.main);
  19. btn1=(Button)findViewById(R.id.button1);
  20. btn2=(Button)findViewById(R.id.button2);
  21. finalAlarmManageram=(AlarmManager)getSystemService(ALARM_SERVICE);
  22. Intentintent=newIntent();
  23. intent.setAction(BC_ACTION);
  24. intent.putExtra("msg","你该起床了");
  25. finalPendingIntentpi=PendingIntent.getBroadcast(AlarmTest.this,0,intent,0);
  26. finallongtime=System.currentTimeMillis();
  27. btn1.setOnClickListener(newOnClickListener()
  28. {
  29. publicvoidonClick(Viewv)
  30. {
  31. am.setRepeating(AlarmManager.RTC_WAKEUP,time,5*1000,pi);
  32. }
  33. });
  34. btn2.setOnClickListener(newOnClickListener()
  35. {
  36. publicvoidonClick(Viewv)
  37. {
  38. am.cancel(pi);
  39. }
  40. });
  41. }
  42. }

MyReceiver.java

Java代码 收藏代码
  1. packageorg.hualang.alarm;
  2. importandroid.content.BroadcastReceiver;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. importandroid.util.Log;
  6. importandroid.widget.Toast;
  7. publicclassMyReceiverextendsBroadcastReceiver{
  8. @Override
  9. publicvoidonReceive(Contextcontext,Intentintent){
  10. //TODOAuto-generatedmethodstub
  11. Stringmsg=intent.getStringExtra("msg");
  12. Log.v("SERVICE","QIAN----------------------");
  13. Toast.makeText(context,msg,Toast.LENGTH_LONG).show();
  14. Log.v("SERVICE","HOU-----------------------");
  15. }
  16. }

注册AndroidManifest.xml

Java代码 收藏代码
  1. <receiverandroid:name="MyReceiver">
  2. <intent-filter>
  3. <actionandroid:name="org.hualang.alarm.action.BC_ACTION"/>
  4. </intent-filter>
  5. </receiver>

运行结果:




点击设置闹钟后,会每隔5秒弹出一个Toast,点击取消闹钟就不会弹出了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值