【问题标题】:How can create more than one alarm?如何创建多个警报?
【发布时间】:2011-07-08 07:02:07
【问题描述】:

我可以使用以下代码创建和取消警报。 我想创建多个警报。警报时间来自一个数组列表。在这个数组列表中,我想为每个日期创建一个警报。按下取消按钮将仅取消当前警报。我该怎么做?

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    setOneTimeAlarm(); 

    buttonCancel.setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);

            // Tell the user about what we did.
            Toast.makeText(MainActivity.this, "Cancel!", Toast.LENGTH_LONG).show();
        }
    });
}

private void setOneTimeAlarm() {
    Intent intent = new Intent(this, AReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}

【问题讨论】:

    标签: android android-alarms


    【解决方案1】:

    我将发布一个示例,说明我在我创建的一个应用程序中的做法。

    调用警报时,您需要发送一个额外的 id,如下所示: Tmp 是一个具有唯一 ID 的对象。

    Intent intent = new Intent(DisplayActivity.this,AlarmReciever.class);
    
    intent.setData(Uri.parse("timer:"+tmp.getId()));
    
    PendingIntent pendingIntent = PendingIntent.getBroadcast(DisplayActivity.this,1, intent, 0);
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
    

    然后你用这一行检索 id:

    Long.parseLong(intent.getData().getSchemeSpecificPart())
    

    取消时只需使用 ID 创建相同的待处理意图并调用 alarmmanager.cancel()

    编辑:

    要取消用户单击的项目上的特定警报(这里是 tmp.getId 派上用场的地方)我刚刚使用了这段代码,我认为您需要创建相同的 pendingIntent 才能取消特定警报。

     Intent intent = new Intent(DisplayActivity.this,AlarmReciever.class);
     intent.setData(Uri.parse("timer:"+tmp.getId()));
     PendingIntent pendingIntent = PendingIntent.getBroadcast(DisplayActivity.this,1, intent, 0);
     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
     am.cancel(pendingIntent);
    

    AlarmReciever 是我的 BroadcastReceiver。 DisplayActivity 是活动本身。

    它在 AlarmReciever 我有以下代码:

    Long.parseLong(intent.getData().getSchemeSpecificPart())
    

    【讨论】:

    • 感谢大卫的回答,但我不明白如何在 AlarmManager 中设置日期列表。
    • 为什么要列表?这会创建几个不同的警报,只需在日历对象中放置不同的值。我在本地数据库中保留了所有警报的参考,以便能够显示它们并全部取消它们。循环并在几个上调用alarmmanager.set,或者你到底是什么意思?
    • 我想我也有同样的问题。我从设置警报的地方获得服务。如果我设置了多个警报,则只有最后一个有效。所以我不明白:如果我想设置多个警报,我应该使用 ID,还是 ID 仅用于取消目的?
    • 为了能够设置多个警报,您需要像我在答案中输入的 ID。否则你只会得到最后一个。所以这是为了能够拥有几个。
    • 您还有什么问题?一个新的还是因为解决方案?
    【解决方案2】:

    这是大卫关于如何获取唯一 ID 的回复的延续。

    唯一 ID 可以来自 SQLITE 表。在创建表来存储提醒日期和时间时,有一个带有 AUTOINCREMENT 的 _ID 列。插入行时,此列将自动获取单数和唯一数。该表还将帮助您为您存储提醒,以防设备关闭并且您想再次重新创建提醒。在设备关闭时,我认为警报会丢失。

    CREATE TABLE IF NOT EXISTS reminder_datetime
    _ID INTEGER PRIMARY KEY AUTOINCREMENT,
    NOTIF_DATETIME INTEGER;
    

    要从表中设置和获取日期,请使用 Calendar 对象:

    Calendar cal = Calendar.getInstance();
    

    然后您可以使用 cal.setTime 或 cal.setTimeInMillis 函数。 同样,get 函数获取日期。

    如果要将日期格式化为可读格式,请使用日期格式:

    myDate = android.text.format.DateFormat.format("MM/dd/yyyy", cal.getTimeInMillis()).toString();
    

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 2021-04-08
      • 1970-01-01
      • 2022-01-16
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多