Android AlarmManager定时器设置

        Android开发中一般常见的定时器有 Timer、Handler。某些场景下也会使用到 AlarmManager ,相对于前面两者,AlarmManager 功能更加多样,某些场景下有更准确的定时效果。

// Timer
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                // ... ...
            }
        };
        // 延迟 1s 执行
        timer.schedule(task, 1000);
        // 取消执行
        timer.cancel();


// Handler
        Handler handler = new Handler(getMainLooper());
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                // ... ...
            }
        }, 1000);

AlarmManager 中相关方法有以下几种:(根据官网说明)

setInexactRepeating                 

        触发时间要求不准确的重复警报;例如,每小时重复一次的警报,但不一定在每小时的开头。这些警报比 传统上提供的严格重复警报更节能setRepeating(int, long, long, PendingIntent),因为系统可以调整警报的传递时间,以使它们同时触发,避免不必要地从睡眠中唤醒设备。

setRepeating

        设置重复警报。注意:对于计时操作(滴答声、超时等),需要使用 Handler。如果已经为同一个 IntentSender 安排过警报,它将取消先前的。像set(int, long, PendingIntent),可以提供自动重复的警报,直到使用 明确删除cancel(AlarmManager.OnAlarmListener)。如果规定的触发时间是过去的,则将立即触发警报,警报计数取决于触发时间相对于重复间隔过去多长时间。
       如果警报被延迟(由于系统睡眠,例如,对于非 _WAKEUP 警报类型),将尽快发送跳过的重复。之后,未来的告警将按照原定的时间表进行传递;它们不会随时间漂移。例如,如果您设置了每隔一小时的重复闹钟,但手机在 7 点 45 分到 8 点 45 分处于睡眠状态,则手机一醒来就会发出闹钟,然后下一个闹钟会在9:00。
       如果您的应用程序希望允许传递时间漂移以保证警报之间始终至少经过一定的时间间隔,那么采取的方法是使用一次性警报,在处理每个警报传递时自己安排下一个。

set

        对于计时操作(滴答声、超时等),使用Handler。如果已经为同一个 IntentSender 安排了警报,则将首先取消之前的警报。如果规定的触发时间已经过去,则立即触发警报。如果这个 Intent 调度已经有一个警报(两个 Intent 的相等性由 定义 Intent#filterEquals),那么它将被删除并替换为这个。从 API 19 开始,传递给此方法的触发时间被视为不精确

setExact

        在规定时间准确的发送警报。从 开始Build.VERSION_CODES#S,面向 SDK 级别 31 或更高级别的应用需要请求 SCHEDULE_EXACT_ALARM使用此 API 的权限,除非该应用不受电池限制。用户和系统可以通过设置中的特殊应用访问屏幕撤销此权限。

setAndAllowWhileIdle

        类似set(int, long, android.app.PendingIntent),但即使系统处于低功耗空闲(又名打盹)模式,也允许执行此警报。这种类型的警报只能用于实际需要在空闲时发出警报的情况:例如,日历通知应该发出声音以便用户知道它。发出警报后,该应用程序还将添加到系统的临时电源豁免列表中大约 10 秒,以允许该应用程序获取更多唤醒锁以完成其工作。

        这些警报会在空闲时显着影响设备的电源使用(从而导致调度它们的应用程序严重指责电池),因此应谨慎使用它们。为了减少滥用,对特定应用程序的警报响起频率有限制。在正常的系统操作下,它不会超过大约每分钟发送这些警报(此时每个此类挂起的警报都会被发送);在低功耗空闲模式下,此持续时间可能会更长,例如 15 分钟。

setExactAndAllowWhileIdle

        类似 setAndAllowWhileIdle ,区别在于此方法定时警报更加准确。

     需要精确的延时控制需要使用 setExact 或者 setExactAndAllowWhileIdle ,需要休眠仍然准确就只能使用 setExactAndAllowWhileIdle

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以使用AlarmManager来实现守护进程。具体实现步骤如下: 1. 创建一个Service,在Service中实现需要守护的业务逻辑。 2. 在Service的onStartCommand()方法中,启动一个定时器。 3. 使用AlarmManager定时启动Service,这样就可以保证Service一直在后台运行。 4. 在Service的onDestroy()方法中,重新启动Service,以保证Service一直在后台运行。 示例代码如下: ```java public class GuardService extends Service { private static final int INTERVAL = 60 * 1000; // 定时器间隔时间,60秒 private static final int REQUEST_CODE = 100; // 请求码 private static final String TAG = "GuardService"; // 日志标签 private AlarmManager mAlarmManager; private PendingIntent mPendingIntent; private Intent mIntent; @Override public void onCreate() { super.onCreate(); mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mIntent = new Intent(this, GuardService.class); mPendingIntent = PendingIntent.getService(this, REQUEST_CODE, mIntent, PendingIntent.FLAG_UPDATE_CURRENT); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "onStartCommand"); // 启动定时器 mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), INTERVAL, mPendingIntent); return START_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); // 重新启动Service Intent intent = new Intent(this, GuardService.class); startService(intent); } } ``` 在AndroidManifest.xml文件中声明Service: ```xml <service android:name=".GuardService" android:exported="false" /> ``` 这样就可以实现Android AlarmManager守护进程了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值