2014-09-01 199 views
2

我已經實現了一個擴展了CountDownTimer的類,它工作良好,但是當屏幕關閉時,定時器被去同步化,所以想法是,當我離開活動或屏幕關閉,CountDownTimer應繼續正常工作。我有權限<uses-permission android:name="android.permission.WAKE_LOCK"/>,我也嘗試過PowerManager,但我認爲問題不在那裏。當屏幕關閉時,倒計時器不能正常工作

PowerManager pm = (PowerManager) getSystemService((MenuApp.this).POWER_SERVICE); 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
     myTimer = new CustomTimer(min, 1000); 
     myTimer.start();      
     wl.release(); 

@TargetApi(Build.VERSION_CODES.GINGERBREAD) @SuppressLint("NewApi") 
public class CustomTimer extends CountDownTimer 
{ 
    public CustomTimer(long millisInFuture, long countDownInterval) 
    { 

     super(millisInFuture, countDownInterval); 
     byteTimer = 1; 
    } 
    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    @SuppressLint("NewApi") 
    @Override 
    public synchronized void onTick(long millisUntilDone) 
    { 
    String hms = String.format("%02d:%02d", 
      TimeUnit.MILLISECONDS.toMinutes(millisUntilDone)- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilDone)), 
      TimeUnit.MILLISECONDS.toSeconds(millisUntilDone)-TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilDone))); 

       tim.setText(hms); 
       edit.putLong("Minute", millisUntilDone-1669); 
       edit.commit(); 

    } 
    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    @SuppressLint("NewApi") 
    @Override 
    public synchronized void onFinish() 
    { 
     tim.setText("00:00"); 
       seconds = 0L; 
       if(btnToggle.isChecked()){ 
         btnToggle.setChecked(false); 
         btnToggleTimer.setChecked(false);     
        }else{ 
         btnToggle.setChecked(true); 
         btnToggleTimer.setChecked(false); 
      }   
     } 
    } 
+0

「我也試過PowerManager,但我認爲問題不在那裏」 - 是的,它是。您已經安排了讓設備保持清醒狀態,以創建一個'CustomTimer'實例並調用'start()'。然後設備可以重新入睡。 – CommonsWare 2014-09-01 22:25:45

+0

Hi CommonsWare,你建議我做什麼?我的意思是計時器正在工作,但是如果我離開活動,不停止5分鐘,停止5分20秒。 – Soyer 2014-09-01 22:34:33

+0

@Soyer嘿,我有類似的問題;你最終做了什麼?謝謝! – user3651766 2015-07-10 22:02:14

回答

1

你推薦什麼我做什麼?

笨重的答案是做你想做的事:始終保持CPU。在啓動計時器之前,您需要acquire()WakeLock,而當您停止計時器時,您只需要release()。但是,如果在倒計時過程中始終保持CPU處於開機狀態,用戶將希望用尖刺棒執行令人討厭的事情,因爲耗盡電池。這也可能是棘手的,不要搞砸和泄漏WakeLock,在某些情況下忘記release(),導致只要您的過程繼續運行,CPU仍然保持運行。這可能足以導致用戶使用較重的武器。

因此,請勿使用CountDownTimer。相反,使用AlarmManager(即使設備處於睡眠狀態,倒計時結束時也能獲得控制權)以及輕巧的設備(例如,postDelayed()循環)可以在您碰巧處於前景時繼續更新UI。這將盡量減少電池消耗,同時仍能在正確的時間給予您控制權。