2016-03-21 29 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」進行安排。使用無限循環是不好的做法,會導致電池耗盡。 – F43nd1r

回答

0

Android可以隨時殺死任何應用程序進程而不會發出警告。它有一個優先系統,它決定哪個進程首先被殺死。使服務處於活動狀態不會阻止您的進程被終止,特別是如果它沒有可見的用戶界面。

您可以閱讀更多details about the priority system here。開始在下面的文字:

Android系統試圖維持長期儘可能 一個應用程序,但最終還是需要移除舊的進程 回收內存爲新的或更重要的進程。

2

IntentService設計用於處理傳入的意圖並在之後立即停止。所以在你的情況下,我強烈建議你用Service代替IntentService

當應用程序被終止時,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); 
}