Android установить несколько будильников одновременно - PullRequest
3 голосов
/ 05 апреля 2011

Хорошо, позвольте мне изменить вопрос и сделать его намного проще.Надеюсь, вы сможете найти мне решение для этого.Обе тревоги должны быть запланированы одновременно, чего здесь не происходит.Я даже использую уникальный код запроса для ожидающего намерения. ПОМОГИТЕ мне, пожалуйста .....

// При нажатии Слушатель

private OnClickListener mOneShotListener = new OnClickListener() {
    public void onClick(View v) {

        Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
        PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,0, intent, 0);
        //I even tried sender = PendingIntent.getBroadcast(AlarmController.this,0, intent, PendinIntent.FLAG_UPDATE_CURRENT);


        //the alarm to go off 30 seconds from now.

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 30);

        // Schedule the alarm!

        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

        //adds 2 minutes to the time

        calendar.add(Calendar.MINUTE, 2);

        sender = PendingIntent.getBroadcast(AlarmController.this,1, intent,0);
        am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender2);
    }
};

СТАРЫЙ Вопрос:
Я хочу установить две тревоги одновременно для выполнения двух разных операций.

Например.Пользователь устанавливает будильник на 2 часа и устанавливает продолжительность на 15 минут.Первый аварийный сигнал должен срабатывать в 2 часа, который выполняет функцию 1, а второй аварийный сигнал должен срабатывать в 2:15, поскольку пользователь указал продолжительность в 15 минут, которая выполняет функцию 2.Эту операцию следует повторять каждый день в 2 часа, если пользователь не изменяет время.

Я вызываю обе эти функции по нажатию кнопки:

Событие по нажатию

saveButton.setOnClickListener(new View.OnClickListener() {  
    public void onClick(View view) {  
        ..........  
        ..........  
        new ReminderManager(this).setReminder(mRowId, mCalendar);  
        new ReminderManager(this).wakeReminder(mRowId, mCalendar, duration);  
        }  
    }

setReminder содержит

// устанавливает будильник на 2 часа

public void setReminder(Long taskId, Calendar when, String duration){  
    Intent i = new Intent(mContext, OnAlarmReceiver.class);
    i.putExtra(RemindersDbAdapter.KEY_ROWID, (long)taskId);    
    PendingIntent pi = PendingIntent.getBroadcast(mContext,(int)System.currentTimeMillis(), i, PendingIntent.FLAG_UPDATE_CURRENT);    
    mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);    
}

wakeReminder содержит

// добавляет длительность, т.е. 15 минут

public void wakeReminder(Long taskId, Calendar when, String duration){
    Intent i = new Intent(mContext, OnAlarmReceiverWake.class);
    i.putExtra(RemindersDbAdapter.KEY_ROWID, (long)taskId);
        Long d = Long.parseLong(duration);
        Long mins = d*60*100; 
        Long milli = when.getTimeInMillis() + mins;
        PendingIntent  pi = PendingIntent.getBroadcast(mContext, (int)System.currentTimeMillis(), i, PendingIntent.FLAG_UPDATE_CURRENT);
        mAlarmManager.set(AlarmManager.RTC_WAKEUP, milli, pi);
}

Я заметил, что всякий раз, когда mAlarmManager.set(); выполняется успешно, LogCat показывает уведомление, например
"enqueueToast pkg=com.jellboi.android.togglemode callback=android.app ITransientNotification$stub$proxy@43c0c5f8 duration=0"

но когда я устанавливаю обе тревоги одновременно, уведомление не отображается при выполнении mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);, а уведомление отображается при выполнении mAlarmManager.set(AlarmManager.RTC_WAKEUP, milli, pi);.Кроме того, уведомление установлено на исходное время, т.е. на 2 часа, а не после добавления 15 минут к его продолжительности.

Пожалуйста, помогите, я пробовал много способов вызова этой функции в разных местах, например, после 1-го будильника.уволен, но все напрасно.

Ответы [ 6 ]

8 голосов
/ 19 апреля 2012
PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,0, intent, 0);

У вас проблема в этой строке. Если вы хотите одновременно запустить две алармы, вы должны сделать что-то вроде этого

PendingIntent sender =       PendingIntent.getBroadcast(AlarmController.this,giveUniqueRequestIdsHere, intent, 0);
4 голосов
/ 30 апреля 2012
sender = PendingIntent.getBroadcast(this, (int) System.currentTimeMillis(), i, PendingIntent.FLAG_ONE_SHOT);

Сделайте то же самое для вашего PendingIntent.getActivity ();

2 голосов
/ 20 апреля 2012

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

final int intent_id = (int) System.currentTimeMillis();
0 голосов
/ 26 января 2014

похоже, что вы забыли установить "sender2" перед вашим вторым вызовом.

вы меняете значение отправителя, а затем помещаете sender2 в качестве аргумента.

0 голосов
/ 19 июня 2012

Когда запускается новый OneShotAlarm.class, он должен разработать режим запуска.Настройка по умолчанию игнорирует второй запуск, если первый экземпляр все еще существует.

Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
intent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
0 голосов
/ 05 апреля 2011

Попробуйте это:

Calendar cal = new GregorianCalendar();
Date date = cal.getTime();
cal.clear();

Cursor c = database.query(mArray.get(mPosition), new String[]{"days"},"days"+"!="+0, null, null, null, null);
cal.set(Calendar.YEAR,2011);
cal.set(Calendar.MONTH,date.getMonth());
cal.set(Calendar.DAY_OF_MONTH,date.getDate());
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, min);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(nextScreen.this, AlaramReciver.class);
i.putExtra("Start",mArray.get(mPosition));

Editor medit = getSharedPreferences("Start", 0).edit();
medit.putString("Start", mArray.get(mPosition));medit.commit();

PendingIntent pendingintent = PendingIntent.getBroadcast(this,mPosition, i, 0);
mgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingintent);

Вы установили время таким образом, и, как только вы установите время в диспетчере аварий, оно будет автоматически вызывать функции ежедневно. Используйте другой код запроса для pendingintent.

Если вы хотите вызвать вторую функцию. Вы просто добавляете время за 15 минут в

cal.set(Calender.MINUTE,min+15);
...