2016-03-21 3 views
2

У меня есть IntentService, который работает вечно, поскольку я использую бесконечный цикл while. Однако, когда я закрываю приложение, служба прекращается. Возможно, я ошибаюсь, но, насколько мне известно, IntentService должен бежать в фоновом режиме, пока он не завершит задачу.Android: IntentService завершается

Кроме того, поскольку я использую бесконечный цикл while, служба должна работать вечно. Но ясно, что это не то, что происходит.

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

     } 
    } 


} 

Может кто-нибудь объяснить, что здесь происходит не так?

+0

Ответы приведены ниже. Однако, если у вас есть действие, которое необходимо выполнить периодически, вы должны запланировать его с помощью 'AlarmManager'. Использование петли infinte - это плохая практика и приведет к отказу батареи. – F43nd1r

ответ

0

Android может убить любой процесс приложения в любое время без предупреждения. Он имеет приоритетную систему, с помощью которой он решает, какие процессы сначала будут убиты. Наличие активного сервиса не мешает вашему процессу быть убитым, особенно если он не имеет видимого интерфейса.

Вы можете прочитать больше details about the priority system here. Начало в следующем тексте:

Андроида система пытается поддерживать процесс подачи заявок на качестве долго, насколько это возможно, но в конечном счете, необходимо удалить старые процессы регенерата памяти для новых или более важных процессов.

2

IntentService предназначен для обработки входящего намерения и остановки сразу после. Поэтому в вашем случае я настоятельно рекомендую вам заменить IntentService на Service.

Служба Service и IntentService будет убита, пока приложение будет убито, вы можете зарегистрировать функцию WatchAlarm в службе onCreate, чтобы запустить себя в контролируемый период. Вы можете проверить приведенный ниже код:

@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); 
} 
Смежные вопросы