如何在1小时后获得电池状态?

时间:2014-07-22 09:15:11

标签: android timer

我想开发一款计算电池应用的Android App 所以,我的想法是如何做到这一点:当用户启动应用程序时,应用程序获取手机的电池电量(例如:80%)。 1小时后,应用程序再次获得电池状态(然后是例如:76%)。计算:在1小时内电池损失4%,这意味着电池将持续约20小时(80/4)

我知道,如何获得电池状态等。 我的问题:如何在后台设置倒计时1小时?不应该是显示倒计时的任何textView。 coundown需要在后台运行。我怎么能这样做?

我用Google搜索并发现了这一点,但这不起作用:(我将这些方法放在onCreate()

CountDownTimer countDownTimer = new CountDownTimer(5000, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            IntentFilter intFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
            BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                }
            };
        }

        @Override
        public void onFinish() {
            BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                    Toast toast = Toast.makeText(context, "Battery: " + level/4, Toast.LENGTH_LONG); // this is just, to check, if the countDown is still running
                    toast.show();
                }
            };
        }
    };

1 个答案:

答案 0 :(得分:0)

您需要注册一次广播接收器。

       //in Oncreate
       ...
       IntentFilter intFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
       BatteryReceiver batteryReceiver = new BatteryReceiver();
       registerReceiver(batteryReceiver , intFilter);
       ...

       public class BatteryReceiver extends BroadcastReceiver {
            int startlevel = 0;
            long lastUpdateTime = 0;
            boolean isStartCheck = false;
            @Override
            public void onReceive(Context context, Intent intent) {
                if(!isStartCheck){
                    startlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                    lastUpdateTime = System.currentTimeMillis();
                    isStartCheck = true;   
                } else {
                    if((System.currentTimeMillis() - lastUpdateTime)/1000 > 3600) {
                    // 1h was going. do your work.
                    reset();
                    }
                }  
            }

            public void reset() {
                lastUpdateTime = System.currentTimeMillis();
                isStartCheck = false;
                startLevel = 0;
            }

       }