2016-07-27 53 views
0

我讓我的後臺服務發送設備的地理數據到API。AlarmManager觸發方式太快

private static long LOCATION_INTERVAL = 1800000; 

應該是位置服務的間隔和AlarmManager

我火在MainActivity這樣

 Intent i = new Intent(this, typeof(LocationService)); 
     PendingIntent pending = PendingIntent.GetService(this, 1, i, 
              PendingIntentFlags.CancelCurrent); 

     AlarmManager alarm = (AlarmManager)GetSystemService(AlarmService); 
     alarm.SetExact(AlarmType.RtcWakeup, 30000, pending); 

那麼第一個報警,在服務本身,我再觸發警報所有的時間這樣

 Intent intent = new Intent(this, typeof(LocationService)); 
     PendingIntent pending = PendingIntent.GetService(this, 100, intent, 
              PendingIntentFlags.CancelCurrent); 
     AlarmManager alarm = (AlarmManager)GetSystemService(AlarmService); 
     alarm.SetExact(AlarmType.RtcWakeup, 
         LOCATION_INTERVAL, pending); 

問題:服務獲取所謂的方式太快了(+/-每分鐘!)。

問題:如何讓我的報警管理器堅持到LOCATION_INTERVAL

+0

請告訴我'服務的onStartCommand()'返回? – Shaishav

+0

@Shaishav這個'返回StartCommandResult.Sticky;' – Saphire

+0

嘗試使用NON_STICKY。無論xamarin等價物是什麼。 – Shaishav

回答

2

請問您可以查看下面的解決方案並讓我知道結果嗎?

如果不工作,我刪除了答案....

發行

我相信錯誤是在這裏:

alarm.SetExact(int type, long triggerAtMillis, PendingIntent operation); 

triggerAtMillis:以毫秒爲單位時間警報應該關閉,使用適當的時鐘(取決於警報類型)。

因此,您正在使用1800000作爲triggerAtMillis。但是,1800000以下是UTC的日期:Thu Jan 01 1970 00:30:00

由於這是舊日期,因此警報立即觸發。

解決方案

也許,你應該更新你的代碼如下:

在MainActivity,我認爲,要立即觸發報警。因此,如下創建:

alarm.SetExact(AlarmType.RtcWakeup, Calendar.getInstance().getTimeInMillis(), pending); 

在你的服務,它似乎想要1800000後觸發報警。因此,您必須使用:

alarm.SetExact(AlarmType.RtcWakeup, Calendar.getInstance().getTimeInMillis() + LOCATION_INTERVAL, pending); 

這樣,當前時間(當前時間+ LOCATION_INTERVAL)之後30分鐘將發出警報。

請記住,第二個參數是以毫秒爲單位的日期...這是一個數字代表一個整體的日期(而不是隻間隔)...

+0

這似乎也不起作用。警報永遠不會被調用。 – Saphire

+0

但30分鐘後會發出警報......要測試,您必須減少間隔... – W0rmH0le

+0

哪個間隔?位置間隔? – Saphire