Notification与AlarmManager相结合实现定时本地消息推送

来源:互联网 发布:js获取所有data属性 编辑:程序博客网 时间:2024/05/23 10:59

一.AlarmManager

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作

AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.

示例代码如下:

public static boolean addOrUpdateAlarmNotifycation(Context context,int dplId, Date begbinTime, Date endTime, String dplTitle) {SimpleDateFormat format = new SimpleDateFormat("HH:mm");String begin = format.format(begbinTime);String end = format.format(endTime);long serverTime = System.currentTimeMillis();// long serverTime = System.currentTimeMillis();long startTime = begbinTime.getTime() - 5000;long tostartTime = startTime - serverTime;if (tostartTime > 0) {Intent intent = new Intent();// intent.setClass(context, AlarmReceiver.class);intent.setAction(ActivityUtil.INTENT_ACTION_ADD_ALARM);String content = begin + "-" + end + " 竞猜 " + dplTitle;intent.putExtra(ActivityUtil.INTENT_EXTRA_KEY_ALARM_RECEIVER_ID,dplId);intent.putExtra(ActivityUtil.INTENT_EXTRA_KEY_ALARM_RECEIVER_CONTENT,content);PendingIntent sender = PendingIntent.getBroadcast(context, dplId,intent, PendingIntent.FLAG_UPDATE_CURRENT);Calendar calendar = Calendar.getInstance();calendar.setTimeInMillis(startTime);// calendar.add(Calendar.SECOND, 5);AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),sender);return true;}return false;}


二.NotificationManager 

当用户有没有接到的电话的时候,Android顶部状态栏里就会出现一个小图标。提示用户有没有处理的快讯,当拖动状态栏时,可以查看这些快讯。Android给我们提供了NotificationManager来管理这个状态栏。可以很轻松的完成。

 如果要添加一个Notification,可以按照以下几个步骤
1:获取NotificationManager:
    NotificationManager m_NotificationManager=(NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);
2:定义一个Notification:
    Notification  m_Notification=new Notification();
3:设置Notification的各种属性:
    //设置通知在状态栏显示的图标
    m_Notification.icon=R.drawable.icon;
   //当我们点击通知时显示的内容
   m_Notification.tickerText="Button1 通知内容.....";
   //通知时发出的默认声音
   m_Notification.defaults=Notification.DEFAULT_SOUND;
   //设置通知显示的参数
   Intent   m_Intent=new Intent(NotificationDemo.this,DesActivity.class);       
   PendingIntent m_PendingIntent=PendingIntent.getActivity(NotificationDemo.this, 0, m_Intent, 0);
   m_Notification.setLatestEventInfo(NotificationDemo.this, "Button1", "Button1通知",m_PendingIntent );
   //这个可以理解为开始执行这个通知
   m_NotificationManager.notify(0,m_Notification);
4:既然可以增加同样我们也可以删除。当然是只是删除你自己增加的。
    m_NotificationManager.cancel(0);    
    这里的0是一个ID号码,和notify第一个参数0一样。
    这也就完成了,添加删除工作。

demo代码如下:

public static void HmNotification(Context context, String content, int id) {long when = System.currentTimeMillis();NotificationManager m = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);String title = "通知";Notification n = new Notification();n.when = when;n.icon = R.drawable.ic_launcher;n.tickerText = "通知";n.flags |= Notification.FLAG_AUTO_CANCEL;n.defaults |= Notification.DEFAULT_ALL;n.defaults |= Notification.DEFAULT_LIGHTS;// n.defaults |= Notification.DEFAULT_SOUND;// n.defaults |= Notification.DEFAULT_VIBRATE;Intent intent = new Intent(context, MainActivity.class);PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);n.setLatestEventInfo(context, title, content, pi);m.notify(id, n);}

三.接受AlarmManager发送的广播

@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubmContext = context;if (ActivityUtil.INTENT_ACTION_ADD_ALARM.equals(intent.getAction())) {int id = intent.getExtras().getInt(ActivityUtil.INTENT_EXTRA_KEY_ALARM_RECEIVER_ID);if (ActivityUtil.isApplicationBroughtToBackground(context)) {AcquireWakeLock(500);MyNotification.HmNotification(context,intent.getStringExtra(ActivityUtil.INTENT_EXTRA_KEY_ALARM_RECEIVER_CONTENT),1);ReleaseWakeLock();}} else {}}private PowerManager.WakeLock m_wakeLockObj = null;public void AcquireWakeLock(long milltime) {if (m_wakeLockObj == null) {PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);m_wakeLockObj = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK| PowerManager.ACQUIRE_CAUSES_WAKEUP| PowerManager.ON_AFTER_RELEASE, "AlarmReceiver");m_wakeLockObj.acquire(milltime);}}public void ReleaseWakeLock() {// 取消点亮if (m_wakeLockObj != null && m_wakeLockObj.isHeld()) {m_wakeLockObj.release();m_wakeLockObj = null;}}


0 0
原创粉丝点击