android AlarmManager的使用


Android的闹钟实现机制很简单, 只需要调用AlarmManager.Set()方法将闹钟设置提交给系统,当闹钟时间到后,系统会按照我们的设定发送指定的广播消息,我们写一个广播去接收消息做相应处理即可。

第一步是设置闹钟:


<span style="color: rgb(51, 51, 51); font-family: 'Microsoft YaHei', Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; line-height: 21px; ">private static String MY_ALARM_ACTION = "android.alarm.test.action";</span>	
<span style="white-space:pre">	</span>/**
	 * 设置闹钟
	 * @param context 
	 * @param firstTriggerTimeMillis 首次触发时间 (单位毫秒)
	 * @param periodTimeMillis 间隔时间
	 */
	private void setAlarmTime(Context context, long firstTriggerTimeMillis, long periodTimeMillis) {
		AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
		Intent intent = new Intent(MY_ALARM_ACTION);
		PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
		alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstTriggerTimeMillis, periodTimeMillis, sender);
	}

第二步是写一个接口器接收事件广播:

	/**
	 * 闹钟接收
	 * @author Antony
	 * @date 2014-7-23
	 */
	public static class MyAlarmReceiver extends BroadcastReceiver {
	    public void onReceive(Context context, Intent intent) {
	        if (MY_ALARM_ACTION.equals(intent.getAction())) {
	        	Logcat.e("接收一次闹钟消息!");
<span style="white-space:pre">			</span>//TODO 在这里写相关处理
	        	return;
	        }
	    }
	}

当然Receiver是需要在Mainfest.xml中注册的,我的注册信息如下:

        <receiver android:name="com.test.fee.MyTest$MyAlarmReceiver" >
            <intent-filter>
                <action android:name="android.alarm.zywl.action" />
            </intent-filter>
        </receiver>

细心的可能会发现我的MyAlarmReceiver类是带static关键词的,还有我在注册广播时是加了"$"符号的。原因是酱紫的,为了代码不至于看起来那么凌乱,接收器是作为MyTest的内部类来写的。如果BroadcastReceiver做为内部类来写在Manifest中是不能直接用形如下面的方式来注册的:

        <receiver android:name="com.test.fee.MyAlarmReceiver" >
            <intent-filter>
                <action android:name="android.alarm.zywl.action" />
            </intent-filter>
        </receiver>


这样会抛出找不到MyAlarmReceiver类的错误信息的。也就是说BroadcastReceiver想做为内部类来写要加Static关键字,并且在注册路径要加$符号标识清楚内部类归属。

第三步就是再写一个开机广播接收器:

写法与MyAlarmReceiver类似,可做为内部类也可单独列为一个类来写。在开机广播接收器中调用设置闹钟的方法即可。

这样每次手机重启后又会重新设置闹钟,闹钟就不会出现中断了。当然我这里设置的是以固定时间间隔重复运行的闹钟,因需求而定了。

闹钟实现 原理就这些了,至于具体的界面显示及提示方式等,每个人想法都有不同,就不再说了。

android AlarmManager的使用

上一篇:Android又一个超漂亮的日历控件


下一篇:Android从无知到有知——NO.6