Alarm是什么?
Android通过Alarm实现定时任务的运行。
Alarm使用
新建longRunningService
- 通过getSystemService获取AlarmManager
- 通过AlarmManager的set方法开启定时服务,第一个参数指定Alarm的工作方式
- ELAPSED_REALTIME:触发时间从系统开机算起
- ELAPSED_REALTIME_WAKEUP:触发时间从系统开机算起并唤醒CPU
- RTC:触发时间从1970.1.1算起
- RTC_WAKEUP:触发时间从1970.1.1算起并唤醒CPU
- SystemClock.elapsedRealtime()可获得系统开机时间毫秒数和1、2配套使用
- System.currentTimeMillis()可获得系统从1970.1.1的毫秒数和3、4配套使用
- 第二个参数为定时任务的触发时间,以毫秒为单位
- 第三个参数为PendingIntent,指定唤醒的服务或广播
- 唤醒后会执行onStartCommand方法,内部开启线程执行唤醒后的操作
public class LongRunningService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
int anHour = 60 * 60 * 1000;
long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
Intent i = new Intent(this, LongRunningService.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
return super.onStartCommand(intent, flags, startId);
}
}
启动定时服务:
Intent intent=new Intent(context,LongRunningService.class);
context.startActivity(intent);
为节省电量和cpu被唤醒的次数,Android会将时间相近的Alarm一起执行,导致唤醒时间与预期时间不一致,可通过setExact()方法代替set()方法保证时间的准确。
|