2014-04-25 3 views
1

Calendar 또는 GregorianCalendar 개체와 함께 올바르게 작동시키지 못합니다.특정 시간에 AlarmManager가 반복되도록 설정

Global.StartingTime은 다른 클래스의 static DateTime 개체입니다. hour 속성은 시간을 24 시간 형식으로 반환합니다.

시도 1 - Calendar가 사용 - 결과 :가 발생하지 않습니다

public void SetAlarm() 
{ 
     if (Global.StartingTime == null || Global.StartingTime == DateTime.MinValue) return; 

     Calendar now = Calendar.GetInstance (Java.Util.TimeZone.Default); 
     Calendar alarmTime = Calendar.GetInstance (Java.Util.TimeZone.Default); 

     alarmTime.Set(CalendarField.HourOfDay, Global.StartingTime.Hour); 
     alarmTime.Set(CalendarField.HourOfDay, Global.StartingTime.Minute); 
     if (alarmTime.Before(now)) 
      alarmTime.Add(CalendarField.DayOfMonth, 1); 

     AlarmManager am = (AlarmManager) _context.GetSystemService (Context.AlarmService); 
     Intent intent = new Intent(_context, typeof(MainReceiver)); 
     intent.PutExtra (ALARM_ACTION, true); 
     PendingIntent pi = PendingIntent.GetBroadcast (_context, 0, intent, 0); 
     am.SetRepeating (AlarmType.ElapsedRealtimeWakeup, alarmTime.TimeInMillis, AlarmManager.IntervalDay, pi); 
     AlarmSet = true; 
} 

시도 2 ​​-결과 - GregorianCalendar 사용 : 화재 즉시,하지에 주어진 시간과 분을 . 난 그냥 (응용 프로그램은 지속적으로 서비스를 실행하고 나는 그것을 일어나 알람 관리기를 사용할 필요가 없습니다 내 특정한 경우에서 잘 작동하는 것 같다 대신 AlarmManager의 타이머와 함께 이동하기로 결정했습니다

public void SetAlarm() 
{ 
     if (Global.StartingTime == null || Global.StartingTime == DateTime.MinValue) return; 

     GregorianCalendar now = new GregorianCalendar(); 
     now.TimeInMillis = SystemClock.ElapsedRealtime(); 

     GregorianCalendar alarmTime = new GregorianCalendar(); 
     alarmTime.Add(CalendarField.DayOfYear, now.Get(CalendarField.DayOfYear)); 
     alarmTime.Set(CalendarField.HourOfDay, Global.StartingTime.Hour); 
     alarmTime.Set(CalendarField.Minute, Global.StartingTime.Minute); 
     alarmTime.Set(CalendarField.Second, now.Get(CalendarField.Second)); 
     alarmTime.Set(CalendarField.Millisecond, now.Get(CalendarField.Millisecond)); 
     alarmTime.Set(CalendarField.Date, now.Get(CalendarField.Date)); 
     alarmTime.Set(CalendarField.Month, now.Get(CalendarField.Month)); 

     if (alarmTime.Before (now)) 
      alarmTime.Add (CalendarField.DayOfYear, 1); 

     AlarmManager am = (AlarmManager) _context.GetSystemService (Context.AlarmService); 
     Intent intent = new Intent(_context, typeof(MainReceiver)); 
     intent.PutExtra (ALARM_ACTION, true); 
     PendingIntent pi = PendingIntent.GetBroadcast (_context, 0, intent, 0); 
     am.SetRepeating (AlarmType.RtcWakeup, alarmTime.TimeInMillis, AlarmManager.IntervalDay, pi); 
     AlarmSet = true; 
} 

답변

0

).

이 그런 다음

public int GetTimeInterval(DateTime dt) 
{ 
    DateTime now = DateTime.Now; 
    if (dt <= now) { 
     dt = dt.AddDays(1); 
    } 

    return (dt - now).TotalMilliseconds; 
} 

나는 방송을 전송하는 System.Threading.Timer을 사용하고 경보 때까지 시간을 가져옵니다

var IntervalOfOneDay = 86400000; // 24 hours in milliseconds 
var interval = GetTimeInterval(alarmTime); 
timer = New System.Threading.Timer(func, null, interval, IntervalOfOneDay); 
관련 문제