Планирование нескольких будильников

Я пытаюсь вызвать 3 будильника в разное время с помощью диспетчера будильников. Вот мой код (обратите внимание, что alarm1, alarm2, alarm3 — это три объекта календаря, установленные ранее в моем коде):

AlarmNum=1;
new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            // TODO Auto-generated method stub
            Intent myIntent = new Intent(MainActivity.this,
                    MyAlarmService.class);
            pendingIntent = PendingIntent.getService(MainActivity.this, 0,
                    myIntent, 0);

            if (AlarmNum == 1)
                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        alarm1.getTimeInMillis(), pendingIntent);
            else if (AlarmNum == 2)
                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        alarm2.getTimeInMillis(), pendingIntent);
            else
                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        alarm3.getTimeInMillis(), pendingIntent);

            Toast.makeText(MainActivity.this, "Start Alarm",
                    Toast.LENGTH_LONG).show();
        }
    };

В приведенном выше коде я запускаю намерение, которое вызывает класс MyAlarmService, указанный ниже:

public class MyAlarmService extends Service {
MainActivity instance;
MediaPlayer mp;

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG)
            .show();
    mp = MediaPlayer.create(this, R.raw.alarmtone);
    instance = new MainActivity();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG)
            .show();
    return null;
}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG)
            .show();
}

@Override
public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);
    Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG)
            .show();
    mp.start();
    instance.setAlarmNum(instance.getAlarmNum() + 1);
}

@Override
public boolean onUnbind(Intent intent) {
    // TODO Auto-generated method stub
    mp.release();
    mp.reset();
    Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG)
            .show();
    return super.onUnbind(intent);
}

} Я предполагаю, что здесь есть проблема, потому что всплывающие уведомления никогда не появляются, как и будильник.


person Adnan Zahid    schedule 21.07.2012    source источник
comment
Вы видите этот тост: Toast.makeText(MainActivity.this, Start Alarm, Toast.LENGTH_LONG).show(); ?   -  person Erol    schedule 22.07.2012
comment
Первый раз увидел, но больше никогда. Я думаю, что ожидающее намерение необходимо отменить, чтобы использовать его снова.   -  person Adnan Zahid    schedule 22.07.2012
comment
Нет, это не должно быть. Как вы тестируете свой код? Вы планируете будильники сразу после друг друга? Как часто меняется AlarmNum?   -  person Erol    schedule 22.07.2012
comment
Думаю, если вы заглянете в класс MyAlarmService, то обнаружите, что после запуска одного будильника AlarmNum увеличивается на 1. Но проблема в том, что этот класс вообще не читается.   -  person Adnan Zahid    schedule 22.07.2012


Ответы (1)


Из вашего кода и комментариев я понял, что вы хотите, чтобы первый сигнал тревоги запускал второй, а второй сигнал тревоги запускал третий и т. д.

Несколько проблем, которые я заметил с вашим кодом.

1) Это неправильный способ запуска активности, он не сработает:

instance = new MainActivity();

Вместо этого вы должны сделать это:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

Независимо от вышеупомянутой проблемы, вам не нужно запускать MainActivity каждый раз, когда срабатывает ваш будильник. Вы можете просто активировать новый сигнал тревоги внутри вашего сервиса. Здесь я предполагаю, что время срабатывания второго будильника позже первого, третьего позже второго и т. д. В противном случае ваш алгоритм не будет работать.

Первый будильник будет установлен в вашей деятельности:

Intent myIntent = new Intent(MainActivity.this, MyAlarmService.class);
myIntent.addExtra("AlarmNum",1);
PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0,
                    myIntent, 0);

alarmManager.set(AlarmManager.RTC_WAKEUP,alarm1.getTimeInMillis(), pendingIntent);

Обратите внимание, что я добавил к вашему намерению дополнительное целое число, чтобы ваша служба могла понять, какой будильник был установлен ранее.

Вернувшись к функции service onBind, вы должны прочитать это дополнение в своем намерении.

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
...
int AlarmNum = intent.getIntExtra("AlarmNum",0);
...
    return null;
}

Затем проверьте значение AlarmNum и установите следующий будильник так же, как мы это сделали, в зависимости от значения (если AlarmNum == 1, установите второй будильник, увеличивая дополнительное намерение на 1 и т. д.). Поскольку вам нужно установить 3 будильника, если он показывает 3, вы ничего не сделаете, кроме как завершите свое обслуживание.

В качестве побочного уведомления рекомендуется отображать всплывающие сообщения в вашей службе с помощью обработчика.

person Erol    schedule 21.07.2012
comment
Эй, можешь сделать мне одолжение? Можете ли вы ответить на этот вопрос?stackoverflow.com/questions/11592712/ - person Adnan Zahid; 22.07.2012