定时任务——Android之Alarm机制讲解

概述

android 中实现定时人物有两种方式

  • Java API里提供的Timer类

  • Android中的Alarm机制

    优缺点介绍:

    这两种方式在多说情况下能实现同样的效果,但Timer有一个明显的缺陷,timer不适用需要长时间在后台运行的定时任务。android手机在长时间步操作的情况下会自动让cpu进入睡眠状态,这就会导致Timer的定时任务无法正常运行。Alarm具有唤醒cpu的功能,它可以保证在大多数情况下需要执行定时任务的时候cpu能正常工作。

    注意:这里的唤醒cpu和唤醒屏幕完全不是一个概念


Alarm机制

这里设置的是点击一个按钮开启这个服务

A. 获取AlarmManager实例

 AlarmManager alarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

B.设置需要延迟的时间

 /**
         * elapsedRealtime():获取到系统开机至今所经历时间的毫秒数
         * currentThreadTimeMillis():获取到1970年1月1日0点至今所经历时间的毫秒数
         * */
 long time = SystemClock.elapsedRealtime() + 60 * 60 * 1000;

C.触发定时任务

alarmManager.setExact(AlarmManager.ELAPSED_REALTIME,time, PendingIntent.getService(this,0,mIntent,0));

setExact()方法API最低要求19
setExact的三个参数:

  • 第一个参数:有4种值可选:
    ELAPSED_REALTIME 表示让定时任务的触发时间从系统开机开始算起,但不会唤醒cpu
    ELAPSED_REALTIME_WAKEUP 表示让定时任务的触发时间从系统开机开始算起,但会唤醒cpu
    RTC 表示让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒cpu
    RTC_WAKEUP 表示让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒cpu

  • 第二个参数:定时任务触发的时间,以毫秒为单位
    注:这里传入 ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,意思:就是传入开机至今的时间加上延迟执行的时间
    这里传入RTC或 RTC_WAKEUP,意思:就是传入1970年1月1日0点至今的时间加上延迟执行的时间

  • 第三个参数:一般会调用getService()或getBroadcast()来获取一个能执行的服务或广播的PendingIntent,这样服务的onStartCommand()方法或广播接收器的onReceive()方法就可以得到执行

public class LongRunningTime extends Service {
    private AlarmManager alarmManager;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("Alarm机制","Alarm机制----------------");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(final Intent intent, int flags, int startId) {
        Log.e("Alarm机制","Alarm机制---------2-------");
        //获取AlarmManager实例
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        /**
         * elapsedRealtime():获取到系统开机至今所经历时间的毫秒数
         * currentThreadTimeMillis():获取到1970年1月1日0点至今所经历时间的毫秒数
         * */
        long time = SystemClock.elapsedRealtime() + 3* 1000;
        Intent mIntent=new Intent(this,LongRunningTime.class);
        /**
         * setExact()方法API最低要求19
         * setExact的三个参数:
         * 第一个参数:有4种值可选:
         *            ELAPSED_REALTIME   表示让定时任务的触发时间从系统开机开始算起,但不会唤醒cpu
         *            ELAPSED_REALTIME_WAKEUP   表示让定时任务的触发时间从系统开机开始算起,但会唤醒cpu
         *            RTC   表示让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒cpu
         *            RTC_WAKEUP   表示让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒cpu
         * 第二个参数:定时任务触发的时间,以毫秒为单位
         *            注:这里传入 ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,意思:就是传入开机至今的时间加上延迟执行的时间
         *                这里传入RTC或 RTC_WAKEUP,意思:就是传入1970年1月1日0点至今的时间加上延迟执行的时间
         *
         * 第三个参数:一般会调用getService()或getBroadcast()来获取一个能执行的服务或广播的PendingIntent,
         *            这样服务的onStartCommand()方法或广播接收器的onReceive()方法就可以得到执行
         *
         * */
        alarmManager.setExact(AlarmManager.ELAPSED_REALTIME,time, PendingIntent.getService(this,0,mIntent,0));
        Log.e("Alarm机制Service","Alarm机制-------2-------");

        return super.onStartCommand(intent, flags, startId);
    }
}

效果图:
定时任务——Android之Alarm机制讲解_第1张图片

这样一个定时任务就完成了!

代码下载:http://download.csdn.net/detail/qq_34501274/9747492

你可能感兴趣的:(android)