2017-02-02 3 views
1

Я использую Xamarin Android для отправки уведомлений через 10 секунд с помощью диспетчера аварийных сигналов, но какое бы время я не установил уведомление, запускается только через 5 секунд. Я пытался читать другие сообщения, из которых я понял, что я должен был установить миллисекунды с после 1970, но не работаетAlarmManager срабатывает сразу после пяти секунд почти сразу

Покушение 1

Intent alarmIntent = new Intent(Application.Context, typeof(AlarmReceiver)); 
     alarmIntent.PutExtra("message", "This is my test message!"); 
     alarmIntent.PutExtra("title", "This is my test title!"); 

     PendingIntent pendingIntent = PendingIntent.GetBroadcast(Application.Context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent); 
     AlarmManager alarmManager = (AlarmManager)Application.Context.GetSystemService(Context.AlarmService); 
     //alarmManager.Set(AlarmType.Rtc, SystemClock.ElapsedRealtime() + 30 * 1000, pendingIntent); 
     Java.Util.Calendar calendar = Java.Util.Calendar.Instance; 
     calendar.Set(CalendarField.HourOfDay, 21); 
     calendar.Set(CalendarField.Minute, 41); 

     alarmManager.Set(AlarmType.RtcWakeup, Calendar.GetInstance(Java.Util.TimeZone.Default).TimeInMillis+10000, pendingIntent); 

Попытка 2

DateTime dtBasis = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // Android times are quoted as milliseconds since start of 1970 
     alarmManager.Set(AlarmType.RtcWakeup, (long)DateTime.Now.AddMinutes(1).ToUniversalTime().Subtract(dtBasis).TotalMilliseconds, pendingIntent); 

ответ

1

стандартным методом получения миллисекунд с эпохи (01/01/1970) в Android является использование метода System.currentTimeMillis(). Таким образом, вы, вероятно, хотите попробовать установить второй параметр для alarmManager.set(), чтобы быть System.currentTimeMillis() + 10000.

C# эквивалент должен был бы создать объект DateTime, представляющий эпохи

DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

А затем вычесть его из объекта DateTime.UtcNow, чтобы получить объект TimeSpan от него

TimeSpan tsEpoch = DateTime.UtcNow.Subtract(epoch); 

Наконец, чтобы получить время в миллисекундах, отлитый свойство TotalMilliseconds отрезок времени, чтобы долго.

long milliSinceEpoch = (long) tsEpoch.TotalMilliseconds; 

С этим вы просто добавляете 10000 к этому значению, и это должно дать вам результат, который вы ищете.

+1

это действительно полезно с C# эквивалента я думаю –

+1

я до сих пор удивляюсь, как установить напоминание в течение определенного времени и дат –

1

Это также помогает в большом пути

Java.Util.Calendar calendar = Java.Util.Calendar.Instance; 
calendar.Set(CalendarField.HourOfDay, 20); 

calendar.Set(CalendarField.Minute, 57); 


alarmManager.Set(AlarmType.RtcWakeup, calendar.TimeInMillis,pendingIntent); 
Смежные вопросы