- package com.genius.demo;
- //AlarmManager称呼为全局定时器
- //AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.
- //
- //android提供了四种类型的闹钟:
- //ELAPSED_REALTIME在指定的延时过后,发送广播,但不唤醒设备。
- //ELAPSED_REALTIME_WAKEUP在指定的演示后,发送广播,并唤醒设备
- //RTC在指定的时刻,发送广播,但不唤醒设备
- //RTC_WAKEUP在指定的时刻,发送广播,并唤醒设备
- //
- //AlarmManager提供的方法:
- //void set(int type, long triggerAtTime, PendingIntent operation)设置一个闹钟
- //void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)设置一个会重复的闹钟
- //void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
- //设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。
- //void cancel(PendingIntent operation)取消一个设置的闹钟
- //void setTimeZone(String timeZone)
- //设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限
- //
- //setRepeating方法有4个参数,这些参数的含义如下:
- //type:表示警报类型,一般可以取的值是AlarmManager.RTC和AlarmManager.RTC_WAKEUP。
- //如果将type参数值设为AlarmManager.RTC,表示是一个正常的定时器,如果将type参数值设为AlarmManager.RTC_WAKEUP,
- //除了有定时器的功能外,还会发出警报声(例如,响铃、震动)。
- //triggerAtTime:第1次运行时要等待的时间,也就是执行延迟时间,单位是毫秒。
- //interval:表示执行的时间间隔,单位是毫秒。
- //operation:一个PendingIntent对象,表示到时间后要执行的操作。PendingIntent与Intent类
- //似,可以封装Activity、BroadcastReceiver和Service。但与Intent不同的是,PendingIntent可以脱离应用程序而存在。
- //
- //calendar.getTimeInMillis()返回从格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000到Calendar对象表示的时间之间的毫秒数
- import java.util.Calendar;
- import android.os.Bundle;
- import android.app.Activity;
- import android.app.AlarmManager;
- import android.app.PendingIntent;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- public class TimeTask extends Activity {
- private Calendar calendar;
- private AlarmManager am;
- private PendingIntent pendingIntent;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- calendar = Calendar.getInstance();
- calendar.setTimeInMillis(System.currentTimeMillis());
- //set(f, value) changes field f to value. 设置监听时间的时分秒
- int hourOfDay = 23,minute = 59;
- calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MILLISECOND, 0);
- Intent intent = new Intent("com.buscall.alarm");
- intent.putExtra("time", calendar.getTimeInMillis());
- pendingIntent = PendingIntent.getBroadcast(TimeTask.this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
- //获取系统进程
- am = (AlarmManager)getSystemService(ALARM_SERVICE);
- am.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
- //设置周期!!
- am.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), (24*60*60*1000), pendingIntent);
- String tmps = "设置闹钟时间为:"+format(hourOfDay)+":"+format(minute);
- System.out.println(tmps);
- IntentFilter filter = new IntentFilter();
- filter.addAction("com.buscall.alarm");
- registerReceiver(TimeReceiver, filter);
- }
- @Override
- protected void onDestroy() {
- am.cancel(pendingIntent);
- unregisterReceiver(TimeReceiver);
- super.onDestroy();
- }
- private BroadcastReceiver TimeReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals("com.buscall.alarm")||action=="com.buscall.alarm") {
- System.out.println("到时间了:"+getIntent().getStringExtra("time"));
- }
- }
- };
- /**8:8 format 08:08*/
- private String format(int x) {
- String s = ""+x;
- if(s.length() == 1)
- s = "0"+s;
- return s;
- }
- }
- 转自:http://blog.csdn.net/toyuexinshangwan/article/details/8634531
1Android中的handler、timer、thread、在待机时都会停止运行,所设定的时间会在待机结束后继续计算。所以如果想在Android待机时运行某些操作,使用以上几种方法是不可行的。
2Android中有一个Alarmmanager对象,可以使用该对象执行待机时的操作。具体设置的方法如下:
2.1设置闹铃的类型
AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.POWER_OFF_WAKEUP:能唤醒系统,他是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称为关机闹铃。
RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。
2.2设置闹铃的开始时间
如果使用ELAPSED_REALTIME或者ELAPSED_REALTIME_WAKEUP类型应该调用SystemClock.elapsedRealtime()获取相对时间在加上你设定的延迟时间
如果使用RTC或者RTC_WAKEUP类型应该调用System.currentTimeMillis()获取从1970.1.1号以来的时间在加上你设定的延迟时间
2.3pendingintent
一个PendingIntent对象,表示到时间后要执行的操作。PendingIntent与Intent类似,可以封装Activity、BroadcastReceiver和Service。
但与Intent不同的是,PendingIntent可以脱离应用程序而存在。