警报无法访问BroadcastReceiver [英] Alarm not accessing 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屋!