如何在 Android 中停止重复警报服务?

Posted

技术标签:

【中文标题】如何在 Android 中停止重复警报服务?【英文标题】:How to Stop Repeating Alarm Services in Android? 【发布时间】:2011-11-18 08:37:48 【问题描述】:

我有 totalTime = 1 hr 和 intervalTime = 5min,两者都以毫秒为单位,

我想在每个时间间隔重复我的 GPSSetting 服务,并且在总时间完成后应该停止此重复。

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                Intent intent1 = new Intent(C2DMReceiver.this, GPSSetting.class);
                PendingIntent pendingIntent = PendingIntent.getService(
                        C2DMReceiver.this, 0, intent1, 0);
                am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), intervalTime,
                        pendingIntent);

那么我该如何停止这个重复的警报呢?

问候, 吉里什

【问题讨论】:

***.com/questions/3330522/… 【参考方案1】:

创建与注册警报时相同的PendingIntent,然后使用AlaramManager.cancel() 取消它。

【讨论】:

将警报第一次运行的时间存储在某处,并计算每次运行的经过时间。如果超过1小时,取消闹钟。 不,但这里有一个提示:您可以使用System.currentTimeMillis() 获取当前时间。一小时是60 * 60 * 1000 毫秒。算一下。 如何计算经过的时间? 最后提示:elapsed = t2 - t1 我想在 1 小时后自动取消闹钟..那么我该怎么做呢?【参考方案2】:

如果您为重复时间间隔设置了警报服务并且您想取消您的服务,那么这个解决方案将帮助您,首先我在每 30 秒后创建重复服务,但是当我按下停止按钮,然后它将取消我生成的所有服务。

  public void AlarmService_afte30sec()
   

       Toast.makeText(this, "Starting  Alarm Services", Toast.LENGTH_LONG).show();
       Intent myIntent = new Intent(this, StartAlarmServices.class);
       pendingIntent = PendingIntent.getService(this, 0, myIntent, 0);

               alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                int sec=30;
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sec*1000, pendingIntent);
     

现在我将使用相同的“pendingintent”和“alarmManager”停止/取消此服务,取消此代码将是

  public void stopservice()
 
        alarmManager.cancel(pendingIntent);      
   

【讨论】:

【参考方案3】:

您可以传递一个意向额外值作为从当前系统时间开始的 1 小时(或任何时间)。然后,您可以从服务的 onBind() 事件内部检查该值并进行比较。下面是一个例子:

 //your code:
 AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            Intent intent1 = new Intent(C2DMReceiver.this, GPSSetting.class);

 //my code:
 intent1.putExtra("end", System.currentTimeMillis() + 3600000); //current time plus 1 hour

 //your code:
            PendingIntent pendingIntent = PendingIntent.getService(
                    C2DMReceiver.this, 0, intent1, 0); //You might wanna give PendingIntent.FLAG_UPDATE_CURRENT as flag.
            am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), intervalTime,
                    pendingIntent);

然后在 onBind() 方法内部:

public IBinder onBind(Intent intent) 
    // TODO Auto-generated method stub
 long end = intent.getLongExtra("end", 0);
 if(end <= System.currentTimeMillis())
      AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
      PendingIntent pendingIntent = PendingIntent.getService(
                    this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
      am.cancel(pendingIntent);
 
    return null;

不确定它是否适用于服务,但它适用于 BroadcastReceiver。

【讨论】:

【参考方案4】:

您可以通过传递您在警报管理器的取消方法中设置时使用的相同待处理意图来取消警报:

am.cancel(pendingIntent);

【讨论】:

@maneesh....我想在 1 小时后自动取消警报..那么我该怎么做呢? 您必须设置另一个警报,该警报将在一小时后立即起作用,并且只负责取消特定警报

以上是关于如何在 Android 中停止重复警报服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中停止闹钟

如何在zabbix中监视任何端口或服务时停止zabbix中的错误警报

屏幕打开/关闭时如何更新 Android 小部件?

停止闹钟在另一个活动中响起 - android

如何在Android中强制停止AsyncTask [重复]

应用程序停止时如何在 Android 中获取本地通知?