java - 屏幕关闭时,倒数计时器无法正常工作

标签 java android

我已经实现了一个扩展 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/

相关文章:

java - 我为本地 sqlite 数据库创建了应​​用程序,但它没有运行。请告诉我解决方案

java - ScrollView - 从膨胀的 xml 布局添加动态行

android - RxJava flatMapIterable 与 Single

android - java.lang.NoClassDefFoundError : Failed resolution of: Lio/realm/internal/SharedRealm$Durability 错误

java - 如何提高 Field.set 的性能(可能使用 MethodHandles)?

java - 如何通过 Apache POI 3.9 从 xls/xlsx 读取时间格式?

java - 使用尚未初始化的 Context 类实例从 Android SDK 创建对象是否安全?

Android R.java既未生成也未更新

android - 在 manifest.xml 中声明的 BroadcatReceiver 未接收到 LocalBroadcastManager Intent

android - 从 firebase 数据库 flutter 中的 uid 获取用户数据