Как реализовать будильник на Android, который отключается через действие на другом экране? - PullRequest
1 голос
/ 06 декабря 2011

Я пытаюсь создать сигнал тревоги Android, который будет отключаться при завершении действия на другом экране (т.е. пользователь вводит ответ в математическую задачу).

Как мне:

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

Я попытался следовать этому примеру с предложенным решением: Невозможно установить время будильника в Android

но он не воспроизводит рингтон. Я добавил это прямо под строкой

Toast.makeText(BrainBuzzActivity.this, "Alarm has been set.", Toast.LENGTH_LONG).show();

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if(alert == null){
     // alert is null, using backup
     alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
     if(alert == null){
        // alert backup is null, using 2nd backup
        alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);               
     }
}

ОРИГИНАЛ Главная страница (создание намерения)

    public class BrainBuzzActivity extends Activity 
    {
        private Button alarm = null;
        private AlarmManager alarmManager = null;
        Calendar cal = Calendar.getInstance();
        static final int DIALOG_TIME = 0;


alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarm = (Button) findViewById(R.id.alarm);
    alarm.setOnClickListener(new View.OnClickListener() {         
        public void onClick(View v) {
            showDialog(DIALOG_TIME);
        }
    });
}

    protected Dialog onCreateDialog(int id) {
    Dialog dialog = null;
    switch(id){
    case DIALOG_TIME:
        dialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {

            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                Calendar c = Calendar.getInstance();
                c.setTimeInMillis(System.currentTimeMillis());
                // c.clear();
                //c.set(Calendar.YEAR, 2011);
                //c.set(Calendar.MONTH, 6);
                //c.set(Calendar.DAY_OF_MONTH, 4);
                c.set(Calendar.HOUR_OF_DAY, hourOfDay);
                c.set(Calendar.MINUTE, minute);
                c.set(Calendar.SECOND, 0);
                //c.set(Calendar.MILLISECOND, 0);
                Intent intent = new Intent(BrainBuzzActivity.this,AlarmReceiver.class);
                PendingIntent pi = PendingIntent.getBroadcast(BrainBuzzActivity.this, 0, intent, 0);
                alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pi);
                Toast.makeText(BrainBuzzActivity.this, "Alarm has been set.", Toast.LENGTH_LONG).show();

                Intent i = new Intent(BrainBuzzActivity.this, CloudCapture.class);
                startActivity(i);
            }
        },cal.get(Calendar.HOUR_OF_DAY),cal.get(Calendar.MINUTE),false);
        break;
    }
    return dialog;
}

1 Ответ

0 голосов
/ 06 декабря 2011

При создании будильника вы используете метод AlarmManager

setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)

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

Чтобы отменить тревогу, необходимо создать PendingIntent того же вида , который определен в документации как

та же операция, то же действие намерения, данные, категории и компоненты, и те же флаги

и затем используйте

cancel(PendingIntent operation)

...