【问题标题】:Alarm manager which set only once after two minutes两分钟后仅设置一次的警报管理器
【发布时间】:2023-06-29 14:01:01
【问题描述】:

我在alarmmanager上找到了很多设置重复闹钟的答案,但我想设置闹钟,在我点击按钮后2分钟后设置闹钟,它只会出现一次,我不希望它重复。

请帮忙

【问题讨论】:

  • ... 和?使用set() 而不是setRepeating() 需要什么?你甚至搜索过这个主题吗?
  • 您可以使用处理程序等待2分钟或在2分钟后设置警报并调用意图服务,该服务设置您的一次性警报
  • 我想在当前时间 2 分钟后设置闹钟,然后在两分钟后执行它,以便我可以在广播接收器中使用它
  • 如果您只希望它工作一次,请使用计时器、处理程序或倒数计时器。

标签: android broadcastreceiver alarmmanager


【解决方案1】:

API

从 API 19 (KITKAT) 开始,警报传递是不准确的:操作系统将切换警报以最大程度地减少唤醒和电池使用。有新的 API 来支持需要严格交付保证的应用程序;参见 setWindow(int, long, long, PendingIntent) 和 setExact(int, long, PendingIntent)。 targetSdkVersion 早于 API 19 的应用程序将继续看到以前的行为,即所有警报都在请求时准确传递。

参考:https://developer.android.com/reference/android/app/AlarmManager.html

【讨论】:

    【解决方案2】:

    试试这个,希望对你有用

        int milliseconds = 120000;
    
    
    new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
    
                yourMethod(); // this method will be called after 2 minutes 
    
            }
        },milliseconds);
    

    【讨论】:

      【解决方案3】:

      您可以使用它会在 2 分钟后仅通知一次,您也可以将其更改为秒或小时。

      JAVA

      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(System.currentTimeMillis());
      calendar.add(Calendar.MINUTE, 2); //Minutes
      AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
      Intent alarmIntent = new Intent(this, MyBroadCastReceiver.class);
      PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);    
      alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent); 
      

      科特林

      val calendar = Calendar.getInstance()
      calendar.timeInMillis = System.currentTimeMillis()
      calendar.add(Calendar.MINUTE, 2)
      val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager?
      val alarmIntent = Intent(context, AlarmReceiver::class.java)
      alarmIntent.action = "FOO_ACTION"
      alarmIntent.putExtra("alarm", "A")
      val pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0)
      alarmManager!!.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
      

      【讨论】:

        最近更新 更多