Android 踩坑记Android知识Android开发

Android碎片化的体现-Alarm闹钟服务

2016-10-28  本文已影响1004人  sheepm

原文地址

Da Real Fragmentation - Alarms

这一个系列主要是讲解Android系统中的Alarms (闹钟)和Sensors(传感器),以及Doze系统对于这些寻常的行为产生的影响。

Alarms

在平常的开发中可能需要调度一系列任务的执行,它们可能是在后台工作,甚至是App进程不在的时候。举个例子,你可能需要在一段时间后发送一个通知或者是定期检查一下某个事件是否产生,一般我们通过 alarms 来实现这些操作。
在Android中根据调度任务的频繁程度,前台还是后台操作或者是 minSdkVersion 的版本这些不同的需求就会产生不同的实现方式。
在一些场景中,可以使用一个简单的 postDelayed() loop循环,但是这种方式的局限之处就是必须保证进程是存活的,如果不能满足这个条件,最好还是使用 ****AlarmManager****,或者是在Lollipop中介绍的****JobScheduler****。一般为了方便,第一选择就是 ****AlarmManager****,但是我们会探索几种不同的操作,并且解释这些操作的优点和缺点,以及 Doze 模式对其产生的影响。JobScheduler 会在接下来的文章中讲到。

Options

为了设置一个闹钟,首先,我们需要了解不同的选项,我们先回顾一下。

Types

下面就是一些不同的可用的闹钟类型列表。

Methods

AlarmManager 中有一系列方法来帮助构建一个alarm。下面就会详细描述每个方法的功能。

另外的一个需要注意的地方就是,在Android 5.1及更高的版本,闹钟设置的时间必须至少从当前时间延迟5秒,
如果在5秒之内那么这个闹钟就不会被触发。

Conclusion

经过上面的选项以及方法的描述就能看出Android系统中这个Alarm服务的碎片化。
当然这么多字看起来不太直观,那么放一张图出来看看整个步骤。

alarm option

整个Alarm的分析就到这里,鉴于篇幅原因,在下一篇文章中将会讲解 Doze 系统以及其对于电量的优化导致对Alarm的影响
想要更简单的了解可以check 这个项目 playground 的sample。

备注

这里给出一个简单的创建alarm的例子

 private void setSchedule(int day,int min,int sec){
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this,ScheduleReceiver.class);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, day);
        calendar.set(Calendar.MINUTE, min);
        calendar.set(Calendar.SECOND, sec);
        if (calendar.before(Calendar.getInstance())){
            return;
        }
        if (mPending != null){
            alarmManager.cancel(mPending);
        }
        mPending = PendingIntent.getBroadcast(this,0,intent,0);
        alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),mPending);
    }
上一篇 下一篇

猜你喜欢

热点阅读