2016-03-21 14 views
2

Ich habe eine IntentService, die für immer läuft, da ich eine unendliche while-Schleife verwende. Wenn ich jedoch meine Anwendung schließe, wird der Dienst beendet. Vielleicht irre ich mich, aber soweit ich weiß, sollte die IntentService im Hintergrund laufen, bis sie die Aufgabe beendet.Android: IntentService wird beendet

Außerdem, wie ich unendliche While-Schleife verwende, sollte der Dienst für immer laufen. Aber klar ist das nicht was passiert.

public class TaskNotifierService extends IntentService { 

    public static final String TAG="TaskNotifierIS"; 

    public TaskNotifierService(){ 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     while(true){ 
      Calendar calendar = Calendar.getInstance(); 
      int day = calendar.get(Calendar.DAY_OF_WEEK); 
      String currentDay=null; 

      switch(day){ 
       case 1: 
        currentDay="Sunday"; 
        Log.i("currentDay","Current day is: "+currentDay); 
        break; 
       case 2: 
        currentDay="Monday"; 
        Log.i("currentDay","Current day is: "+currentDay); 
        break; 
       case 3: 
        currentDay="Tuesday"; 
        Log.i("currentDay","Current day is: "+currentDay); 
        break; 
       case 4: 
        currentDay="Wednesday"; 
        Log.i("currentDay","Current day is: "+currentDay); 
        break; 
       case 5: 
        currentDay="Thursday"; 
        Log.i("currentDay","Current day is: "+currentDay); 
        break; 
       case 6: 
        currentDay="Friday"; 
        Log.i("currentDay","Current day is: "+currentDay); 
        break; 
       case 7: 
        currentDay="Saturday"; 
        Log.i("currentDay","Current day is: "+currentDay); 
        break; 
      } 

      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 


} 

Kann jemand erklären, was hier falsch läuft?

+0

Die Antworten unten sind korrekt. Wenn Sie jedoch eine Aktion haben, die regelmäßig ausgeführt werden muss, sollten Sie sie mit 'AlarmManager' einplanen. Die Verwendung einer Endlosschleife ist eine schlechte Übung und führt zu einem Batterieverbrauch. – F43nd1r

Antwort

0

Android kann jeden App-Prozess jederzeit ohne Vorwarnung beenden. Es hat ein Prioritätssystem, mit dem es entscheidet, welche Prozesse zuerst beendet werden. Ein aktiver Dienst verhindert nicht, dass Ihr Prozess beendet wird, insbesondere wenn keine Benutzeroberfläche sichtbar ist.

Sie können mehr details about the priority system here lesen. Beginnen Sie mit dem folgenden Text:

Das Android-System versucht, einen Bewerbungsprozess für so lange wie möglich zu halten, aber schließlich muss alte Prozesse reclaim Speicher entfernen, um neue oder wichtige Prozesse.

2

IntentService ist entworfen, um eine eingehende Absicht zu verarbeiten und sofort danach zu stoppen. In Ihrem Fall empfehle ich Ihnen dringend, IntentService durch Service zu ersetzen.

Sowohl Service als auch IntentService werden beendet, während die Anwendung beendet wird. Sie können einen WatchAlarm im Service registrieren onCreate Funktion, um selbst in einem kontrollierten Zeitraum zu starten. Sie können den folgenden Code überprüfen:

@Override 
public void onCreate() { 
    registerWatchAlarm(); 
} 

private void registerWatchAlarm() { 
    AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
    Intent startSelf = new Intent(this, BoostBallService.class); 
    PendingIntent pi = PendingIntent.getService(this, 0, startSelf, 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, 
      System.currentTimeMillis() + WAKE_UP_TIME_INTERVAL, WAKE_UP_TIME_INTERVAL, pi); 
}