Страница 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
никто не сталкивался с такой проблемой?