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

本文介绍了Android中如何使用AlarmManager实现全局定时任务,包括执行特定操作和周期性执行,以及如何利用NotificationManager在状态栏显示通知。通过示例代码展示了如何添加、更新闹钟和通知,以及如何响应接收的广播。

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

一.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发送的广播

@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		mContext = 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;
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值