Android-будильник срабатывает сразу после создания

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

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

public class Alarm {
private String name;
private int id;
private Calendar time;
private boolean on = true;

public Alarm(String name, int id, Calendar time) {
    this.setName(name);
    this.setId(id);
    this.setTime(time);
}

public Alarm() {

}

    ...
public PendingIntent createPendingIntent(Context context) {
      Intent intent = new Intent(context, MathAlarmReceiverActivity.class);
      intent.putExtra("name", getName());
        PendingIntent pendingIntent = PendingIntent.getActivity(context,
            id, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        return pendingIntent;
}


    ...

}

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

Далее у меня есть Activity, в котором на самом деле есть средство выбора времени:

public class EditActivity extends Activity {

    public static int CODE_EDIT = 100;
    public static int CODE_ADD = 101;
    Button doneButton;
    TimePicker tp;
    EditText editName;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit);
        doneButton = (Button) findViewById(R.id.buttonDone);
        doneButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                done();

            }
        });
        tp = (TimePicker) findViewById(R.id.timePicker);
        editName = (EditText) findViewById(R.id.editTextAlarmName);

        if (getIntent().getExtras().getInt("requestCode") == CODE_ADD) {
            setTitle("Add Alarm");
            doneButton.setText("Add Alarm");
        } else {
            doneButton.setText("Edit Alarm");
            editName.setText(getIntent().getExtras().getString("name"));
            Calendar c = TimeUtils.stringToCalendar(getIntent().getExtras().getString("time"));
            tp.setCurrentHour(c.get(Calendar.HOUR_OF_DAY));
            tp.setCurrentMinute(c.get(Calendar.MINUTE));

            setTitle("Edit Alarm");

        }
        if (android.os.Build.VERSION.SDK_INT > 10) {

            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

       ...

    private void done() {
        String name = editName.getText().toString().trim();
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY, tp.getCurrentHour());
        c.set(Calendar.MINUTE, tp.getCurrentMinute());
        String time = TimeUtils.calendarToString(c);
        if (name.length() == 0) {
            AlertDialog.Builder b = new AlertDialog.Builder(this);
            b.setMessage("Please enter an alarm name!");
            b.setNeutralButton("Ok", null);
            b.show();
        } else {
            Intent returnIntent = new Intent();
            returnIntent.putExtra("name", name);
            returnIntent.putExtra("time", time);
            if (getIntent().getExtras().getInt("requestCode") == CODE_EDIT) {
                returnIntent.putExtra("id", getIntent().getExtras()
                        .getInt("id"));
                returnIntent.putExtra("on",
                        getIntent().getExtras().getBoolean("on"));
            }

            setResult(RESULT_OK, returnIntent);
            finish();
        }
    }



    ...

}

Тогда я подумал, что, может быть, когда я не сделал этого особым образом, это каким-то образом изменило то, что было в окне выбора времени, но я не был уверен, как это могло произойти! Здесь у меня есть свой метод добавления будильника в систему Android:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == EditActivity.CODE_EDIT) {
            dataSource.update_byID(
                    data.getExtras().getInt("id"),
                    TimeUtils.stringToCalendar(data.getExtras().getString(
                            "time")), data.getExtras().getString("name"),
                    data.getExtras().getBoolean("on"));
            AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
            for(int i = 0; i < dataSource.getAllAlarms().size(); i++) {
                if(dataSource.getAllAlarms().get(i).getId() == data.getExtras().getInt("id")) {
                    Alarm tempAlarm = dataSource.getAllAlarms().get(i);
                    am.setRepeating(AlarmManager.RTC_WAKEUP, tempAlarm.getTime()
                            .getTimeInMillis(), AlarmManager.INTERVAL_DAY, tempAlarm
                            .createPendingIntent(this));
                    break;

                }
            }
        }

        if (requestCode == EditActivity.CODE_ADD) {
            Alarm tempAlarm = dataSource.createAlarm(
                    data.getExtras().getString("name"),
                    TimeUtils.stringToCalendar(data.getExtras().getString(
                            "time")));
            AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
            am.setRepeating(AlarmManager.RTC_WAKEUP, tempAlarm.getTime()
                    .getTimeInMillis(), AlarmManager.INTERVAL_DAY, tempAlarm
                    .createPendingIntent(this));

        }
    }
    refreshList();

}

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

public static String calendarToString(Calendar c) {
    return String.valueOf(c.get(Calendar.HOUR)) + ":"
            + getMinuteInReadableFormat(c.get(Calendar.MINUTE))
            + (((c.get(Calendar.AM_PM)) == Calendar.AM) ? "AM" : "PM");
}

public static Calendar stringToCalendar(String s) {
    String[] t = s.split(":");
    Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR, Integer.valueOf(t[0]));
    c.set(Calendar.MINUTE, minuteToInt(t[1]));
    c.set(Calendar.AM_PM, (t[1].endsWith("AM") ? Calendar.AM : Calendar.PM));
    return c;
}

public static String convert12(String s) {
    String newString = null;
    if (s.startsWith("0")) {
        newString = s.replaceFirst("0", "12");
    }
    if (newString == null) {
        return s;
    } else {
        return newString;
    }
}

private static String getMinuteInReadableFormat(int m) {
    if (m < 10) {
        return "0" + String.valueOf(m);
    } else {
        return String.valueOf(m);
    }
}

private static int minuteToInt(String m) {
    String x = m;
    if (m.startsWith("0")) {
        x = m.replaceFirst("0", "");
    }
    String y = x.replace("AM", "");
    String z = y.replace("PM", "");
    return Integer.valueOf(z.trim());
}

Моя проблема в том, что как только вы создаете будильник, он срабатывает. Я также наблюдал странное поведение при дальнейшем тестировании, если вы меняете время в средстве выбора времени < strong>до того, как вы измените имя, оно отключится в нужное время, если нет, оно просто отключится, как только будет создано. И я не уверен, что делать, потому что я не знаю, в чем проблема.

Также спасибо, что нашли время, чтобы прочитать мой вопрос.


person Andrew Delgadillo    schedule 23.10.2012    source источник
comment
Вы очень усложняете довольно простую задачу. Мне трудно следить за тем, что у вас здесь происходит. Рекомендую реорганизовать - упростить.   -  person Jason Hessley    schedule 23.10.2012
comment
@jason, как бы ты предложил упростить это?   -  person Andrew Delgadillo    schedule 23.10.2012


Ответы (1)


Ну я решил проблему. Для тех, у кого есть похожая проблема, вот решение. Когда я создавал будильник на время раньше текущего времени, он срабатывал немедленно. Решение состоит в том, чтобы добавить эквивалент 24 часов к желаемому времени при установке будильника.

person Andrew Delgadillo    schedule 23.10.2012