• Alarm机制用于定时服务


    获取一个 AlarmManager 的实例:

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

    调用 AlarmManager 的 set()方法设置一个定时任务了,比如说想要设定一个任务在 10 秒钟后执行,就可以写成:

    long triggerAtTime = SystemClock.elapsedRealtime() + 10 * 1000;
    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);
    

    或者写成

    long triggerAtTime = System.currentTimeMillis() + 10 * 1000;
    manager.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);
    

    1.第一个参数是一个整型参数,用于指定 AlarmManager 的工作类型,有四种值可选,分别是 ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC 和 RTC_WAKEUP。

    ELAPSED_REALTIME 表示让定时任务的触发时间从系统开机开始算起,但不会唤醒 CPU。
    ELAPSED_REALTIME_WAKEUP 同样表示让定时任务的触发时间从系统开机开始算起,但会唤醒 CPU。
    RTC 表示让定时任务的触发时间从 1970 年 1月 1 日 0 点开始算起,但不会唤醒 CPU。
    RTC_WAKEUP 同样表示让定时任务的触发时间从1970 年 1 月 1 日 0 点开始算起,但会唤醒 CPU。

    使用 SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,

    使用 System.currentTimeMillis()方法可以获取到 1970 年 1 月 1 日 0 点至今所经历时间的毫秒数。

    2.第二个参数,定时任务触发的时间,以毫秒为单位。

    如果第一个参数使用的是 ELAPSED_REALTIME 或 ELAPSED_REALTIME_WAKEUP,则这里传入开机至今的时间再加上延迟执行的时间。
    如果第一个参数使用的是 RTC 或RTC_WAKEUP,则这里传入 1970 年 1 月 1 日 0 点至今的时间再加上延迟执行的时间。

    3.第三个参数是一个 PendingIntent.这里我们一般会调用getBroadcast()方法来获取一个能够执行广播的 PendingIntent。这样当定时任务被触发的时候,广播接收器的onReceive()方法就可以得到执行。

    由于安卓官方为了CUP节能考虑,把相近时间唤醒CPU的服务都放到一期来启动,需要精确时间唤醒的可以把set()换成setExact()

    实现定时启动的服务

    1.创建服务,并定时发出广播

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "当前时间是"+ new Date().toString());
            }
        }).start();
    
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        int HowLong = 60 * 60 * 1000;                                                //设定定时时间
        long triggerAtTime = SystemClock.elapsedRealtime() + HowLong;               //加上系统开机时间
        Intent intent1 = new Intent(this, AlarmReceiver.class);                       //创建Intent指向广播接收器
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, 0);//调用 getBroadcast()方法来获取一个能够执行广播的 PendingIntent
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);//设置定时唤醒,并发出广播
        return super.onStartCommand(intent, flags, startId);
    }
    

    2.在广播中执行开始下一次定时任务

    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent AlarmIntent;
            AlarmIntent = new Intent(context,LongRunningService.class);
            context.startService(AlarmIntent);
        }
    }
    

    3.在需要的地方首次启动服务

    Intent intent = new Intent(this,LongRunningService.class);
    startService(intent);
  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/cenzhongman/p/6400344.html
Copyright © 2020-2023  润新知