будильник, установленный с помощью таймера, не работает, Android

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

ошибки нет, и я уже регистрируюсь в Манефесте. на самом деле я хочу получить дату и время, установленные в sqlite, а будильник основан на дате и времени. Я застреваю, сначала я хочу, чтобы пользователь добавил встречу, скажем, 25/4/2013 в 16:30 .. данные сохраняется в sqlite. затем в тот же день я хочу, чтобы приложения тревожили пользователя ... как я могу это сделать? я знаю, как использовать диспетчер аварийных сигналов, но я не знаю, с чего начать код

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

public class AppointmentAdd extends Activity 
{

private SQLiteDatabase database;
private DBHelper helper;
private ScheduleClient scheduleClient;
Button btnSave, btnDate, btnTime;
EditText addPurpose;

DateFormat fmtDateAndTime = DateFormat.getDateTimeInstance();
Calendar myCalendar = Calendar.getInstance();

DatePickerDialog.OnDateSetListener d = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
        int dayOfMonth) {
    myCalendar.set(Calendar.YEAR, year);
    myCalendar.set(Calendar.MONTH, monthOfYear);
    myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    updateLabelDate(year, monthOfYear, dayOfMonth);
}
};

TimePickerDialog.OnTimeSetListener t = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    myCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
    myCalendar.set(Calendar.MINUTE, minute);
    updateLabelTime(hourOfDay, minute);
}
};

private void updateLabelDate(int year, int monthOfYear,
        int dayOfMonth) {

    year = myCalendar.get(Calendar.YEAR);
    monthOfYear = myCalendar.get(Calendar.MONTH);
    dayOfMonth = myCalendar.get(Calendar.DATE);

    btnDate.setText(new StringBuilder().append(dayOfMonth).append(".")
            .append(monthOfYear + 1).append(".").append(year).append(" "));
}

private void updateLabelTime(int hourOfDay, int minute) {

    hourOfDay = myCalendar.get(Calendar.HOUR_OF_DAY);
    minute = myCalendar.get(Calendar.MINUTE);
    btnTime.setText(new StringBuilder().append(hourOfDay).append(":")
            .append(minute));
}

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.appointment_add);

    btnSave = (Button)findViewById(R.id.button3);
    btnDate = (Button)findViewById(R.id.button1);
    btnTime = (Button)findViewById(R.id.button2);
    addPurpose = (EditText)findViewById(R.id.editText1);

    scheduleClient = new ScheduleClient(this);
    scheduleClient.doBindService();

    btnDate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            new DatePickerDialog(AppointmentAdd.this, d, myCalendar
                    .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                    myCalendar.get(Calendar.DAY_OF_MONTH)).show();
        }
    });

    btnTime.setOnClickListener(new View.OnClickListener() {
        public  void onClick(View v) {
            new TimePickerDialog(AppointmentAdd.this, t, myCalendar
                    .get(Calendar.HOUR_OF_DAY), myCalendar
                    .get(Calendar.MINUTE), true).show();
        }

    });


    helper = new DBHelper(this);
    database = helper.getWritableDatabase();

    btnSave.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            String purpose = addPurpose.getText().toString();
            String date = btnDate.getText().toString();
            String time = btnTime.getText().toString();

            helper.insertDataAppointment(database, date, time, purpose);
            Toast.makeText(AppointmentAdd.this, "Successfully Add", Toast.LENGTH_SHORT).show();

            setAlarm(myCalendar.get(Calendar.HOUR_OF_DAY), myCalendar.get(Calendar.MINUTE));

            Intent i = new Intent(AppointmentAdd.this, AppointmentView.class);
            startActivity(i);
        }
    });

    updateLabelDate(0, 0, 0);
    updateLabelTime(0, 0);
}

private void setAlarm(int Hour, int Minute){
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, Hour);
    cal.set(Calendar.MINUTE, Minute);
    cal.set(Calendar.SECOND, 0);

    //in case of choosing a previous hour, then set alarm to next day
    if (cal.getTimeInMillis() < System.currentTimeMillis())
        cal.set(Calendar.HOUR_OF_DAY, Hour + 24);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent Notifyintent = new Intent(this, Notify.class);
PendingIntent Notifysender = PendingIntent.getBroadcast(this, 0, Notifyintent, PendingIntent.FLAG_UPDATE_CURRENT);
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 3600000, Notifysender);

    Toast.makeText(AppointmentAdd.this, "Alarm set successfully" , Toast.LENGTH_LONG).show();
}

public void onClickCancel(View v){
    startActivity (new Intent(getApplicationContext(), AppointmentView.class));
}

} // end class

и вот мой класс AlarmReceiver:

public class AlarmReceiver extends BroadcastReceiver {

@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context, Intent intent) {
      NotificationManager myNotificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
      Notification notification = new Notification(R.drawable.ic_launcher, "Update Device", 0);
      Intent notificationIntent = new Intent(context, AppointmentView.class);
      PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
      notification.setLatestEventInfo(context, "Appointment", "Please check your appointment list", contentIntent);
      notification.flags |= Notification.FLAG_HIGH_PRIORITY;
      myNotificationManager.notify(0, notification);
}
}

person new    schedule 26.04.2013    source источник
comment
Были ли какие-либо ошибки при достижении определенного времени будильника или вы зарегистрировали приемник в манифесте?   -  person Kanth    schedule 26.04.2013
comment
ошибки нет, и я уже регистрируюсь в Манефесте. на самом деле я хочу получить дату и время, установленные в sqlite, и будильник основан на дате и времени. я думаю, что мой код - это функция setAlarm, неверная для этого.. я застреваю, сначала я хочу, чтобы пользователь добавил встречу, скажем, 25/4/2013 в 16:30.. данные сохраняются в sqlite. затем в тот же день я хочу, чтобы приложения тревожили пользователя ... как я могу это сделать? я знаю, как использовать диспетчер аварийных сигналов, но я не знаю, с чего начать код   -  person new    schedule 26.04.2013
comment
хорошо, он уже может перейти в главное меню, для класса приемника сигналов тревоги, могу ли я сделать всплывающее уведомление или диалоговое окно предупреждения вместо изменения активности?   -  person new    schedule 26.04.2013
comment
Ага. Сначала попробуй с этим. На самом деле у меня недостаточно времени, чтобы опубликовать точный ответ, но я могу опубликовать свой рабочий код с некоторыми изменениями, если у меня будет время. Что ты говоришь?   -  person Kanth    schedule 26.04.2013
comment
конечно2.. без проблем.. извините за беспокойство. я уже пытаюсь тост n alertdialog, я не применим с wideReceiver   -  person new    schedule 26.04.2013
comment
Извините, я не могу вас достать. Вы хотите, чтобы я опубликовал или нет? Пожалуйста, используйте полные слова.   -  person Kanth    schedule 27.04.2013
comment
да, я хочу, чтобы вы опубликовали это..:)   -  person new    schedule 27.04.2013
comment
я уже могу получить панель уведомлений, но будильник только для последнего, если я установил два будильника, первый 27/4/2013 16:10, затем я установил 27/4/2013 16:15 .. это только будильник для второй. как я могу получить все данные?   -  person new    schedule 27.04.2013


Ответы (2)


Согласно вашему комментарию:

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

Теперь ваш текущий PendingIntent выглядит следующим образом:

PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Здесь вы каждый раз указываете reqid как 0, поэтому вместо того, чтобы создавать разные ожидающие намерения, оно переопределяет текущее ожидающее намерение, поэтому вы получаете последний установленный сигнал тревоги. Поэтому каждый раз указывайте уникальный идентификатор запроса с другим номером, как показано ниже.

 PendingIntent pi = PendingIntent.getBroadcast(this, reqid, intent,PendingIntent.FLAG_UPDATE_CURRENT);

Даже я сделал то же самое в соответствии с вашим требованием, что мне пришлось хранить все данные в базе данных sqlite о сообщениях и сигналах тревоги. Итак, чтобы каждый раз устанавливать разные request id, я использовал идентификатор первичного ключа, который находится в базе данных, для установки ожидающего намерения. Надеюсь это поможет.

person Kanth    schedule 27.04.2013
comment
regid нужно iniliazе, это как переменная? - person new; 27.04.2013
comment
Это целочисленная переменная. Вам нужно создавать разные числа и каждый раз назначать эту переменную. - person Kanth; 27.04.2013
comment
да, но теперь проблема в том, что я не знаю, как получить дату, которую я храню как datetime в sqlite, и использовать ее в соответствии с кодом, часом, месяцем, днем, годом .. я застреваю - person new; 27.04.2013
comment
Я думаю, что ваши вопросы постепенно отклоняются от исходного вопроса, который вы разместили. - person Kanth; 29.04.2013

Вы можете попробовать это:

final int alarmId = (int) System.currentTimeMillis();
PendingIntent pi =
  PendingIntent.getBroadcast(Date_Time.this, alarmId, i,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager manager = (AlarmManager) getSystemService(Date_Time.this.ALARM_SERVICE);
manager.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis() , pi);
person Vishakh    schedule 29.01.2018