2016-06-14 12 views
2

Meine Anwendung eine wiederholte Anforderung jede Sekunde - fragt den Server nach neuen Daten, und wenn es solche gibt - es wacht das Gerät auf und führt die Hauptanwendung aus. (dies ist auf Anfrage von den Benutzern, und sie kümmert sich nicht um die Batterie-Nutzung, es ist obligatorisch, jede Sekunde zu laufen. Es ist sehr kritische Operation) (alle Änderungen an den Einstellungen, die helfen könnten, wird vom Benutzer erlaubt)Der Dienst weckt das Gerät nicht auf, wie es sollte

ich curently versuche, dies zu erreichen, indem entweder AlarmManager oder System.Threading.Timer (mit beiden versucht), aber jedes Mal, wenn ich mit der Folge Ausgabe am enden:

  • Das Gerät Halten Sie den Server an einigen anfordernden Zeigen Sie, während es geschlafen wird, und stellen Sie es in einer scheinbar zufälligen Zeit wieder her. Warum das passiert und wie Sie dieses Problem beheben können

(OS: Android 5.x)

Der Code aus der Änderung des Dienstes in Java (mit 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); 

Der Code aus der Änderung des Dienstes ist C# (Xamarin) mit Timer.

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

posten Sie Ihren Code, wo Sie bitte den Alarm einstellen – earthw0rmjim

Antwort

1

Mit AlarmManager.ELAPSED_REALTIME_WAKEUP oder AlarmManager.RTC_WAKEUP wird das Gerät, wenn der Alarm ausgelöst wecken.

Der Anschlag Gerät den Server zu einem bestimmten Zeitpunkt anfordert, während es geschlafen wird und irgend Look-wie es zufällige Zeit wiederherstellen Arbeit für ein kurzes ist. Warum dies passiert und wie Sie dieses Problem beheben können?

Dies kann passieren, weil Ihr PendingIntent einen Service anruft. Auf diese Weise kann das Gerät wieder in den Ruhezustand gehen, bevor onStartCommand() ausgeführt wird. Sie sollten einen BroadcastReceiver stattdessen verwenden (da ein WakeLock „garantiert“ wird während onReceive()), erwerben ein WakeLock in onReceive(), starten Sie Ihren Service von dort aus und lassen Sie Ihre WakeLock vom Service, wenn angemessen.

Obwohl das Wiederholen einer Anforderung jede Sekunde für einen längeren Zeitraum (und sogar wenn das Gerät im Schlaf ist) scheint wie ein schreckliches Design. Es wird die Batterie ziemlich schnell entladen.

Sie sollten Ihre Implementierung überdenken, vielleicht eine Art von Callback-Mechanismus verwenden oder zumindest die Intervalle zwischen den Anforderungen (erheblich) erhöhen.

Verwandte Themen