android alarmmanager定时任务,AlarmManager 定时任务详解

功能说明 设置一个在未来的某个时间运行应用的PendingIntent 或者OnAlarmListener 即使设备已经进入睡眠已设置的闹铃也会被保持 只有当设备关闭或是重启的时候会被清除

AlarmManager 对象获取

//AlarmManager 系统服务的获取方式

AlarmManager alarmManager (AlarmManager) getSystemService(Context.ALARM_SERVICE);

AlarmManager 提供的api介绍

1. 统一参数说明

AlarmType类型

时间参照物 是否在休眠时候唤起

AlarmType时间参照物是否在休眠时候唤起设备public static final int RTC_WAKEUP 0System.currentTimeMillis() 当前系统的时间 单位ms是public static final int RTC 1System.currentTimeMillis() 当前系统的时间 单位ms否public static final int ELAPSED_REALTIME_WAKEUP 2SystemClock.elapsedRealtime() 从系统启动到目前的时间 包括系统休眠 单位ms是public static final int ELAPSED_REALTIME 3SystemClock.elapsedRealtime() 从系统启动到目前的时间 包括系统休眠 单位ms否

tips:

System.currentTimeMillis()的时间和实际时间可能不准 这个时间可以在设置中修改

常说的Unix 时间戳 System.currentTimeMillis()/1000 单位秒

定时任务触发类型

PendingIntent OnAlarmListener

任务触发类型说明PendingIntent挂起的意图OnAlarmListener直接回调接口的 public void onAlarm() 方法

2. 功能方法

设置定时任务相关方法

设置单次的定时任务参数说明set( AlarmType int type, long triggerAtMillis, PendingIntent operation)triggerAtMillis 触发执行的时间 operation 挂起待执行的意图set( AlarmType int type, long triggerAtMillis, String tag, OnAlarmListener listener,Handler targetHandler)listener 待执行的回调 targetHandler 回调执行设置单次准确的定时任务public void setExact( AlarmType int type, long triggerAtMillis, PendingIntent operation)–public void setAlarmClock(AlarmClockInfo info, PendingIntent operation)同上 type RTC_WAKEUPpublic void setExact( AlarmType int type, long triggerAtMillis, String tag, OnAlarmListener listener, Handler targetHandler)–设置循环的定时任务public void setRepeating( AlarmType int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)这个循环定时 时间是精确地public void setInexactRepeating( AlarmType int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)与上面相反 是不精确的设置在低功耗条件下也执行的定时任务–public void setAndAllowWhileIdle( AlarmType int type, long triggerAtMillis,PendingIntent operation)这个单次定时 时间是精确地public void setExactAndAllowWhileIdle( AlarmType int type, long triggerAtMillis,PendingIntent operation)与上面相反 是不精确的设置在时间段执行的定时任务–public void setWindow( AlarmType int type, long windowStartMillis, long windowLengthMillis,PendingIntent operation)时间段左边界 时间段右边界public void setWindow( AlarmType int type, long windowStartMillis, long windowLengthMillis,String tag, OnAlarmListener listener, Handler targetHandler)同上

取消定时任务相关方法

方法说明public void cancel(PendingIntent operation)根据PendingIntent 取消定时任务public void cancel(OnAlarmListener listener)根据OnAlarmListener 取消定时任务

其他方法 设置系统时间、时区 获取下一次定时任务的信息

方法说明public void setTime(long millis)设置系统时间 需要权限android.permission.SET_TIMEpublic void setTimeZone(String timeZone)设置系统时区 对所有apps生效 TimeZone.setDefault设置时区 只在当前app生效public AlarmClockInfo getNextAlarmClock()获取下一次定时任务信息 没有就为null

tips:

setTimeZone(String timeZone)的参数timeZone 在sdk Build.VERSION_CODES.M 23 TimeZone#getAvailableIDs()中字符串会抛出IllegalArgumentException

android不同版本对AlarmManager的影响

版本节点影响原因解决办法SDK 19使用 set() 或 setRepeating() 创建的闹铃是精确的如果您已将 targetSdkVersion 设置为“18”或更低版本 那么在 Android 4.4 上运行时 您的闹铃的行为方式和在以前版本上一样19 SDK 23使用 set() 或 setRepeating() 创建的闹铃将变得不准确为提高电源效率 Android 现在批处理在合理的相似时间发生的所有应用的闹铃 以便系统仅唤醒设备一次 而不是多次唤醒设备来处理每个闹无需精确建议使用新的 setWindow() 方法 任然需要精确的时钟时间 例如 日历事件提醒 那么您可以使用新的 setExact() 方法23 SDK在低电耗模式下 您的应用会受到以下限制 系统忽略唤醒锁定;标准 AlarmManager 闹钟 包括 setExact() 和 setWindow() 推迟到下一个维护期针对低电耗模式和应用待机模式进行优化如果您需要设置在设备处于低电耗模式时触发的闹钟 请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。使用 setAlarmClock() 设置的闹钟将继续正常触发 系统会在这些闹钟触发之前不久退出低电耗模式

程序杀死后定时任务不执行

定时任务不执行的原因是程序进程停止运行了

通过在启动的广播manifest.xml中添加android:process :myReceiver android8.0不能有静态广播 那就添加一个前台服务 在启动定时器任务前打开前台服务 前台服务最近历史列表中杀不死 除非在设置里面杀死

AlarmManager与Timer的区别

上下文依赖AlarmManagerandroid系统提供的系统服务功能 只有当系统关机或者重启任务才会失败不执行 能唤醒休眠锁 可在休眠时候执行Timer依赖于线程 线程又依赖于启动线程的app进程 也就是说程序杀死就终止 不能唤醒休眠锁 系统休眠会停止运行

AlarmManagerCompat版本兼容处理

implementation com.android.support:support-compat:28.0.0

implementation androidx.core:core:1.3.0

AlarmManagerCompat 代码

public final class AlarmManagerCompat {

public static void setAlarmClock( NonNull AlarmManager alarmManager, long triggerTime, NonNull PendingIntent showIntent, NonNull PendingIntent operation) {

if (VERSION.SDK_INT 21) {

alarmManager.setAlarmClock(new AlarmClockInfo(triggerTime, showIntent), operation);

} else {

setExact(alarmManager, 0, triggerTime, operation);

public static void setAndAllowWhileIdle( NonNull AlarmManager alarmManager, int type, long triggerAtMillis, NonNull PendingIntent operation) {

if (VERSION.SDK_INT 23) {

alarmManager.setAndAllowWhileIdle(type, triggerAtMillis, operation);

} else {

alarmManager.set(type, triggerAtMillis, operation);

public static void setExact( NonNull AlarmManager alarmManager, int type, long triggerAtMillis, NonNull PendingIntent operation) {

if (VERSION.SDK_INT 19) {

alarmManager.setExact(type, triggerAtMillis, operation);

} else {

alarmManager.set(type, triggerAtMillis, operation);

public static void setExactAndAllowWhileIdle( NonNull AlarmManager alarmManager, int type, long triggerAtMillis, NonNull PendingIntent operation) {

if (VERSION.SDK_INT 23) {

alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation);

} else {

setExact(alarmManager, type, triggerAtMillis, operation);

private AlarmManagerCompat() {

tips:

不多说AlarmManagerCompat 做了一些简单的版本兼容性处理

AlarmManager使用实例

精准单次的定时任务 精准循环的定时任务

AlarmManager,JobScheduler,WorkManager的功能

服务功能介绍版本问题AlarmManager提供在将来的某个时刻运行你的程序API 19开始运行时间传递不精准JobScheduler提供特定时间并满足某些条件后运行你的程序API 21开始使用 WorkManager是以上两个的进一步封装 Jetpack中的组件WorkManager requires compileSdk version 28 or higher

此文要是对你有帮助 如果方便麻烦点个赞 谢谢

责任编辑:xiaochao

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 AlarmManager 实现定时重置流量统计可以分为以下几个步骤: 1. 在 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> ``` 2. 创建一个 BroadcastReceiver,用于接收定时任务的触发事件,并在其中实现重置流量统计的逻辑。例如: ```java public class TrafficStatsResetReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 重置流量统计信息 TrafficStats.clearAllStats(); } } ``` 3. 在 AndroidManifest.xml 文件中注册 BroadcastReceiver,并且添加一个 ACTION_BOOT_COMPLETED 的 intent-filter,以便在设备启动时启动定时任务。例如: ```xml <receiver android:name=".TrafficStatsResetReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="com.example.trafficstatsreset.ACTION_RESET_TRAFFIC_STATS" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> ``` 4. 在应用程序启动时注册一个定时任务,例如: ```java private void registerTrafficStatsResetTask(Context context) { // 创建一个 PendingIntent,用于触发定时任务 Intent intent = new Intent(context, TrafficStatsResetReceiver.class); intent.setAction("com.example.trafficstatsreset.ACTION_RESET_TRAFFIC_STATS"); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 获取 AlarmManager 实例 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // 计算定时任务的触发时间 long triggerTime = System.currentTimeMillis() + 24 * 60 * 60 * 1000; // 每天重置一次流量统计 // 注册定时任务 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, 24 * 60 * 60 * 1000, pendingIntent); } ``` 在上述代码中,我们创建了一个 PendingIntent,并将其传递给 AlarmManager 的 setRepeating 方法,以便注册一个每天重置一次流量统计的定时任务。需要注意的是,我们设置的定时任务触发时间是当前时间加上一天的时间间隔,这样可以确保定时任务在第二天凌晨触发。 5. 在应用程序启动时调用 registerTrafficStatsResetTask 方法,注册定时任务即可: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册定时任务 registerTrafficStatsResetTask(this); } ``` 经过上述步骤,您就可以使用 AlarmManager 来实现定时重置流量统计的功能了。需要注意的是,使用 AlarmManager 时需要仔细管理定时任务的触发时间和间隔,以确保应用程序的稳定性和安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值