webentwicklung-frage-antwort-db.com.de

planungsalarm für jede Sekunde in Android 5.1


Ich möchte den Alarmdienst für jede Sekunde in meiner Anwendung ausführen. Unter Version 5.1 funktioniert er einwandfrei. In 5.1-Geräten wird es jedoch nicht ausgelöst. Ich benutze Commonsware Wakeful Intent Service. Die Logcat-Meldung besagt: " Verdächtig kurzes Intervall 1000 Millis; Erweiterung auf 60 Sekunden ". Wie kann ich in 5.1 jede Sekunde abfragen? Kann mir jemand vorschlagen, wie ich das erreichen kann?

Erklärung etwas mehr:

Mein Anwendungsfall ist, dass ich alle 30 Minuten eine Operation ausführen muss. AFAIK Dafür ist der Einsatz von Alarm Manager ein effizienter Weg, aber hier

1) Ich muss dem Benutzer den Countdown-Timer anzeigen. (Timer-Task, Countdown-Timer, ScheduledExecutorService ist dafür ziemlich nützlich)
2) Ich muss den Benutzer alle 30 Minuten (per Benachrichtigung) benachrichtigen, auch wenn sich die App im Hintergrund befindet. (Der Alarmdienst ist hierfür ausreichend.)

aber hier ist mein Problem, wenn die App im Hintergrund ist, wenn Sie die Anwendung aus der letzten Zeit streichen (d. h. der Anwendungsprozess wird abgebrochen), keiner der Dienste oder Timer, Handler oder Executor-Dienste funktionieren nicht. In diesem Fall, wie kann ich den Benutzer nach Ablauf von 30 Minuten benachrichtigen. Bitte leite mich, wenn ich falsch denke.

Vielen Dank,
Chaitanya

10
Chaitu

Dies ist normal in Android Lollipop.

Verdächtig kurzes Intervall 1000 Millis; Erweitern auf 60 Sekunden

Sagt Ihnen, dass das System diese kurzen Zeitintervalle nicht mehr mag.

Ausgabe # 161244 dokumentiert, dass:

Dies funktioniert wie beabsichtigt, ist jedoch derzeit nicht ausreichend dokumentiert (und wir sind uns dieser Seite des Problems bewusst).

Ganz allgemein gesagt: Kurzzeit- und Kurzzeitalarme sind in der Batterie verblüffend teuer. Apps, die kurzfristig oder in naher Zukunft ausgeführt werden müssen, sollten andere Mechanismen verwenden, um ihre Aktivitäten zu planen.

Verwenden Sie hierfür keine AlarmService. Bevorzugen Sie einen Thread oder eine Executors oder TimerTask oder etwas anderes:

// Using Handler
new Handler().postDelayed(runnable, TimeUnit.SECONDS.toMillis(1));

// Using Executors
Executors.newSingleThreadScheduledExecutor().schedule(runnable, 1, TimeUnit.SECONDS);
6
shkschneider

Warum würdest du das tun?
Verwenden Sie stattdessen einen Handler:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // do your stuff here, called every second
        mHandler.postDelayed(this, 1000);
    }
};

// start it with:
mHandler.post(runnable);

Und verwenden Sie Folgendes, um Ihren 1-Sekunden-Timer zu stoppen:

mHandler.removeCallbacks(runnable);
3
Lazy Ninja

Verwenden Sie sowohl 1 als auch 2:

  • Verwenden Sie die AlarmManager, um den Benutzer alle 30 Minuten zu warnen

  • Wenn die Aktivität, bei der Sie Aktualisierungen anzeigen müssen, im Vordergrund steht, dann tun Sie auch etwas Billiges, wie postDelayed(), um dem Benutzer regelmäßige Aktualisierungen in dieser Aktivität zu ermöglichen

1
CommonsWare

Probieren Sie diese Schritte aus.

  1. Verwenden Sie nach 1 Minute eine Alarmmaager-Zeitschrift
  2. Verwenden Sie in diesem Alarm-Manager einen Handler, der nach einigen Sekunden aufruft und Ihre Aufgabe ausführt.

Merken

Es ist keine gute Idee, da der Alarmmanager die aktuelle Situation des Geräts nicht kennt, z. B. nicht berücksichtigt, ob das Gerät an einen Netzstecker angeschlossen, inaktiv oder an ein Netzwerk angeschlossen ist. Auch der Alarmmanager verschwendet Ressourcen Es ist ihm egal, wann auf dem Gerät mehr Ressourcen verfügbar sind.

0
Fasiha

Ich verstehe Ihren Anwendungsfall nicht genau, aber das Einstellen des Alarms für jede Sekunde ist übertrieben. Sie können Timer verwenden. Schauen Sie sich diese Klasse an.

0
Riyaz Ahamed

Dies ist ein gemeldetes Problem für Android 5.1, das auftritt, wenn Sie versuchen, einen Alarm für ein Intervall von weniger als 60000 Millisekunden einzustellen.

Diese Warnung tritt auf, weil durch das Einstellen eines sehr niedrigen Intervalls der Akku sehr schnell entladen wird.

Projektmitglied auf der Plattform sagte:

Ganz allgemein gesagt: Kurzzeit- und Kurzzeitalarme sind im Akkubetrieb verblüffend teuer. Apps, die kurzfristig oder in naher Zukunft ausgeführt werden müssen, sollten andere Mechanismen verwenden, um ihre Aktivitäten zu planen.

Aus diesem Grund wird die Verwendung von Alarm in Ihrem Fall nicht empfohlen.

Entsprechend Ihrer Frage aktualisieren. Sie möchten Ihren Hintergrunddienst auch dann aktivieren, wenn der Benutzer ihn manuell aus der Liste der zuletzt verwendeten Apps entfernt hat. Dies kann einfach mithilfe des START_STICKY-Flags erfolgen, beispielsweise mithilfe des folgenden Flags. Fügen Sie diesen Code zu Ihrem Service in der Methode onStartCommand hinzu:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
} 

Quelle: antworte

0
Sami Eltamawy