Как создать более одного будильника? - PullRequest
5 голосов
/ 08 июля 2011

Я могу создать и отменить сигнал тревоги с кодом ниже. Я хочу создать более одного будильника. Время будильника исходит от arraylist. В этом arraylist я хотел бы создать будильник для каждой даты. А нажатие кнопки отмены отменяет только текущий сигнал тревоги. Как я могу это сделать?

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);
}

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Я опубликую пример с тем, как я это сделал в одном из приложений, которые я создал.

При вызове будильника необходимо отправить дополнительный идентификатор, подобный следующему: Tmp - это объект, имеющий уникальный идентификатор.

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);

и затем вы получаете идентификатор с этой строкой:

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

При отмене просто создайте то же самое ожидающее намерение с идентификатором и вызовите 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())
1 голос
/ 12 июля 2011

Это продолжение ответа Дэвида о том, как получить уникальный идентификатор.

Уникальный идентификатор может быть получен из таблицы SQLITE.При создании таблицы для хранения даты и времени напоминания используйте столбец _ID с AUTOINCREMENT.Когда строки вставляются, этот столбец автоматически получает однозначные и уникальные числа.Таблица также поможет вам сохранить напоминания для вас, если устройство выключено и вы хотите заново создать напоминания.При выключении устройства, я думаю, тревоги будут потеряны.

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

Для работы с настройкой и получением дат из таблицы используйте объект Calendar:

Calendar cal = Calendar.getInstance();

Затем вы можете использоватьФункции .setTime или cal.setTimeInMillis.Точно так же, получить функции для получения даты.

Используйте формат даты, если хотите отформатировать дату в удобочитаемую:

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