Android alarm定时任务

简介:Android中定时任务一般有两种实现方式:
一是:使用Java API里的Timer类,另一种是Android的Alarm机制。
Timer有一个缺点,它不太适应于需要长期在后台运行的定时任务。为了让电池更耐用,每种手机都会有自己的睡眠状态。这就有可能导致Timer中的定时任务无法正常执行。
Alarm有唤醒CPU功能,可以保证需要执行定时任务的CPU正常工作。

代码


public class AlarmDemoService 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() {
                // TODO:执行具体的定时任务逻辑
            }
        }).start();
        //设置定时任务
        setAlarmTask();
        return super.onStartCommand(intent, flags, startId);
    }
    //设置距离开机10秒之后的定时任务
    private void setAlarmTask() {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        long elapsedRealtime = SystemClock.elapsedRealtime(); //获取Android系统开机到现在的毫秒值
        long tiggerAtTime = elapsedRealtime + 10 * 1000;
        Intent intent = new Intent(this, AlarmDemoService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
        alarmManager.set(AlarmManager.ELAPSED_REALTIME, tiggerAtTime, pendingIntent);

//设置每天23:59:59执行任务

 long day=24 * 60 * 60 * 1000;
      AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        Intent intent2 = new Intent(this, QueryAllAppValidPeriodService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent2, 0);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), day, pendingIntent);

参数解释:
AlarmType一共有四种type,分别为
AlarmManager.ELAPSED_REALTIME;//表示定时任务的触发时间从系统开机算起,但不会唤醒CPU
AlarmManager.ELAPSED_REALTIME_WAKEUP; //表示定时任务的触发时间从系统开机算起,会
AlarmManager.RTC;//表示定时任务的触发时间从从1970.1.1 0算起,但不会唤醒CPU
AlarmManager.RTC_WAKEUP;//表示定时任务的触发时间从从1970.1.1 0算起,会唤醒CPU
long triggerAtMillis表示触发出发时间
获取Android系统开机到现在的毫秒值
long elapsedRealtime = SystemClock.elapsedRealtime();
获取从1970.1.1 0点到现在的毫秒值
long currentTimeMillis = System.currentTimeMillis();
PendingIntent
获取能够执行服务的PendingIntent
PendingIntent.getService();
获取能够执行广播的PendingIntent
PendingIntent.getBroadcast()

背景1:
从Android4.4系统开始,Alarm任务的触发时间会变得不够精确。系统为了耗电性能的优化,会自动检测当前有多少alarm任务存在,然后把触发时间相近的alarm任务放在一起执行,这可以大幅度减少CPU被唤醒的次数,从而有效延长电池使用寿命。
但是如果:要求alarm任务执行时间是精确的,调用下面这个方法。

     alarmManager.setExact(AlarmManager.ELAPSED_REALTIME, tiggerAtTime, pendingIntent);

背景2:
为了优化手机电量,从Android6.0之后,Google加入了一个全新的Doze模式。 如果该设备是6.0或以上系统,设备未插接电源的时候,并且屏幕关闭了一段时间之后,设备会进入Doze模式;该模式下,系统会对CPU、网络、Alarm、同步任务、wifi扫描等任务进行限制;
但是如果有特殊需求,在Doze模式下仍然要执行alarm任务,可以调用下面两种方法的其中一种;

    alarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, tiggerAtTime, pendingIntent);
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, tiggerAtTime, pendingIntent);

猜你喜欢

转载自blog.csdn.net/weixin_37292229/article/details/76422592