0

Créé un IntentService et de mettre for loop dans la méthode onHandleIntent. Chaque fois que je ferme l'application (retirer de la récente pas forcer la fermeture) il s'est arrêté. Mais onDestroy n'a pas appelé. J'ai également essayé sur différents appareils. Je ne pense pas que c'est un problème de mémoire insuffisante.
Le service signifie-t-il être utilisé uniquement lorsque l'application est en premier plan?
Je dois faire une tâche à l'arrière du thread principal et le service se ferme à mesure que l'utilisateur ferme l'application.
ici est mon exemple de codeLe service Android s'arrête juste après la fermeture de l'application

public class MyIntentService extends IntentService { 


    private static final String TAG = "MyIntentService"; 

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


    @Override 
    protected void onHandleIntent(Intent intent) { 

     for (int i = 0; i < 30; i++) { 
      Log.d(TAG, "onHandleIntent: " + i); 
      try { 
       Thread.sleep(600); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d(TAG, "onDestroy: "); 
    } 
} 

refs: How to keep an IntentService running even when app is closed?
Service restarted on Application Close - START_STICKY

Répondre

1

utilisation ci-dessous code pour redémarrer le service après application Fermer

public class MyService extends Service { 

@Override 
public int onStartCommand(final Intent intent, final int flags, 
          final int startId) { 
    super.onStartCommand(intent, flags, startId); 
    return Service.START_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    Intent restartService = new Intent(getApplicationContext(), 
      this.getClass()); 
    restartService.setPackage(getPackageName()); 
    PendingIntent restartServicePI = PendingIntent.getService(
      getApplicationContext(), 1, restartService, 
      PendingIntent.FLAG_ONE_SHOT); 
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 100, restartServicePI); 
    Toast.makeText(this, "onTaskRemoved", Toast.LENGTH_SHORT).show(); 
    super.onTaskRemoved(rootIntent); 
}} 

méthode ci-dessus onTaskRemoved redémarrer votre service après 100 secondes mili.

+0

pourquoi devrais-je utiliser onTaskRemoved. Le service ne devrait pas être tué à moins que la mémoire ne devienne faible. Selon Android doc c'est la fonctionnalité par défaut. –

0
@Override 
    public void onTaskRemoved(Intent rootIntent) { 
} 

La méthode ci-dessus sera appelée lorsque l'application sera retirée de la version récente. Mais il n'y aurait pas de contexte. Vous devez donc faire votre travail lorsque le contexte est disponible. Ainsi, le code de lieu à l'intérieur,

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //do your operations 
    return START_REDELIVER_INTENT; 
} 

Rappelez-vous à l'intérieur onStartCommand vous devez retourner soit START_REDELIVER_INTENT ou START_STICKY. Vous pouvez obtenir la différence from here.

Et encore une chose, onStartCommand ne révoquera automatiquement que si startService est appelé une fois de n'importe où de votre code.

Ainsi, exécutez le service en appelant

startService(new Intent(context, serviceName.class));

Après codes ci-dessus onStartCommand sera révoqué périodiquement si le service est pas arrêté.

+0

pourquoi devrais-je utiliser onTaskRemoved. Le service ne devrait pas être tué à moins que la mémoire ne devienne faible. Selon Android doc c'est la fonctionnalité par défaut. –

+0

voici une explication - https://stackoverflow.com/questions/20392139/close-the-service-when-remove-the-app-via-swipe-in-android?rq=1 – Exigente05