2016-06-01 29 views
1

Ich muss einen Hintergrunddienst erstellen, der mit zwei Schaltflächen startet und stoppt. Mein Dienst wird alle 5 Minuten einen Zyklus machen und Daten aus einer Online-Datenbank übernehmen. Ich habe irgendwo gelesen, dass die IntentService-Klasse nicht für Schleifen verwendet wird. Ich würde onStartCommand überschreiben, damit START_STICKY zurückgegeben wird. Wenn ich das in dieser Klasse mache, startet mein Dienst nicht. Wie kann ich das machen?Android-Dienst mit einer Schleife?

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void start(View view){ 
     startService(new Intent(this, ForegroundService.class)); 
    } 

    public void stop(View view){ 
     stopService(new Intent(this, ForegroundService.class)); 
    } 
} 




public class ForegroundService extends IntentService{ 

    private boolean stato; 


    public ForegroundService(){ 
     super("ForegroundService"); 
    } 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    protected void onHandleIntent(Intent i){ 
     stato = true; 
     int n=0; 
     while(stato) 
     { 
      Log.i("PROVA SERVICE", "Evento n."+n++); 
      try { 
       Thread.sleep(1000); 
      } 
      catch (InterruptedException e) 
      { } 
     } 
    } 

    @Override 
    public void onDestroy() { 
     stato = false; 
     Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
     super.onDestroy(); 
    } 

} 

Antwort

0

Only have a service running when it is actively delivering value to the user. Das Sitzen und Beobachten des Uhrticks liefert dem Benutzer keinen aktiven Wert.

Bitte verstehen Sie auch, dass was Sie wollen ("Zyklus alle 5 Minuten und es wird Daten aus einer Online-Datenbank nehmen") möglicherweise nicht was der Benutzer will und sicherlich nicht was Google will. Zu viele Entwickler machen so etwas und die Akkulaufzeit leidet darunter.

Allgemeinen die beste Lösung (Ihr erklärtes Ziel genannt) ist JobScheduler, vielleicht zurück zu AlarmManager fallen, wenn Ihr minSdkVersion unter 21 ist diese beiden können Sie regelmäßige Arbeit planen. Ihr Prozess muss nicht zwischen diesen Teilen der Arbeit ausgeführt werden. Sie lehren JobScheduler oder AlarmManager, wie häufig die Arbeit ausgelöst wird, und Sie die Arbeit in einem JobService oder IntentService.

Denken Sie daran, dass Ihre App unter Android 6.0+, sofern Sie Android nicht über die App "Einstellungen" angewiesen haben, Ihre App in Ruhe zu lassen, schließlich eingibt und Sie nicht alle fünf Minuten die Kontrolle erhalten.

+0

Sie haben meine Gedanken geöffnet! Ich studiere AlarmManager in den nächsten Stunden. Über Android 6.0+ kann ich setAndAllowWhileIdle() oder setExactAndAllowWhileIdle() verwenden. Ich werde meinen neuen Code hier als Antwort posten, wenn es funktioniert, danke! –