Android广播事件机制及应用(实现简单的定时提醒功能)

    博客分类:
  • android 研发
涉及的主要内容:1) AlarmManager 和 PendingIntent 2) BroadReceiver 3) Notification and NotificationManager

1.Android广播事件机制
Android的广播事件处理类似于普通的事件处理。不同之处在于,后者是靠点击按钮这样的组件行为来触发,而前者是通过构建Intent对象,使用sentBroadcast()方法来发起一个系统级别的事件广播来传递信息。广播事件的接收是通过定义一个继承Broadcast Receiver的类实现的,继承该类后覆盖其onReceive()方法,在该方法中响应事件。Android系统中定义了很多标准的Broadcast Action来响应系统广播事件。例如:ACTION_TIME_CHANGED(时间改变时触发)。但是,我们也可以自己定义Broadcast Receiver接收广播事件。
2.实现简单的定时提醒功能
主要包括三部分部分:
1) 定时 - 通过定义Activity发出广播
2) 接收广播 - 通过实现BroadcastReceiver接收广播
3) 提醒 - 并通过Notification提醒用户
现在我们来具体实现这三部分:
2.1 如何定时,从而发出广播呢?
现在的手机都有闹钟的功能,我们可以利用系统提供的闹钟功能,来定时,即发出广播。具体地,在Android开发中可以用AlarmManager来实现。
AlarmManager 提供了一种系统级的提示服务,允许你安排在某个时间执行某一个服务。
AlarmManager的使用步骤说明如下:
1)获得AlarmManager实例: AlarmManager对象一般不直接实例化,而是通过Context.getSystemService(Context.ALARM_SERVIECE) 方法获得
2)定义一个PendingIntent来发出广播。
3)调用AlarmManager的相关方法,设置定时、重复提醒等功能。
详细代码如下(ReminderSetting.java):
Java代码 收藏代码
  1. packagecom.Reminder;
  2. importjava.util.Calendar;
  3. importandroid.app.Activity;
  4. importandroid.app.AlarmManager;
  5. importandroid.app.PendingIntent;
  6. importandroid.content.Intent;
  7. importandroid.os.Bundle;
  8. importandroid.view.View;
  9. importandroid.widget.Button;
  10. /**
  11. *triggertheBroadcasteventandsetthealarm
  12. */
  13. publicclassReminderSettingextendsActivity{
  14. ButtonbtnEnable;
  15. /**Calledwhentheactivityisfirstcreated.*/
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. /*createabutton.Whenyouclickthebutton,thealarmclockisenabled*/
  21. btnEnable=(Button)findViewById(R.id.btnEnable);
  22. btnEnable.setOnClickListener(newView.OnClickListener(){
  23. @Override
  24. publicvoidonClick(Viewv){
  25. setReminder(true);
  26. }
  27. });
  28. }
  29. /**
  30. *Setthealarm
  31. *
  32. *@parambwhetherenabletheAlarmclockornot
  33. */
  34. privatevoidsetReminder(booleanb){
  35. //gettheAlarmManagerinstance
  36. AlarmManageram=(AlarmManager)getSystemService(ALARM_SERVICE);
  37. //createaPendingIntentthatwillperformabroadcast
  38. PendingIntentpi=PendingIntent.getBroadcast(ReminderSetting.this,0,newIntent(this,MyReceiver.class),0);
  39. if(b){
  40. //justusecurrenttimeastheAlarmtime.
  41. Calendarc=Calendar.getInstance();
  42. //scheduleanalarm
  43. am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),pi);
  44. }
  45. else{
  46. //cancelcurrentalarm
  47. am.cancel(pi);
  48. }
  49. }
  50. }

2.2 接收广播
新建一个class 继承BroadcastReceiver,并实现onReceive()方法。当BroadcastReceiver接收到广播后,就会去执行OnReceive()方法。所以,我们在OnReceive()方法中加上代码,当接收到广播后就跳到显示提醒信息的Activity。具体代码如下( MyReceiver.java):
Java代码 收藏代码
  1. packagecom.Reminder;
  2. importandroid.content.BroadcastReceiver;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. /**
  6. *Receivethebroadcastandstarttheactivitythatwillshowthealarm
  7. */
  8. publicclassMyReceiverextendsBroadcastReceiver{
  9. /**
  10. *calledwhentheBroadcastReceiverisreceivinganIntentbroadcast.
  11. */
  12. @Override
  13. publicvoidonReceive(Contextcontext,Intentintent){
  14. /*startanotheractivity-MyAlarmtodisplaythealarm*/
  15. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  16. intent.setClass(context,MyAlarm.class);
  17. context.startActivity(intent);
  18. }
  19. }

注意:创建完BroadcastReceiver后,需要在AndroidManifest.xml中注册:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name= "com.Reminder.MyReceiver" />
</intent-filter>
</receiver>
2.3 提醒功能
新建一个Activity,我们在这个Activity中通过Android的Notification对象来提醒用户。我们将添加提示音,一个TextView来显示提示内容和并一个button来取消提醒。
其中,创建Notification主要包括:
1)获得系统级得服务NotificationManager,通过 Context.getSystemService(NOTIFICATION_SERVICE)获得。
2)实例化Notification对象,并设置各种我们需要的属性,比如:设置声音。
3)调用NotificationManager的notify()方法显示Notification
详细代码如下:MyAlarm.java
Java代码 收藏代码
  1. packagecom.Reminder;
  2. importandroid.app.Activity;
  3. importandroid.app.Notification;
  4. importandroid.app.NotificationManager;
  5. importandroid.net.Uri;
  6. importandroid.os.Bundle;
  7. importandroid.provider.MediaStore.Audio;
  8. importandroid.view.View;
  9. importandroid.widget.Button;
  10. importandroid.widget.TextView;
  11. /**
  12. *Displaythealarminformation
  13. */
  14. publicclassMyAlarmextendsActivity{
  15. /**
  16. *Anidentifierforthisnotificationuniquewithinyourapplication
  17. */
  18. publicstaticfinalintNOTIFICATION_ID=1;
  19. @Override
  20. protectedvoidonCreate(BundlesavedInstanceState){
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.my_alarm);
  23. //createtheinstanceofNotificationManager
  24. finalNotificationManagernm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
  25. //createtheinstanceofNotification
  26. Notificationn=newNotification();
  27. /*setthesoundofthealarm.Therearetwowayofsettingthesound*/
  28. //n.sound=Uri.parse("file:///sdcard/alarm.mp3");
  29. n.sound=Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI,"20");
  30. //Postanotificationtobeshowninthestatusbar
  31. nm.notify(NOTIFICATION_ID,n);
  32. /*displaysomeinformation*/
  33. TextViewtv=(TextView)findViewById(R.id.tvNotification);
  34. tv.setText("Hello,it'stimetoblabla...");
  35. /*thebuttonbywhichyoucancancelthealarm*/
  36. ButtonbtnCancel=(Button)findViewById(R.id.btnCancel);
  37. btnCancel.setOnClickListener(newView.OnClickListener(){
  38. @Override
  39. publicvoidonClick(Viewarg0){
  40. nm.cancel(NOTIFICATION_ID);
  41. finish();
  42. }
  43. });
  44. }
  45. }

注:关于提示音设置(Notification.sound),可以参考: http://developer.android.com/guide/topics/ui/notifiers/notifications.html中的相关部分。

更多相关文章

  1. [转]NDK中log输出方法
  2. 如何在Android上编写高效的Java代码
  3. Android应用程序设置系统时间的方法
  4. Android冷启动实现app秒开的实现代码
  5. Android基于多触控的图片缩放和拖动代码实现
  6. android常驻通知栏点击事件
  7. Android中使用代码控制Wifi及数据连接网络开关

随机推荐

  1. 解决SQLServer远程连接失败的问题
  2. 实例讲解SQL Server加密功能
  3. SQL如何实现MYSQL的递归查询
  4. sql server建库、建表、建约束技巧
  5. sql server 2000 数据库自动备份设置方法
  6. sql server创建临时表的两种写法和删除临
  7. 如何优化SQL语句(全)
  8. sql server 2000中禁止创建表(权限设置方
  9. 为什么我们需要在SQL Server里更新锁
  10. 简单介绍SQL Server里的闩锁