整理自《第一行代码》

由于手机的休眠策略,Android会在长时间不操作的情况下自动让CPU进入到睡眠状态。

Alrarm具有唤醒CPU的功能,它可以保证在大多数情况下需要执行定时任务的时候CPU都能正常工作。

注意是唤醒CPU不是唤醒屏幕。

Alarm机制

主要用AlarmManager类实现,通过调用Context的getSystemService()方法来获取实例。

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

获取到实例后,调用AlarmManager的set()方法就可以设置一个定时任务。

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

set()方法有三个参数:

参数一:整型    AlarmManager的工作模式/类型。

    有四种类型可选:

不会唤醒CPU

会唤醒CPU

不会唤醒CPU

会唤醒CPU

    PS:

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

        使用System.currentTimeMillis()方法可以获取到1970/1/1 00:00至今所经历时间的毫秒数。

参数二:长整型    任务触发的事件,单位是毫秒。

    这个一看就懂,古不做记录

参数三:延迟意图    PendingIntent  

    调用    getService()/getBoradcast()    来获取一个能够被执行的PendingIntent。

    当定时任务被触发时,服务在onStartCommand()方法/广播接收器的onReceive()方法    中执行。

示例:每过10秒自动启动一次的服务

public class LongRunningService extends Service {

    @Nullable
    @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() {
//                这里执行具体的逻辑操作
                Log.d("", "香香的感觉,可带劲啦!");
            }
        }).start();/*这里不能忘记start*/
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        int anHour = 10 * 1000;/*定时10秒*/
        long triggerAtTime = System.currentTimeMillis() + anHour;

        Intent intent1 = new Intent(this, LongRunningService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent1, 0);

        alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);

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

注意不要忘记注册服务

<service android:name=".service.LongRunningService"/>

最后就是启动服务了

    在主活动中:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, LongRunningService.class);
        this.startService(intent);
        Log.d("", "服务启动");
    }
}

即可实现每10秒再启动一次。

Doze模式

 Android6.0之后,Google加入了一个全新的Doze模式,从而可以极大幅度地延长电池的使用寿命。

如果设备未充电,并处于静止状态(7.0中删除了这一条件),且屏幕关闭了一段时间后,就能进入到Doze模式。

在Doze模式下,系统会对CPU、网络、Alarm等活动进行限制,从而延长电池的使用寿命。当然,系统并不会一直处于Doze模式,而是会间歇性地退出Doze模式一小段时间,在这段时间中,应用就可以去完成它的同步操作、Alarm任务等。

Doze模式的工作过程:

android 待机锁判定 安卓待机状态rare_定时任务

在Doze模式下会受到限制的功能:

  •     网络访问被禁止。
  •     系统忽略唤醒CPU或者屏幕操作。
  •     系统不再执行WIFI扫描。
  •     系统不再执行同步服务。
  •     Alarm任务将会在下次退出Doze模式的时候执行。

PS:如果你要求Alarm任务即使在Doze模式下也必须正常执行,Android提供了解决方案:

    调用AlarmManager的setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()方法就能让定时任务即使在Doze模式下也能正常执行。