2013-02-17 42 views
1

我的活動通過致電startservice()啓動服務。爲了簡化我的問題,可以說服務是一個計數器,並且計數器會每10秒增加一次。當手機沒有被充電時,應用程序的服務會停止

Timer t_counter; 
int counter = 0; 

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

    t_counter = new Timer(); 
    t_counter.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      counter++; 
      Log.d("counter: ",Integer.toString(counter)); 
     }}, 0, 10000); 

    return Service.START_STICKY; 
} 

當手機正在充電時(或在調試模式 - 因爲我能看到的Logcat)服務工作正常。在大約每10秒鐘,Logcat顯示調試信息,每當應用程序在後臺或不。但是當我拔掉電話時,服務會在一段時間後停止運行。應用程序(啓動服務的活動)處於活動狀態時的事件。請注意,服務沒有被破壞,只是擱置,或類似的東西。

因爲當我再次插入手機時,計時器會繼續,並且計數器的值將從剛剛拔下手機的值增加。所以如果服務已經被破壞,那麼價值將再次爲零。 (也是我調試服務的生命週期,並且看不到onStartCOmmand()onDestroy()會被調用)

我已經搜索瞭解決方案,但我認爲我沒有對此行爲的正確答案。 我知道我應該使用AlarmManager而不是Timer。或者,如果我通過startForeground()將服務foreground或單獨的process解決此問題,它也會起作用。但我想知道爲什麼我的解決方案正在充電。我在哪裏可以找到有關服務「閒置」狀態的信息。 (不執行計時器時間表,但不會被破壞)謝謝!

回答

1

您需首先lock如果您的服務已在後臺

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock wl = 
         pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 
wl.acquire(); 
// when you done 
wl.release(); 

更好的辦法是使用AlarmManager因爲保持運行的時間將電池電量的消耗和浪費系統資源的服務運行。

+0

那麼我的問題與充電有關嗎?所以當拔掉電源時,系統會停止服務? (不會破壞) – HiB 2013-02-17 18:16:37

+0

當手機使用電池供電時,系統可能會嘗試保留資源。如果你的應用程序不聽'充電狀態',我沒有看到任何其他連接。 – iTech 2013-02-17 18:21:37

+0

那麼我在哪裏可以找到有關此服務狀態的信息?沒有被銷燬只是放在「閒置」,也許它運行,如果應用程序在前臺,我會測試它 - 如果是這樣,它可能與進程連接,因爲應用程序和服務運行在同一個進程,如果沒有定義其他進程服務 – HiB 2013-02-17 18:27:36

相關問題