【问题标题】:Alarm not getting stopped警报没有停止
【发布时间】:2014-04-26 20:54:36
【问题描述】:

我正在尝试停止警报并检查它是否停止,但它总是返回 true 表示警报正在工作。我试图根据链接https://stackoverflow.com/a/17616299/1226882 中的答案停止警报,但它对我不起作用。

请参考以下代码

  • 启动闹钟

    public static void startSchedulerAlaram(Context ctx) {
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    
    if (calendar.compareTo(Calendar.getInstance()) <= 0)
        calendar.add(Calendar.DATE, 1);
    
    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    
    Intent intent = new Intent(ctx, Alaram_Receiver.class);
    intent.setAction(Utility.SCHEDULE_ACTION);
    
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 1, intent,0);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
    calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pi);
    
    log("Scheduler Alarm", "Started");
    
    }
    
  • 停止闹钟

    public static void stopSchedulerAlaram(Context ctx) {
    
    Intent intent = new Intent(ctx, Alaram_Receiver.class);
    intent.setAction(Utility.SCHEDULE_ACTION);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 1,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(pendingIntent);
    
    log("Scheduler Alarm", "Stopped");
    }
    
  • 检查警报

    public static boolean checkSchedulerAlaram(Context ctx) {
    
    boolean alarmUp = (PendingIntent.getBroadcast(ctx, 1, new Intent(ctx,Alaram_Receiver.class).setAction(Utility.SCHEDULE_ACTION),
            PendingIntent.FLAG_NO_CREATE) != null);
    
    return alarmUp;
    }
    

【问题讨论】:

  • 贴出你使用 stopSchedulerAlaram() 的部分
  • 我正在使用来自活动的stopSchedulerAlaram(),例如if (Utility.checkSchedulerAlaram(this)) Utility.stopSchedulerAlaram(this);
  • 我正在调用同一活动的开始、停止和检查

标签: android alarmmanager


【解决方案1】:

你必须通过different id for set alarm

PendingIntent.getBroadcast(ctx, id, intent,PendingIntent.FLAG_UPDATE_CURRENT);

对于cancel alarm you have pass sameidthat you used for set

PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, id,
        intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) ctx
        .getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);

【讨论】:

  • 还是不行,我尝试设置不同的id来停止报警。
  • @droid_dev 如果您使用相同的 id 设置和取消警报,它应该可以工作
  • 它会工作,但 checkSchedulerAlaram 会在 1 分钟或半分钟后返回响应
  • 额外的也必须通过吗?我一直在尝试取消重复警报。但它不起作用。我传递了相同的操作代码、意图(没有额外的)和标志,但仍然不起作用
【解决方案2】:

您正在使用此代码来确定是否设置了警报:

boolean alarmUp = (PendingIntent.getBroadcast(ctx, 1, new Intent(ctx,Alaram_Receiver.class).setAction(Utility.SCHEDULE_ACTION),
    PendingIntent.FLAG_NO_CREATE) != null);

此代码依赖PendingIntent 的存在来确定是否安排了警报。

当您取消闹钟时,您会这样做:

PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 1,
    intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) ctx
    .getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);

这会取消警报,但不会从系统中删除PendingIntent。由于您依赖 PendingIntent 的存在/不存在来了解警报是否已安排,因此您还需要取消 PendingIntent 以便将其从系统中删除。这样做(取消警报后):

pendingIntent.cancel();

【讨论】:

    【解决方案3】:

    这是我用来取消警报服务的代码

    Intent intent = new Intent(this, MyReceiver.class);
             PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
             AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
             alarmManager.cancel(sender);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 2013-11-20
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多