AlarmManager 可以按照”预先设定的时间“或”时间间隔"激活Intent的一种方式,他与timer不同的是,他是程序之外的,生命周期不受程序控制,即使程序关闭也会触发。它比Service和定时器更加节省资源。如果在应用程序内触发定时操作,推荐Handler,Timer以及Thread等方式。因为这样Android能更好的控制系统资源。
一.代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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); } }); } }
二.相关说明
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方法可以对时间进行精确的控制,最多可以精确到毫秒。但是这样设备比较耗电
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 创建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);
(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(每隔一天)
例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 创建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);