You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Android Studio重新运行应用后AlarmManager设置的闹钟消失

问题分析与解决方案

核心原因

Android Studio重新运行应用(Shift+F10)会执行覆盖安装操作,系统会自动移除该应用此前注册的所有AlarmManager闹钟。而你仅在首次设置时调用了setRepeating(),未在应用启动流程中重新检查并恢复闹钟,导致覆盖安装后旧闹钟被清除、新启动的应用未补设,最终dumpsys alarm中无法查到闹钟条目。

解决步骤

  1. 在应用启动时检查并恢复闹钟
    在自定义Application类的onCreate()方法,或主Activity的onCreate()中,添加闹钟检查逻辑:通过匹配原闹钟的PendingIntent判断是否存在,若不存在则重新设置。

  2. 示例代码

    // 构建与原闹钟完全一致的Intent和PendingIntent
    Intent alarmIntent = new Intent(this, YourAlarmReceiver.class);
    // 使用FLAG_NO_CREATE,仅当PendingIntent已存在时返回实例,否则返回null
    // Android 12+需添加FLAG_IMMUTABLE/FLAG_MUTABLE
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
        this,
        0,
        alarmIntent,
        PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_IMMUTABLE
    );
    
    if (pendingIntent == null) {
        // 闹钟不存在,重新设置重复闹钟
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        long firstTriggerTime = System.currentTimeMillis() + 60 * 1000; // 1分钟后首次触发
        long repeatInterval = 60 * 60 * 1000; // 每小时重复一次
    
        // 重新创建用于设置闹钟的PendingIntent
        PendingIntent newPendingIntent = PendingIntent.getBroadcast(
            this,
            0,
            alarmIntent,
            PendingIntent.FLAG_IMMUTABLE
        );
        alarmManager.setRepeating(
            AlarmManager.RTC_WAKEUP,
            firstTriggerTime,
            repeatInterval,
            newPendingIntent
        );
    }
    
  3. 关键注意事项

    • 确保PendingIntent的匹配规则与原闹钟完全一致:请求码(第二个参数)、Intent的Action/Component/Extra等必须完全相同,否则系统会认为是不同的PendingIntent,无法正确判断闹钟是否存在。
    • Android 12及以上版本,必须为PendingIntent指定FLAG_IMMUTABLE或FLAG_MUTABLE,否则会抛出异常。

内容的提问来源于stack exchange,提问作者Pavel Poley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:40:45