Страница 1 из 1
задать интервал для срабатывания будильника
Добавлено: 05 мар 2015, 16:03
nikomp
Добрый день!
Задаю будильник следующим образом
Код: Выделить всё
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), Interval, pIntent);
проблема в том, что не знаю как задать интервал срабатывания, например "каждый месяц" (например 23 числа каждого месяца), ведь в месяце может быть разное кол-во дней.
Re: задать интервал для срабатывания будильника
Добавлено: 05 мар 2015, 17:11
doter.ua
nikomp писал(а):Добрый день!
Задаю будильник следующим образом
Код: Выделить всё
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), Interval, pIntent);
проблема в том, что не знаю как задать интервал срабатывания, например "каждый месяц" (например 23 числа каждого месяца), ведь в месяце может быть разное кол-во дней.
Ну вообще кол-во дней статичное, за исключением февраля в високосный год.
Re: задать интервал для срабатывания будильника
Добавлено: 06 мар 2015, 09:20
nikomp
doter.ua писал(а):
Ну вообще кол-во дней статичное, за исключением февраля в високосный год.
а как же 30 и 31 число ))). например мне нужно чтоб напоминание срабатывало каждое 20 число каждого месяца. если напоминание например ставить в марте (31 день) и задать интервал 30, оно сработает 19 апреля, в мае опять сработает 19 числа (30 дней в апреле), а в июне 20 т.к. в мае уже 31.
надеюсь доступно описал.
пока вижу каждый раз переставлять будильник и интервал высчитывать для каждого месяца свой
Re: задать интервал для срабатывания будильника
Добавлено: 10 мар 2015, 10:29
nikomp
Народ, подскажите пожалуйста!
Re: задать интервал для срабатывания будильника
Добавлено: 10 мар 2015, 11:10
doter.ua
nikomp писал(а):Народ, подскажите пожалуйста!
Я не говорил, что будет легко. Суть в том, что у каждого месяца статичное кол-во дней.
Если казуальный варик, то раз в сутки срабатывает аларм, который проверяет сегодняшнее число на == 20. В случае успеха выводит что-то, иначе заводит себеподобного на следующий день)
Re: задать интервал для срабатывания будильника
Добавлено: 10 мар 2015, 16:00
nikomp
пробую обновить свой будильник, т.е. при срабатывании перенастроить его на следующий месяц. Возник такой вопрос, как связать свой будильник с записью в БД. Предположил что это можно сделать через Intent.putExtra и класть туда ID записи он же ID будильника, но тут возник другой вопрос, как из БД получить значение автоинкрементного поля после добавления записи?
Таблица будильников:
Код: Выделить всё
db.execSQL("CREATE TABLE "+DB_TABLE+"("+
COLUMN_ID+" integer primary key autoincrement, "+
COLUMN_NOTE+" text, "+
COLUMN_DATE+" text, "+
COLUMN_TIME+" text, "+
COLUMN_TYPE+" text, "+
COLUMN_EI+" text, "+
COLUMN_INTRVL+" integer"+");");
Re: задать интервал для срабатывания будильника
Добавлено: 10 мар 2015, 16:37
nikomp
нашел вот такую функцию last_insert_rowid(), но пока не разобрался как она работает
Re: задать интервал для срабатывания будильника
Добавлено: 10 мар 2015, 18:00
doter.ua
nikomp писал(а):нашел вот такую функцию last_insert_rowid(), но пока не разобрался как она работает
Никто ж не заставляет автоинкремент использовать, сделай без него и вставляй свои ИД.
Re: задать интервал для срабатывания будильника
Добавлено: 11 мар 2015, 16:22
altwin
nikomp писал(а):Добрый день!
Задаю будильник следующим образом
Код: Выделить всё
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), Interval, pIntent);
проблема в том, что не знаю как задать интервал срабатывания, например "каждый месяц" (например 23 числа каждого месяца), ведь в месяце может быть разное кол-во дней.
Возьмите текущую дату, в данном случае отфильруйте 23 число и в случае совпадения -работайте.
Re: задать интервал для срабатывания будильника
Добавлено: 17 мар 2015, 09:57
nikomp
Подскажите пожалуйста!
Будильник устанавливаю с интервалом месяц.
Логика такая, при первоначальной установке будильник ставится таким образом:
Код: Выделить всё
am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyService.class);
intent.putExtra("myNote",note1);
intent.putExtra("myAlarmID", inidAlarm);
PendingIntent pIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
// Установим напоминание на след месяц
if (stEI.equals("месяц")==true) {
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pIntent);
}
информация о будильнике сохраняется в БД. при его срабатывании он переустанавливается, вот так:
Код: Выделить всё
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// открываем подключение к БД
db = new DB(this);
Log.d(LOG_TAG, "открыли подключение к БД");
btnAdd = (Button) findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(this);
btnAll = (Button) findViewById(R.id.btnAll);
btnAll.setOnClickListener(this);
etNote = (EditText) findViewById(R.id.etNote);
etDate = (EditText) findViewById(R.id.etDate);
etTime = (EditText) findViewById(R.id.etTime);
// выведем напоминание
Intent intent = getIntent();
note1 = intent.getStringExtra(Note);
int inidAlarm = intent.getIntExtra("myAlarmID", 0);
Log.d(LOG_TAG, "ид будилы после срабатывания "+Integer.toString(inidAlarm));
if (inidAlarm!=0) {
db.open();
String stType=db.getType(inidAlarm);
String stEi=db.getEI(inidAlarm);
if ((stType.equals("Будильник с повтором")==true) && (stEi.equals("месяц")==true)) {
long Interval=db.getInterval(inidAlarm);
Log.d("myLogs","интервал ="+Long.toString(Interval));
// Продлим работу будильника на следующий интервал
Calendar cal1 = null;
try {
// преобразование строки в дату
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
String datestr = db.getDate(inidAlarm)+" "+db.getTime(inidAlarm);
Date date3 = dateFormat.parse(datestr);
cal1 = Calendar.getInstance();
cal1.setTime(date3);
} catch (ParseException ex) {
}
Calendar cal2 = null;
cal2 = Calendar.getInstance();
cal2.set(cal1.get(cal1.YEAR), cal1.get(cal1.MONTH)+(int)Interval, cal1.get(cal1.DAY_OF_MONTH), cal1.get(cal1.HOUR), cal1.get(cal1.MINUTE));
Log.d("myLogs", "Переставили будильник "+cal2);
long diff = cal2.getTimeInMillis() - cal1.getTimeInMillis();
Log.d("myLogs", "Переставили будильник на интервал "+Long.toString(diff));
am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent1 = new Intent(this, MyService.class);
Log.d(LOG_TAG, "напоминание "+note1+" "+Integer.toString(inidAlarm));
intent1.putExtra("myNote",note1);
intent1.putExtra("myAlarmID", inidAlarm);
PendingIntent pIntent1 = PendingIntent.getService(this, 0, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, diff, pIntent1);
Log.d("myLogs", "Переставили будильник");
}
etDate.setText(db.getDate(inidAlarm));
etTime.setText(db.getTime(inidAlarm));
db.close();
}
etNote.setText(note1);
// Настройки напоминания
sp = PreferenceManager.getDefaultSharedPreferences(this);
sp.edit().clear().commit();
}
проблема в том, что когда будильник срабатывает я открываю напоминание, и будильник опять срабатывает и так бесконечно. Непонимаю откуда взялся этот цикл.
В логе все вроде нормально.
Re: задать интервал для срабатывания будильника
Добавлено: 17 мар 2015, 10:08
nikomp
нашел ошибку, при повторной установке будильника подавал на вход разницу во времени, а надо было указать следующую дату.
Re: задать интервал для срабатывания будильника
Добавлено: 25 мар 2015, 08:42
nikomp
Возникла еще трудность. при установке будильника на следующий день он ошибается при срабатывании на несколько минут.
устанавливаю вот так:
Код: Выделить всё
Calendar cal = null;
try {
// преобразование строки в дату
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
String datestr = date+" "+time;
//Log.d(LOG_TAG, "дата_____ "+datestr);
//Date date3 = dateFormat.parse("26/01/2015 07:26");
Date date3 = dateFormat.parse(datestr);
//Log.d(LOG_TAG, "дата_____ "+date3);
cal = Calendar.getInstance();
cal.setTime(date3);
} catch (ParseException ex) {
}
Log.d(LOG_TAG, "получаем календарь "+cal);
// Устанавливаем будильник
am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyService.class);
Log.d(LOG_TAG, "напоминание "+note1);
intent.putExtra("myNote",note1);
intent.putExtra("myAlarmID", inidAlarm);
PendingIntent pIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
// Напоминание
Log.d(LOG_TAG, "тип "+stTypeNotif);
if (stTypeNotif.equals("Напоминание")) {
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pIntent);
}
как подправить ошибку, в логах вроде все норм.
еще заметил, что если поставить будильник не на след день а на тот же, то все равно есть задержка при срабатывании на несколько секунд, такое ощущение, что она накапливается каким-то образом
Re: задать интервал для срабатывания будильника
Добавлено: 25 мар 2015, 11:57
nikomp
никто не сталкивался с такой проблемой?