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);

转载于:https://www.cnblogs.com/cenzhongman/p/6400344.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值