AlarmScheduler не работает/отключение будильника в Android Studio

#java #android #android-alarms

Вопрос:

Я немного новичок в Android studio, и я создаю приложение, в котором пользователь может выбрать дату и время, и оно будет планировать и сигнализировать об отключении в это время. Однако, когда я ставлю будильник, он не срабатывает. Кто — нибудь знает, где я ошибся? Или то, что я могу изменить в своем коде.

Класс CustomDialog

 public Activity c;  public Dialog d;  public CircleButton CalendarBtn, TimeBtn;  public Button CancelBtn, ProceedBtn;  public TextView CalendarTxt, TimeTxt;  public EditText ReminderTxt;   //FOR CALENDAR  final Calendar myCalendar = Calendar.getInstance();   //FOR CALENDAR  private void updateLabel(TextView edittext) {  String myFormat = "dd/MM/yy"; //In which you need put here  SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.UK);   edittext.setText(sdf.format(myCalendar.getTime()));  }   //FOR CALENDAR  DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {  @Override  public void onDateSet(DatePicker view, int year, int monthOfYear,  int dayOfMonth) {  // TODO Auto-generated method stub  myCalendar.set(Calendar.YEAR, year);  myCalendar.set(Calendar.MONTH, monthOfYear);  myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);  updateLabel(CalendarTxt);  }   };   public CustomDialogClass(Activity a) {  super(a);  // TODO Auto-generated constructor stub  this.c = a;  }    @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  requestWindowFeature(Window.FEATURE_NO_TITLE);  setContentView(R.layout.custom_dialog);  CalendarTxt = (TextView) findViewById(R.id.CurrentDateSelect);  TimeTxt = (TextView) findViewById(R.id.CurrentTimeSelect);   CancelBtn = (Button) findViewById(R.id.CancelBtn);  ProceedBtn = (Button) findViewById(R.id.ProceedBtn);  CancelBtn.setOnClickListener(this);  ProceedBtn.setOnClickListener(this);   CalendarBtn = (CircleButton) findViewById(R.id.calendarBtn);  TimeBtn = (CircleButton) findViewById(R.id.timeBtn);  CalendarBtn.setOnClickListener(this);  TimeBtn.setOnClickListener(this);   ReminderTxt = (EditText) findViewById(R.id.ReminderTxt);    }   @Override  public void onClick(View v) {  //On click method for buttons  switch (v.getId()) {  case R.id.calendarBtn:   new DatePickerDialog(getContext(), date, myCalendar  .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),  myCalendar.get(Calendar.DAY_OF_MONTH)).show();  break;   case R.id.CancelBtn:  dismiss();  break;    case R.id.timeBtn:   Calendar mcurrentTime = Calendar.getInstance();  int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);  int minute = mcurrentTime.get(Calendar.MINUTE);  TimePickerDialog mTimePicker;  mTimePicker = new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {  @Override  public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {  String curTime = String.format("d:d", selectedHour, selectedMinute);  TimeTxt.setText(curTime);  }  }, hour, minute, true);//Yes 24 hour time  mTimePicker.setTitle("Select Time");  mTimePicker.show();   break;   case R.id.ProceedBtn:    String TimeVal = TimeTxt.getText().toString();  String DateVal = CalendarTxt.getText().toString();  String RemindVal = ReminderTxt.getText().toString();   if ((TimeVal   DateVal   RemindVal).isEmpty()) {  Toast.makeText(getContext(), "No View can be Empty!", Toast.LENGTH_SHORT).show();  } else if ((TimeVal   DateVal).isEmpty()) {  Toast.makeText(getContext(), "No View can be Empty!", Toast.LENGTH_SHORT).show();  } else if ((TimeVal   RemindVal).isEmpty()) {  Toast.makeText(getContext(), "No View can be Empty!", Toast.LENGTH_SHORT).show();  } else if ((DateVal   RemindVal).isEmpty()) {  Toast.makeText(getContext(), "No View can be Empty!", Toast.LENGTH_SHORT).show();  } else {  String FinalAlarmVal = DateVal   " "   " "   TimeVal;   String AlarmHour = TimeVal.substring(0, 2);  String AlarmMins = TimeVal.substring(3, 5);    String AlarmMonth = DateVal.substring(3, 5);  String AlarmDay = DateVal.substring(0, 2);    System.out.println("SEWISINGHVV- "  Integer.parseInt(AlarmMonth));   AlarmScheduler.setReminder(getContext(), Integer.parseInt(AlarmHour), Integer.parseInt(AlarmMins), Integer.parseInt(AlarmDay), Integer.parseInt(AlarmMonth)); // Here mContext is Context of Activity. If you use this code in Activity then you can pass ActivityName.this and in Fragment you can do getActivity()   Intent AlarmName = new Intent(getContext(), AlarmReceiver.class);  AlarmName.putExtra("NameOfAlarm", RemindVal);  getContext().startService(AlarmName);   }    break;  default:  break;  }  //dismiss();  //Ends dialog when button is pressed  }  

Сигнализатор тревоги

 public static final int DAILY_REMINDER_REQUEST_CODE = 100;  public static final String TAG = "AlarmScheduler";   public static void setReminder(Context context, int hour, int min, int day, int month) {   Calendar calendar = Calendar.getInstance();   Calendar setcalendar = Calendar.getInstance();  setcalendar.set(Calendar.MONTH, month);  setcalendar.set(Calendar.DAY_OF_MONTH, day);  setcalendar.set(Calendar.HOUR_OF_DAY, hour);  setcalendar.set(Calendar.MINUTE, min);  setcalendar.set(Calendar.SECOND, 0);  setcalendar.set(Calendar.MILLISECOND, 0);   // cancel already scheduled reminders  cancelReminder(context, AlarmReceiver.class);   if (setcalendar.before(calendar))  setcalendar.add(Calendar.DATE, 1);   // Enable a receiver  ComponentName receiver = new ComponentName(context, AlarmReceiver.class);  PackageManager pm = context.getPackageManager();   pm.setComponentEnabledSetting(receiver,  PackageManager.COMPONENT_ENABLED_STATE_ENABLED,  PackageManager.DONT_KILL_APP);   Intent intent1 = new Intent(context, AlarmReceiver.class);  PendingIntent pendingIntent = PendingIntent.getBroadcast(context, DAILY_REMINDER_REQUEST_CODE, intent1, PendingIntent.FLAG_UPDATE_CURRENT);  AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);  am.setInexactRepeating(AlarmManager.RTC_WAKEUP, setcalendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);    }   public static void cancelReminder(Context context, Classlt;?gt; cls) {   // Disable a receiver  ComponentName receiver = new ComponentName(context, cls);  PackageManager pm = context.getPackageManager();   pm.setComponentEnabledSetting(receiver,  PackageManager.COMPONENT_ENABLED_STATE_DISABLED,  PackageManager.DONT_KILL_APP);   Intent intent1 = new Intent(context, cls);  PendingIntent pendingIntent = PendingIntent.getBroadcast(context, DAILY_REMINDER_REQUEST_CODE, intent1, PendingIntent.FLAG_UPDATE_CURRENT);  AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);  am.cancel(pendingIntent);  pendingIntent.cancel();  }  

Сигнализатор

 @Override  public void onReceive(Context context, Intent intent) {  Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();   }  

Комментарии:

1. в R.id.ProceedBtn коде onClick , для которого вы используете AlarmReceiver.class startService , это неправильно (и, вероятно, не связано с вашей основной проблемой 😉 )

2. @snachmsm Этот вопрос может показаться довольно глупым, но как я могу это исправить?

3. используйте sendBroadcast вместо startService , как AlarmReceiver , вероятно, расширяется BroadcastReceiver , нет Service . но на самом деле этот фрагмент там выглядит ненужным (никогда не работал)

4. @snachmsm Это работает, но когда я пытаюсь получить свою строку в AlarmReceiver, я получаю следующую ошибку android.app.ReceiverRestrictedContext cannot be cast to android.app.Activity .

5. Я вижу только Toast в вашем onReceive методе, и фиксированном String , никакого литья вообще…