我已经实现了一个扩展 CountDownTimer 的类,它工作得很好,但是当屏幕关闭时,计时器是不同步的,所以我的想法是,当我退出 Activity 或屏幕关闭时, 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);
}
}
}
最佳答案
What do you recommend me to do?
笨拙的答案是做你想做的事:让 CPU 一直开着。您将在启动计时器之前获取()
WakeLock
并且在停止计时器时仅release()
它。但是,如果您在倒计时期间始终保持 CPU 开启,用户会想用尖头棍对您做一些下流的事情,因为这会耗尽电池电量。不搞砸和泄漏 WakeLock
也可能很棘手,在某些情况下忘记 release()
它,导致 CPU 在您的进程继续时保持开启状态运行。这可能足以让用户带着更重的武器来追你。
因此,不要使用 CountDownTimer
。相反,使用 AlarmManager
(在倒计时结束时获得控制,即使设备处于 sleep 状态)和一些轻量级的东西(例如,postDelayed()
循环)来保持更新当您恰好在前台时的 UI。这将最大限度地减少电池消耗,同时仍然让您在正确的时间进行控制。
关于java - 屏幕关闭时,倒数计时器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25613395/