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、首先看一个自定义的广播事件的例子
- packageorg.hualang.broadcast;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- publicclassBroadCastTestextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- privatestaticfinalStringMY_ACTION="org.hualang.broadcast.action.MY_ACTION";
- privateButtonbtn;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn=(Button)findViewById(R.id.button);
- btn.setOnClickListener(newOnClickListener()
- {
- @Override
- publicvoidonClick(Viewarg0){
- //TODOAuto-generatedmethodstub
- Intentintent=newIntent();
- intent.setAction(MY_ACTION);
- intent.putExtra("msg","同志们好!同志们辛苦啦!");
- sendBroadcast(intent);
- }
- });
- }
- }
MyReceiver.java
- packageorg.hualang.broadcast;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.widget.Toast;
- publicclassMyReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextarg0,Intentarg1){
- //TODOAuto-generatedmethodstub
- Stringmsg=arg1.getStringExtra("msg");
- Toast.makeText(arg0,msg,Toast.LENGTH_LONG).show();
- }
- }
注意:在AndroidManifest.xml文件中注册
- <receiverandroid:name="MyReceiver">
- <intent-filter>
- <actionandroid:name="org.hualang.broadcast.action.MY_ACTION"/>
- </intent-filter>
- </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
- packageorg.hualang.notify;
- importandroid.app.Activity;
- importandroid.app.Notification;
- importandroid.app.NotificationManager;
- importandroid.app.PendingIntent;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- publicclassDisplayActivityextendsActivity{
- privateButtoncancelbtn;
- privateNotificationn;
- privateNotificationManagernm;
- privatestaticfinalintID=1;
- publicvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main2);
- cancelbtn=(Button)findViewById(R.id.button2);
- Stringservice=NOTIFICATION_SERVICE;
- nm=(NotificationManager)getSystemService(service);
- n=newNotification();
- inticon=n.icon=R.drawable.icon;
- StringtickerText="喜欢HTC的样子,喜欢defy的配置";
- longwhen=System.currentTimeMillis();
- n.icon=icon;
- n.tickerText=tickerText;
- n.when=when;
- Intentintent=newIntent(this,NotifyTest2.class);
- PendingIntentpi=PendingIntent.getActivity(this,0,intent,0);
- n.setLatestEventInfo(this,"MyTitle","MyContent",pi);
- nm.notify(ID,n);
- cancelbtn.setOnClickListener(cancelListener);
- }
- privateOnClickListenercancelListener=newOnClickListener()
- {
- publicvoidonClick(Viewv)
- {
- nm.cancel(ID);
- }
- };
- }
MyReceiver.java
- packageorg.hualang.notify;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- publicclassMyReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- //TODOAuto-generatedmethodstub
- Intenti=newIntent();
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- i.setClass(context,DisplayActivity.class);
- context.startActivity(i);
- }
- }
NotifyTest2.java
- packageorg.hualang.notify;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- publicclassNotifyTest2extendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- privateButtonbtn;
- privatestaticfinalStringMY_ACTION="org.hualang.notify.aciton.MY_ACITON";
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn=(Button)findViewById(R.id.button);
- btn.setOnClickListener(listener);
- }
- privateOnClickListenerlistener=newOnClickListener()
- {
- publicvoidonClick(Viewv)
- {
- Intentintent=newIntent();
- intent.setAction(MY_ACTION);
- sendBroadcast(intent);
- }
- };
- }
注册AndroidManifest.xml
- <receiverandroid:name="MyReceiver">
- <intent-filter>
- <actionandroid:name="org.hualang.notify.aciton.MY_ACITON"/>
- </intent-filter>
- </receiver>
- <activityandroid:name="DisplayActivity">
- </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
- packageorg.hualang.alarm;
- importandroid.app.Activity;
- importandroid.app.AlarmManager;
- importandroid.app.PendingIntent;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- publicclassAlarmTestextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- privateButtonbtn1,btn2;
- privatestaticfinalStringBC_ACTION="org.hualang.alarm.action.BC_ACTION";
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn1=(Button)findViewById(R.id.button1);
- btn2=(Button)findViewById(R.id.button2);
- finalAlarmManageram=(AlarmManager)getSystemService(ALARM_SERVICE);
- Intentintent=newIntent();
- intent.setAction(BC_ACTION);
- intent.putExtra("msg","你该起床了");
- finalPendingIntentpi=PendingIntent.getBroadcast(AlarmTest.this,0,intent,0);
- finallongtime=System.currentTimeMillis();
- btn1.setOnClickListener(newOnClickListener()
- {
- publicvoidonClick(Viewv)
- {
- am.setRepeating(AlarmManager.RTC_WAKEUP,time,5*1000,pi);
- }
- });
- btn2.setOnClickListener(newOnClickListener()
- {
- publicvoidonClick(Viewv)
- {
- am.cancel(pi);
- }
- });
- }
- }
MyReceiver.java
- packageorg.hualang.alarm;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.util.Log;
- importandroid.widget.Toast;
- publicclassMyReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- //TODOAuto-generatedmethodstub
- Stringmsg=intent.getStringExtra("msg");
- Log.v("SERVICE","QIAN----------------------");
- Toast.makeText(context,msg,Toast.LENGTH_LONG).show();
- Log.v("SERVICE","HOU-----------------------");
- }
- }
注册AndroidManifest.xml
- <receiverandroid:name="MyReceiver">
- <intent-filter>
- <actionandroid:name="org.hualang.alarm.action.BC_ACTION"/>
- </intent-filter>
- </receiver>
运行结果:
点击设置闹钟后,会每隔5秒弹出一个Toast,点击取消闹钟就不会弹出了