Android---Alarm定时任务 Doze模式

article/2025/9/15 10:18:01

Android的定时任务有两种,一种是JavaAPI提供的Timer类,另一种就是使用Android的Alarm机制。

Timer不太适合那些需要长期在后台运行的定时任务,因为每个手机都有自己的休眠策略,Android手机长时间不操作就会导致Timer定时任务无法执行,而Alarm具有唤醒CPU的功能,能保证大多数情况下,执行定时任务的时候CPU能正常工作。

 AlarmManager manager= (AlarmManager) getSystemService(Context.ACTIVITY_SERVICE);PendingIntent pendingIntent;/***    SystemClock.elapsedRealtime():获取到系统开机至今所经历的毫秒数*    System.currentTimeMillis():1970-1-1 0:00至今所经历的毫秒数**     ELAPSED_REALTIME:定时任务触发从系统开机算起 但不唤醒CPU*     ELAPSED_REALTIME_WAKEUP:定时任务触发从系统开机算起 唤醒CPU*     RTC:从1970-1-1 0:00算起 不唤醒CPU*     RTC_WAKEUP:从1970-1-1 0:00算起 唤醒CPU*//**pendIntent:一般会调用getSrervice或getBroadCast来获取一个能够执行服务或广播的pendingIntent,这样才能保证在任务被触发的时候,服务里的onStartCommand()和onRecive()方法被执行   */long time= SystemClock.elapsedRealtime()+10*1000;//10秒钟后执行任务manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,time,pendingIntent);

那么要实现一个长时间在后台定时运行的服务该怎么做?

创建一个MyService类

package com.example.test;import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;import androidx.annotation.Nullable;public class MyService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {new Thread(new Runnable() {@Overridepublic void run() {//TODO}}).start();AlarmManager manager= (AlarmManager) getSystemService(ALARM_SERVICE);int time=60*60*1000;//一小时long triggerAtTime= SystemClock.elapsedRealtime()+time;Intent intent1=new Intent(this,MyService.class);PendingIntent pendingIntent=PendingIntent.getService(this,0,intent1,0);manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pendingIntent);return super.onStartCommand(intent, flags, startId);}
}

可以看到先创建了一个子线程在这里执行具体的操作任务,然后就是alarm机制,定义任务触发一小时后,再使用PendingIntent指定定时处理任务的MyService,最后调用set方法设定完成。

这样就将一个长时间在后台定时运行的服务设定成功了,一旦启动了MyService,就会在onStartCommand()方法里设定一个定时任务,这样一小时后将会再次启动MyService,每隔一小时就会执行一次。

然后去使用,在manifest文件中注册服务

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

在使用的地方调用下面代码就可以。

Intent intent=new Intent(context,MyService.class);context.startService(intent);

但是在Android4.4后,定时任务变得不准确,会延时一段时间才能执行,那是因为系统在耗电方面进行的优化,系统会检测有多少Alarm任务存在,将触发时间相近的几个任务放在一起执行,这样可以大幅度的减少CPU被唤醒的次数,演唱电池的使用时长。也可以使用setExact()来代替set()方法,可以保证任务能够准时执行。

Doze模式:

如果设备未充电,并处于静止状态,且屏幕关闭了一段时间后,就能进入到Doze模式。

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

 

Doze模式下受限制的功能:

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

在Doze模式下, Alarm任务会变得相当不准,当然这种情况下对Alarm的要求也并不高,如果有特殊的要求,调用AlarmManager的setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()方法就能让定时任务正常执行,和set()与setExact()的区别是一样的。


http://chatgpt.dhexx.cn/article/Yh3cw9Ze.shtml

相关文章

Android 8.1 Doze模式分析(三)——Deep Doze模式

概述 Deep Doze&#xff0c;也就是Android的Doze模式了&#xff0c;表示深度Doze&#xff0c;比起LightDoze&#xff0c;它将进行更多的限制&#xff1a;无法进行网络访问和 GPS/WLAN 扫描、唤醒被忽略、闹钟和作业/同步被延迟。当然&#xff0c;它的触发条件也将更加苛刻&…

Android7.0 Doze模式

在Android M中&#xff0c;Google就引入了Doze模式。它定义了一种全新的、低能耗的状态。 在该状态&#xff0c;后台只有部分任务被允许运行&#xff0c;其它任务都被强制停止。 本篇博客中&#xff0c;我们就来分析一下Android 7.0中Doze模式相关的流程。 一、基本原理 Do…

Android Doze模式和app Standby模式

对低电耗模式(app Standby)和应用待机模式(Doze)进行针对性优化 从 Android 6.0&#xff08;API 级别 23&#xff09;开始&#xff0c;Android 引入了两个省电功能&#xff0c;可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命。低电耗模式通过在设备长时间处…

adb shell dumpsys deviceidle whitelist 打盹模式(Doze)白名单

Android 6.0开始引入了打盹模式(Doze)&#xff0c;若想使自己的App不受打盹模式的影响&#xff08;推迟Alarm唤起时间、限制CPU调用、限制网络请求等&#xff09;&#xff0c;需终端手机厂商为该App添加这个白名单。 Android developer 针对低电耗模式和应用待机模式进行优化&…

Android 8.1 Doze模式分析(二)——Light Doze模式

概述 LightDoze表示轻度doze模式&#xff0c;如果设备处于未充电且屏幕关闭状态&#xff0c;但未处于静止状态时&#xff0c;就会进入Light Doze模式&#xff0c;在LightDoze模式中&#xff0c;会定期进行维护&#xff0c;这种维护会持续N分钟&#xff0c;在维护状态(maintena…

Doze模式时序调研

Doze模式 机型 Light idle Deep idle 时序 定制白名单 AppStandby BLE Scanning管控 华为P20 Pro 开启 64.5分钟进入deep idle 有 开启 禁止BLE scanning OPPO F11 Pro 开启 30分钟进入deep idle 有 开启 允许BLE scanning 小米 MI 8 Pro 开启 64.5分钟进入…

Android7.0 Doze模式分析(一)Doze介绍 DeviceIdleController

参考&#xff1a;http://blog.csdn.net/gaugamela/article/details/52981984 在Android M中&#xff0c;Google就引入了Doze模式。它定义了一种全新的、低能耗的状态。 在该状态&#xff0c;后台只有部分任务被允许运行&#xff0c;其它任务都被强制停止。 在之前的博客中分…

android 7.0低电耗Doze模式

从 Android 6.0&#xff08;API 级别 23&#xff09;开始&#xff0c;Android 引入了两个省电功能&#xff0c;可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命。 低电耗(Doze)模式通过在设备长时间处于闲置状态时推迟应用的后台 CPU 和网络 Activity 来减少电…

Android O Doze模式的状态

现象 以下是BugReport日志 日志 STATE_ACTIVE 2,006: 11-17 10:24:59.876137 900 900 I DeviceIdleController: updateChargingLocked: chargingtrue 2,007: 11-17 10:24:59.876244 900 900 I DeviceIdleController: becomeActiveLocked, reason charging 2,25…

【Android】Doze模式识别与检测

从 Android 6.0&#xff08;API 级别 23&#xff09;开始&#xff0c;Android 引入了两个省电功能&#xff1a;Doze模式&#xff08;官方翻译为低电耗模式&#xff09;和 App Standby模式&#xff08;官方翻译为应用待机模式&#xff09;&#xff0c;可通过管理应用在设备未连接…

Android 8.1 Doze模式分析(一)——Doze简介和DeviceIdleController的启动

概述 Doze模式&#xff0c;官方翻译为低电耗模式&#xff0c;是Andoriod6.0增加的一项系统服务&#xff0c;主要目的是为了优化电池性能&#xff0c;增加电池续航时间&#xff0c;Doze模式又分两种模式&#xff1a;深度Doze模式(Deep Doze)和轻度Doze模式(Light Doze)&#xf…

Android 6.0的省电技术Doze作用影响以及避免方法

从android 6.0开始&#xff0c;谷歌引入了两项新的省电技术延长电池使用时间&#xff0c;分别是Doze&#xff08;休眠&#xff09;和App Standby&#xff08;app待命模式&#xff09;&#xff0c;只要app是运行在6.0&#xff08;api 23&#xff09;及以上的系统&#xff0c;无论…

Doze模式简介

Doze模式是自Android 6.0开始引入的两项省电功能的其中之一&#xff0c;还有一个就是appstandby&#xff0c;通过管理应用在设备未连接至电源时的行为方式&#xff0c;帮助用户延长电池寿命。当用户长时间未使用设备时&#xff0c;低电耗模式会延迟应用的后台 CPU 和网络活动&a…

Android中的Doze模式

概述 Android 6.0引入的Doze机制在于节省系统耗电量&#xff0c;保护电池&#xff0c;延长电池的使用时间。当设备未连接至电源&#xff0c;且长时间处于闲置状态时&#xff0c;系统会将应用进入Doze&#xff0c;置于App Standby模式。而最终的效果&#xff0c;能提升30%的电量…

Mock工具之Mockito实战

在实际项目中写单元测试的过程中我们会发现需要测试的类有很多依赖&#xff0c;这些依赖项又会有依赖&#xff0c;导致在单元测试代码里几乎无法完成构建&#xff0c;尤其是当依赖项尚未构建完成时会导致单元测试无法进行。为了解决这类问题我们引入了Mock的概念&#xff0c;简…

Mockito 入门

目录 1.什么是 Mock 测试&#xff1f;2.Mockito简介3.在 SpringBoot 单元测试中使用 Mockito3.1 Maven依赖&#xff1a;3.2 UserService.java3.3 User.java3.4 thenReturn系列方法&#xff08;测试桩&#xff09;3.5 thenThrow系列方法3.6 verify 系列方法 4.Spring中mock任何容…

Mock工具之Moco使用教程

目录 一、什么是Moco二、安装&配置三、接口配置&测试3.1 第一个简单的请求&#xff1a;3.2 Get请求&#xff1a;3.3 Post请求&#xff1a;3.4 返回值为Json格式的请求&#xff1a;3.5 带cookie信息才能访问的post请求&#xff1a;3.6 重定向请求&#xff1a;3.7 前后端…

mock功能

目标 了解mock的作用及使用场景&#xff1b; mock使用场景 mock&#xff1a;假的 前端程序员提到的mock数据的含义是&#xff1a;真的假数据 真的&#xff1a;符合接口规范要求的。 假数据&#xff1a;数据是人为创建出来的&#xff0c;不是真正的业务数据。 什么时候需…

mock的介绍

1.什么是mock mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为&#xff0c;很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为 2.为什么要使用mock 之所以使用mock测试&#xff0c;是因为真实场景很难实现或者短…

Mock介绍

mock的定义&#xff08;what&#xff09;&#xff1a; mock是在测试过程中&#xff0c;对于一些不容易构造/获取的对象&#xff0c;创建一个mock对象来模拟对象的行为 为什么要使用mock&#xff08;why&#xff09;&#xff1a; 在做单元测试过程中&#xff0c;经常会有以下的…