2014-05-21 9 views
6

Ich bin ein Anfänger und ich entwickle eine Android-Anwendung, die SMS an den Benutzer nach einer bestimmten Verzögerung (die in Tagen ist) senden wird. Ich möchte, dass der Benutzer einmal die SMS erhalten sollte, unabhängig von der Tatsache, dass er ist eingeloggt oder nicht. Der SMS-Inhalt und Handynummer werden aus dem database.So geholt, nachdem die Erforschung ich zwei Möglichkeiten gefundenWas ist besser ScheduledExecutorService oder AlarmManager in Android?

  1. ScheduledExecutorService

  2. Alarmmanager

Das Problem ist, dass der Alarmmanager wird heruntergefahren, wenn Das Telefon ist ausgeschaltet oder neu gestartet. Ist dies auch bei ScheduledExecutorService der Fall? Und wie viele Threads sollte ich im ThreadPool verwenden, während ich den Executor Service nutze?

Antwort

6

Alarm Manager

Der Manager-Alarm hält eine CPU wake Sperre solange die onReceive() der Alarmempfänger Methode ausgeführt wird. Dies garantiert, dass das Telefon nicht in den Ruhezustand wechselt, bis Sie die Übertragung beendet haben. Sobald onReceive() zurückkehrt, gibt der Alarm Manager diese Wecksperre frei. Dies bedeutet, dass das Telefon in einigen Fällen schläft, sobald Ihre onReceive()-Methode abgeschlossen ist. Wenn Ihr Alarmempfänger Context.startService() lautet, ist es möglich, dass das Telefon in den Ruhezustand versetzt wird, bevor der angeforderte Dienst gestartet wird. Um dies zu verhindern, müssen Ihre BroadcastReceiver und Ihr Dienst eine separate Wake Lock-Richtlinie implementieren, um sicherzustellen, dass das Telefon weiterhin ausgeführt wird, bis der Dienst verfügbar wird.

ScheduledThreadPoolExecutor.

Sie können (bevorzugt) verwenden, um eine Aktion in regelmäßigen Abständen auf einem Hintergrundthread zu planen.

Hier ist eine Probe mit dieser:

ScheduledExecutorService scheduler = 
    Executors.newSingleThreadScheduledExecutor(); 

scheduler.scheduleAtFixedRate 
     (new Runnable() { 
     public void run() { 
      // call service 
     } 
     }, 0, 10, TimeUnit.MINUTES); 

So zog ich ScheduledExecutorService

Aber wenn die Updates auftreten wird, während die Anwendung ausgeführt wird, können Sie einen Timer verwenden, wie in anderen Antworten vorgeschlagen oder der neuere ScheduledThreadPoolExecutor. Wenn Ihre Anwendung aktualisiert wird, auch wenn sie nicht ausgeführt wird, sollten Sie mit dem AlarmManager gehen.

Der Alarm Manager ist für Fälle vorgesehen, in denen Sie Ihren Anwendungscode zu einem bestimmten Zeitpunkt ausführen lassen möchten, selbst wenn Ihre Anwendung gerade nicht ausgeführt wird.

Beachten Sie, dass, wenn Sie planen, zu aktualisieren, wenn Ihre Anwendung ausgeschaltet ist, einmal alle zehn Minuten ist ziemlich häufig und damit möglicherweise ein bisschen zu viel Energie verbrauchen.

Überprüfen Sie auch this Post.

+0

Wird der geplanteExecutor ausgeschaltet, wenn das Gerät bootet oder ausgeschaltet ist. Ich habe kürzlich gelesen, dass wir mit einen wiederholten Alarm automatisch neu starten können, wenn der Benutzer das Gerät neu startet, was sicherstellt, dass der AlarmManager seine Aufgabe ohne den Benutzer weiter ausführt um den Alarm manuell neu zu starten. Also, was soll ich benutzen? –

+0

Trotzig wird es ausgehen ...Versuchen Sie, die Dokumentation zu lesen http://developer.android.com/reference/android/content/BroadcastReceiver.html#ReceiverLifecycle – Rohit

+0

Was ist mit Wake und ScheduledExecutorService? – redochka