必威体育Betway必威体育官网
当前位置:首页 > IT技术

Alarm机制-学习记录

时间:2019-10-17 15:14:31来源:IT技术作者:seo实验室小编阅读:66次「手机版」
 

alarm

整理自《第一行代码

由于手机的休眠策略,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的工作模式/类型。

有四种类型可选:

ELAPSED_REALTIME    表示让定时任务的触发时间从系统开机开始算起    不会唤醒CPU

ELAPSED_REALTIME_WAKEUP    同上    但是会唤醒CPU

RTC    表示让定时任务的出发时间从1970/1/1 00:00开始算起    不会唤醒CPU

REC_WAKEUP    同上    会唤醒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("FUCK", "香香的感觉,可带劲啦!");
            }
        }).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("FUCK", "服务启动");
    }
}

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

Doze模式

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

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

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

Doze模式的工作过程:

Doze模式的工作过程

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

  •     网络访问被禁止。
  •     系统忽略唤醒CPU或者屏幕操作。

  •     系统不再执行WiFi扫描。

  •     系统不再执行同步服务。

  •     Alarm任务将会在下次退出Doze模式的时候执行。

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

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

相关阅读

定时任务AlarmManager的使用注意事项

AlarmManager介绍 见名知意闹钟管理者,当然不代表AlarmManager只是用来做闹钟应用的,作为一个系统级别的提示服务,其实它的作用和Ti

分享到:

栏目导航

推荐阅读

热门阅读