警报无法访问BroadcastReceiver [英] Alarm not accessing BroadcastReceiver

查看:81
本文介绍了警报无法访问BroadcastReceiver的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个时间选择器来设置警报

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);
    }
}

此功能可设置闹钟

 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();

        }

即使警报设置等于当前时间,没有调用broadcastreceiver。我尝试检查时间时间设置和当前时间的值,即使当前时间达到设置的时间,广播接收器也不会生效

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

[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?

更新:感谢sushihangover

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);
        }
    }


推荐答案

您正在使用.Net的DateTime中的 ticks ,而Android的AlarmManager基于Android / Linux Epoch毫秒

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

这些其他SO的答案,以了解如何使用Android系统时间或Android日历:

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

这篇关于警报无法访问BroadcastReceiver的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆