2016-06-01 1 views
1

J'ai besoin de créer un service d'arrière-plan qui démarre et s'arrête avec deux boutons. Mon service fera un cycle toutes les 5 minutes et il prendra des données à partir d'une base de données en ligne. J'ai lu quelque part que la classe IntentService n'est pas utilisée pour les boucles. Je remplacer OverStartCommand afin qu'il retourne START_STICKY. Si je fais cela dans cette classe, mon service ne démarre pas. Comment puis-je faire ceci?Service Android avec une boucle?

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(); 
    } 

} 

Répondre

0

Only have a service running when it is actively delivering value to the user. Assis et regarder l'horloge ne donne pas activement de la valeur à l'utilisateur. De plus, sachez que ce que vous voulez ("cycle toutes les 5 minutes et il faudra prendre des données à partir d'une base de données en ligne") peut ne pas être ce que l'utilisateur veut et n'est certainement pas ce que Google veut. Trop de développeurs font des choses comme ça, et la vie de la batterie en souffre. En règle générale, votre meilleure solution (compte tenu de votre objectif déclaré) est JobScheduler, peut-être tomber à AlarmManager si votre minSdkVersion est inférieur à 21. Ces deux vous permettent de planifier un travail périodique. Votre processus n'a pas besoin d'être exécuté entre ces morceaux de travail. Vous enseignez JobScheduler ou AlarmManager à quelle fréquence pour déclencher le travail, et vous faites le travail dans un JobService ou IntentService. N'oubliez pas que sur Android 6.0 ou version ultérieure, à moins que l'utilisateur ne dise à Android via l'application Paramètres de laisser votre application seule, votre application entrera éventuellement Doze mode or app standby mode et vous ne pourrez pas prendre le contrôle toutes les cinq minutes.

+0

Vous m'avez ouvert les yeux! J'étudie AlarmManager dans les prochaines heures. À propos d'Android 6.0+ Je peux utiliser setAndAllowWhileIdle() ou setExactAndAllowWhileIdle(). Je posterai mon nouveau code ici comme réponse quand ça marchera, merci! –