2016-06-14 79 views
2

我的應用程序每秒都會發出一個重複請求 - 要求服務器提供新數據,如果有這種情況 - 它會喚醒設備並運行主應用程序。 (這是由用戶提出的要求,他們不關心電池的使用情況,每秒運行一次,這是高度關鍵操作) (用戶可以改變設置的任何幫助)服務沒有喚醒設備,因爲它應該是

我curently試圖通過使用來實現這一點無論AlarmManagerSystem.Threading.Timer(既試過),但每次我與後續問題結束時間:

  • 的裝置停止請求,在一些服務器當它睡覺時,並在一些看起來像隨機時間,它恢復了短暫的工作。爲什麼會發生這種情況,以及如何解決這個問題?

(OS:機器人5.x的)

(使用AlarmManager)

Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.SECOND, ConfigReader.serviceRepeatInterval); 

     Intent intent = new Intent(this, SaleService.class); 

     PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0); 

     AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

     alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), ConfigReader.serviceRepeatInterval, pintent); 

從服務的變化的代碼從服務的Java中的變化的代碼是C#( Xamarin)使用計時器。

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
     { 

      if(_powerManager == null) 
      { 
       _powerManager = (PowerManager)this.GetSystemService(PowerService); 
       _wakeLock  = _powerManager.NewWakeLock(WakeLockFlags.Full | WakeLockFlags.AcquireCausesWakeup | WakeLockFlags.OnAfterRelease, mySaleServiceWakeLock); 
       vibrator  = (Vibrator)this.GetSystemService(Context.VibratorService);     
      } 

      timer = new System.Threading.Timer(getCurrentPendingObjects, null, timerRepeatInterval, Timeout.Infinite); 

      return StartCommandResult.Sticky; 
     } 
+0

發佈您的代碼,您設置鬧鐘的地方 – earthw0rmjim

回答

1

使用AlarmManager.ELAPSED_REALTIME_WAKEUPAlarmManager.RTC_WAKEUP會在報警觸發時喚醒設備。

的裝置停止請求服務器在某些時候當它睡覺 和一些外觀類似隨機的時間來恢復它是一個短期工作。 爲什麼會發生這種情況,以及如何解決這個問題?

這可能是因爲您的PendingIntent正在調用Service。這樣設備可以在onStartCommand()執行之前回到睡眠狀態。 您應該使用BroadcastReceiver,而不是(因爲WakeLock期間onReceive()「保證」),AQUIRE一個WakeLockonReceive(),啓動Service從那裏,你的WakeLockService,釋放適當的時候。

儘管在延長的時間段內(甚至在設備處於睡眠狀態時)每秒重複一次請求似乎是一種糟糕的設計。它會很快耗盡電池。

你應該重新考慮你的實現,也許使用某種回調機制,或者至少增加請求之間的間隔(顯着)。