Alarm not accessing BroadcastReceiver

会有一股神秘感。 提交于 2019-12-24 07:25:50

问题


I've got a timepicker to set the alarm

public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
{
    public static readonly string TAG = "MyTimePickerFragment";
    Action<DateTime> timeSelectedHandler = delegate { };

    public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected)
    {
        TimePickerFragment frag = new TimePickerFragment();
        frag.timeSelectedHandler = onTimeSelected;
        return frag;
    }

    public override Dialog OnCreateDialog(Bundle savedInstanceState)
    {
        DateTime currentTime = DateTime.Now;
        //bool is24HourFormat = DateFormat.Is24HourFormat(Activity);
        TimePickerDialog dialog = new TimePickerDialog
            (Activity, this, currentTime.Hour, currentTime.Minute, false);
        return dialog;
    }



    public void OnTimeSet(TimePicker view, int hourOfDay, int minute)
    {
        DateTime currentTime = DateTime.Now;
        DateTime selectedTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hourOfDay, minute, 0);
        Log.Debug(TAG, selectedTime.Ticks.ToString());

        timeSelectedHandler(selectedTime);
    }
}

and this function to set the alarm

 private void setAlarm(DateTime time)
        {
            Intent intent = new Intent(this, typeof(MyReceiver));
            PendingIntent pendingIntent = PendingIntent.GetBroadcast(this, RQS_1, intent, 0);
            AlarmManager alarmManager = (AlarmManager)GetSystemService(Context.AlarmService);
            alarmManager.Set(AlarmType.RtcWakeup, time.Ticks, pendingIntent);
            string timeSet = time.Ticks.ToString();
            Toast.MakeText(this, timeSet, ToastLength.Short).Show();

        }

Even if the alarm set is equal to the current time, broadcastreceiver isn't called. I tried checking the values of time time set and current time and even if the current time reach the set time, broadcastreceiver wont take effect

BroadcastReceiver

[BroadcastReceiver]
    public class MyReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Toast.MakeText(context, "Time reached!", ToastLength.Short).Show();
        }
    }
}

Am i missing permissions or something else?

UPDATE: Answer thanks to sushihangover

public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
    {
        public static readonly string TAG = "MyTimePickerFragment";
        Action<Calendar> timeSelectedHandler = delegate { };

        public static TimePickerFragment NewInstance(Action<Calendar> onTimeSelected)
        {
            TimePickerFragment frag = new TimePickerFragment();
            frag.timeSelectedHandler = onTimeSelected;
            return frag;
        }

        public override Dialog OnCreateDialog(Bundle savedInstanceState)
        {
            DateTime currentTime = DateTime.Now;
            //bool is24HourFormat = DateFormat.Is24HourFormat(Activity);
            TimePickerDialog dialog = new TimePickerDialog
                (Activity, this, currentTime.Hour, currentTime.Minute, false);
            return dialog;
        }

        public void OnTimeSet(TimePicker view, int hourOfDay, int minute)
        {
            Calendar calNow = Calendar.Instance;
            Calendar calSet = (Calendar)calNow.Clone();
            calSet.Set(CalendarField.HourOfDay, hourOfDay);
            calSet.Set(CalendarField.Minute, minute);

            calSet.Set(CalendarField.Millisecond, 0);

            DateTime currentTime = DateTime.Now;
            DateTime selectedTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hourOfDay, minute, 0);
            Log.Debug(TAG, selectedTime.Ticks.ToString());

            timeSelectedHandler(calSet);
        }
    }

回答1:


You are using ticks from .Net's DateTime and Android's AlarmManager is based upon Android/Linux Epoch milliseconds:

Review my answers on these other SOs to see how to use the Android system time or the Android calendar:

  • https://stackoverflow.com/a/41064490/4984832
  • How wake up device and show an activity on top of lock screen for alarm?
  • Alarm Goes off everytime I open the App


来源:https://stackoverflow.com/questions/53975027/alarm-not-accessing-broadcastreceiver

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!