首页 > 代码库 > AlarmManager 用法

AlarmManager 用法

AlarmManager 可以按照”预先设定的时间“或”时间间隔"激活Intent的一种方式,他与timer不同的是,他是程序之外的,生命周期不受程序控制,即使程序关闭也会触发。它比Service和定时器更加节省资源。如果在应用程序内触发定时操作,推荐Handler,Timer以及Thread等方式。因为这样Android能更好的控制系统资源。

 

一.代码

public class MainActivity extends Activity {    Button btn1,btn2;    AlarmManager am;    PendingIntent pi;        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                //创建AlarmManager        am=(AlarmManager)getSystemService(Context.ALARM_SERVICE);                        btn1=(Button)findViewById(R.id.btn1);            btn2=(Button)findViewById(R.id.btn2);                btn1.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                                //启动照相机                Intent intent = new Intent("android.media.action.STILL_IMAGE_CAMERA");                pi= PendingIntent.getActivity(MainActivity.this,0,intent,0);                                                //十秒后激活Intent                Calendar calendar=Calendar.getInstance();                calendar.setTimeInMillis(System.currentTimeMillis());                calendar.add(Calendar.SECOND, 10);                                //设置Alarm,第一个参数:Alarm类型,第二个参数触发时间,第三个参数PendingIntent                am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);                }        });                btn2=(Button)findViewById(R.id.btn2);        btn2.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                //取消AlarmManager任务                am.cancel(pi);            }        });    }}
View Code

 

二.相关说明

1.Alarm有四个可用的类型(代码中的set方法中第一个参数)

(1)RTC_WAKEUP 在指定的时间唤醒设备,并激活PendingIntent

(2)RTC 在指定的时间激活PendingIntent,但是不会唤醒设备

(3) ELAPSED_REALTIME 根据设备启动之后经过的时间激活PendingIntent,但是不会唤醒设备,经过的时间包含设备休眠的所有时间

(4)ELAPSED_REALTIME_WAKEUP 在设备启动并经过指定的时间之后激活PendingIntent和唤醒设备。

2.设置重复的Alarm。

如果需要Alarm间隔一段时间激活Intent,可以是用setRepeating或setIndexactRepeating两个方法,这两个方法都支持Alarm类型。

(1)setRepeating方法可以对时间进行精确的控制,最多可以精确到毫秒。但是这样设备比较耗电

例:

// 创建AlarmManager                AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);                // 启动照相机                Intent intent = new Intent(                        "android.media.action.STILL_IMAGE_CAMERA");                PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);                //每个十秒触发                Calendar calendar = Calendar.getInstance();                calendar.setTimeInMillis(System.currentTimeMillis());                calendar.add(Calendar.SECOND, 10);                                am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 10000, pi);                // 取消AlarmManager任务                //am.cancel(pi);
View Code

 

(2)setIndexactRepeating 相比setRepeating,setIndexactRepeating 可以减少电量的消耗。在使用setIndexactRepeating 时,Android会同步多个没有精确指定时间间隔的Alarm,然后同时触发她们。(一次触发多个,例如设置Alarm时间间隔为:INTERVAL_HOUR,Android会同步所有时间间隔为为INTERVAL_HOUR的Alarm,并且同时触发)

setIndexactRepeating 常用的时间间隔

INTERVAL_FIFTEEN_MINUTES(每十五分钟)

INTERVAL_HALF_HOUR(每隔半个小时)

INTERVAL_HOUR(每隔一个小时)

INTEVAL_HALF_DAY(每个半天)

INTEVAL_DAY(每隔一天)

 

例:

// 创建AlarmManager                am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);                // 启动照相机                Intent intent = new Intent(                        "android.media.action.STILL_IMAGE_CAMERA");                pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);                //每个十五分钟触发                am.setInexactRepeating(AlarmManager.RTC_WAKEUP,                        AlarmManager.INTERVAL_FIFTEEN_MINUTES,                        AlarmManager.INTERVAL_FIFTEEN_MINUTES, pi);
View Code