Planen Sie wiederkehrende Aufgabe in Android

Ich entwerfe eine App, die eine wiederkehrende Aufgabe hat, Präsenz an einen dedizierten Server zu senden, solange die App im Vordergrund steht.

Bei meinen Recherchen über das Internet sah ich ein paar verschiedene Ansätze und wollte wissen, was der beste Weg ist, dies zu tun.

  • Android beenden aktuelle Aktivität verursacht App close
  • Wie man eine Firebase Auth spezifische Ausnahmen fängt
  • Android-Aktionsleiste Menüpunkt mit actionLayout funktioniert nicht richtig
  • Android, wie man eine Bitmap auf Leinwand halb durchsichtig zeichnet
  • Was ist tödliches Signal 6 in android logcat
  • Android - wie man ShapeDrawables programmgesteuert definiert?
  • Was ist der beste Weg, um einen Server-Anruf zu planen?

    Die Optionen, die ich sah, waren:

    1. Timer

    2. ScheduledThreadPoolExecutor .

    3. Service .

    4. BroadcastReciever mit AlarmManager .

    Was ist deine Meinung?

    BEARBEITEN:
    Der Grund, warum ich das brauche, ist für eine Chat-basierte App, die alle Benutzeraktionen an einen entfernten Server sendet.
    Dh der Benutzer tippt eine Nachricht, der Benutzer liest eine Nachricht, der Benutzer ist online, der Benutzer ist offline usw.

    Das bedeutet, dass ich einmal in jedem Intervall den Server schicken muss, was ich tue, da ich einen Chatraum mit anderen Leuten öffne, müssen sie wissen, was ich tue.

    Ähnlich wie die whatsapp Message Feedback Mechanismus: Nachricht wird geliefert

  • Das Projekt kann eine Version von Gradle verwenden, die nicht die Methode 'compileSdkVersion ()' enthält,
  • Wie man den Hintergrunddienst / die Alarme schützt, um in neu gestarteten Geräten in kundenspezifischen Operationen wie oppo-coloros, vivo-funtouch os, Xiomi-MIUI os zu töten?
  • Android Hallo, Galerie Tutorial - "R.styleable kann nicht gelöst werden"
  • Verständnis von Android <Layer-Liste>
  • Wie zu implementieren und verwenden Google Cloud-SQL in meiner Android-App (Eclipse)
  • Konvertieren Sie NV21-Byte-Array in Bitmap-lesbares Format
  • 7 Solutions collect form web for “Planen Sie wiederkehrende Aufgabe in Android”

    Ich bin mir nicht sicher, aber nach meinem Wissen teile ich meine Ansichten. Ich akzeptiere immer die beste Antwort, wenn ich mich irre

    Alarmmanager

    Der Alarmmanager hält eine CPU-Wake-Sperre, solange die Methode des onReceive() des onReceive() ausgeführt wird. Dies garantiert, dass das Telefon nicht schlafen wird, bis Sie die Sendung beendet haben. Sobald onReceive() zurückkehrt, gibt der Alarm Manager diese onReceive() frei. Dies bedeutet, dass das Telefon in einigen Fällen schlafen wird, sobald Ihre onReceive() Methode abgeschlossen ist. Wenn Ihr Alarmempfänger Context.startService() , ist es möglich, dass das Telefon schläft, bevor der angeforderte Dienst gestartet wird. Um dies zu verhindern, muss Ihr BroadcastReceiver und Service eine separate Wecksperrrichtlinie implementieren, um sicherzustellen, dass das Telefon so lange läuft, bis der Dienst verfügbar ist.

    Hinweis: Der Alarm Manager ist für Fälle gedacht, in denen Sie Ihren Anwendungscode zu einem bestimmten Zeitpunkt laufen lassen möchten, auch wenn Ihre Anwendung derzeit nicht läuft. Für normale Timing-Operationen (Zecken, Timeouts, etc.) ist es einfacher und viel effizienter Handler zu verwenden.

    Timer

     timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { synchronized public void run() { \\ here your todo; } }}, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1)); 

    Timer hat einige Nachteile, die von ScheduledThreadPoolExecutor gelöst werden. Also ist es nicht die beste Wahl

    ScheduledThreadPoolExecutor .

    Sie können java.util.Timer oder ScheduledThreadPoolExecutor (bevorzugt) verwenden, um eine Aktion in regelmäßigen Abständen auf einem Hintergrund-Thread zu planen.

    Hier ist ein Beispiel mit dem letzteren:

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

    Also habe ich vorbereitet ScheduledExecutorService

    Aber auch darüber nachdenken, wenn die Updates auftreten, während Ihre Anwendung ausgeführt wird, können Sie einen Timer , wie in anderen Antworten vorgeschlagen, oder die neuere ScheduledThreadPoolExecutor . Wenn Ihre Anwendung aktualisiert wird, auch wenn es nicht läuft, sollten Sie mit dem AlarmManager .

    Der Alarm Manager ist für Fälle gedacht, in denen Sie Ihren Anwendungscode zu einem bestimmten Zeitpunkt laufen lassen möchten, auch wenn Ihre Anwendung derzeit nicht läuft.

    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 stark verbraucht.

    Timer

    Wie auf den Javadocs erwähnt, geht es dir besser, einen ScheduledThreadPoolExecutor zu benutzen.

    ScheduledThreadPoolExecutor

    Verwenden Sie diese Klasse, wenn Ihr Anwendungsfall mehrere Worker-Threads benötigt und das Sleep-Intervall klein ist. Wie klein ? Nun, ich würde etwa 15 Minuten sagen. Der AlarmManager startet zu diesem Zeitpunkt Zeitplanintervalle und es scheint zu suggerieren, dass für kleinere Schlafintervalle diese Klasse verwendet werden kann. Ich habe keine Daten, um die letzte Anweisung zurückzugeben. Es ist eine Ahnung.

    Bedienung

    Ihr Service kann jederzeit von der VM geschlossen werden. Verwenden Sie keine Dienste für wiederkehrende Aufgaben. Eine wiederkehrende Aufgabe kann eine Dienstleistung starten , was eine ganz andere Sache ist.

    BroadcastReciever mit AlarmManager

    Für längere Schlafintervalle (> 15 Minuten) ist das der Weg zu gehen. AlarmManager bereits Konstanten ( AlarmManager.INTERVAL_DAY ), was darauf hindeutet, dass es Tasks mehrere Tage auslösen kann, nachdem es anfänglich geplant wurde. Es kann auch die CPU aufwachen, um deinen Code auszuführen.

    Sie sollten eine dieser Lösungen auf der Grundlage Ihrer Timing und Arbeitnehmer Thread Bedürfnisse verwenden.

    Ich weiß, das ist eine alte Frage und wurde beantwortet, aber das könnte jemandem helfen. In deiner activity

     private ScheduledExecutorService scheduleTaskExecutor; 

    In onCreate

      scheduleTaskExecutor = Executors.newScheduledThreadPool(5); //Schedule a task to run every 5 seconds (or however long you want) scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { @Override public void run() { // Do stuff here! runOnUiThread(new Runnable() { @Override public void run() { // Do stuff to update UI here! Toast.makeText(MainActivity.this, "Its been 5 seconds", Toast.LENGTH_SHORT).show(); } }); } }, 0, 5, TimeUnit.SECONDS); // or .MINUTES, .HOURS etc. 

    Quotieren der Terminierung Wiederholungsalarme – Verstehen der Trade-offs- Dokumente:

    Ein gemeinsames Szenario für die Auslösung einer Operation außerhalb der Lebensdauer Ihrer App ist die Synchronisierung von Daten mit einem Server. Dies ist ein Fall, wo Sie versucht werden könnten, einen Wiederholungsalarm zu verwenden. Aber wenn Sie den Server besitzen, der die Daten Ihrer App hostet, ist die Verwendung von Google Cloud Messaging (GCM) in Verbindung mit dem Sync-Adapter eine bessere Lösung als AlarmManager. Ein Sync-Adapter gibt Ihnen alle die gleichen Planungsoptionen wie AlarmManager, aber es bietet Ihnen deutlich mehr Flexibilität.

    Also, auf dieser Grundlage, der beste Weg, um einen Server-Aufruf zu planen, ist mit Google Cloud Messaging (GCM) in Verbindung mit Sync-Adapter .

    Ich habe auf Zeitaufgabe erstellt, in der die Aufgabe, die der Benutzer wiederholen möchte, in die Custom TimeTask run () – Methode hinzufügen. Es ist wieder erfolgreich.

      import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; import android.app.Activity; import android.content.Intent; public class MainActivity extends Activity { CheckBox optSingleShot; Button btnStart, btnCancel; TextView textCounter; Timer timer; MyTimerTask myTimerTask; int tobeShown = 0 ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); optSingleShot = (CheckBox)findViewById(R.id.singleshot); btnStart = (Button)findViewById(R.id.start); btnCancel = (Button)findViewById(R.id.cancel); textCounter = (TextView)findViewById(R.id.counter); tobeShown = 1; if(timer != null){ timer.cancel(); } //re-schedule timer here //otherwise, IllegalStateException of //"TimerTask is scheduled already" //will be thrown timer = new Timer(); myTimerTask = new MyTimerTask(); if(optSingleShot.isChecked()){ //singleshot delay 1000 ms timer.schedule(myTimerTask, 1000); }else{ //delay 1000ms, repeat in 5000ms timer.schedule(myTimerTask, 1000, 1000); } btnStart.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { Intent i = new Intent(MainActivity.this, ActivityB.class); startActivity(i); /*if(timer != null){ timer.cancel(); } //re-schedule timer here //otherwise, IllegalStateException of //"TimerTask is scheduled already" //will be thrown timer = new Timer(); myTimerTask = new MyTimerTask(); if(optSingleShot.isChecked()){ //singleshot delay 1000 ms timer.schedule(myTimerTask, 1000); }else{ //delay 1000ms, repeat in 5000ms timer.schedule(myTimerTask, 1000, 1000); }*/ }}); btnCancel.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { if (timer!=null){ timer.cancel(); timer = null; } } }); } @Override protected void onResume() { super.onResume(); if(timer != null){ timer.cancel(); } //re-schedule timer here //otherwise, IllegalStateException of //"TimerTask is scheduled already" //will be thrown timer = new Timer(); myTimerTask = new MyTimerTask(); if(optSingleShot.isChecked()){ //singleshot delay 1000 ms timer.schedule(myTimerTask, 1000); }else{ //delay 1000ms, repeat in 5000ms timer.schedule(myTimerTask, 1000, 1000); } } @Override protected void onPause() { super.onPause(); if (timer!=null){ timer.cancel(); timer = null; } } @Override protected void onStop() { super.onStop(); if (timer!=null){ timer.cancel(); timer = null; } } class MyTimerTask extends TimerTask { @Override public void run() { Calendar calendar = Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd:MMMM:yyyy HH:mm:ss a"); final String strDate = simpleDateFormat.format(calendar.getTime()); runOnUiThread(new Runnable(){ @Override public void run() { textCounter.setText(strDate); }}); } } 

    }

    BroadcastReciever mit AlarmManager der beste Weg, um einen Server-Aufruf für Android-Intervall zu planen.

    Vielleicht ist es keine Antwort für Ihre Frage, aber Rat für die Struktur Ihrer Anwendung. Für mich ist es viel einfacher, Knoten JS mit SOCKET.IO für Anwendungen wie Chat zu verwenden. Und wie es in Echtzeit ist, brauchst du nicht jeden Server zu fragen. Dort können Sie mehr über SOCET IO – http://socket.io/

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.