#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
, никакого литья вообще…