【问题标题】:Android How to increase Battery level in text viewAndroid 如何在文本视图中增加电池电量
【发布时间】:2015-01-05 16:57:23
【问题描述】:

大家好,我正在开发一个应用程序,我在其中获取电池电量并在文本视图中显示它。现在我想在每 5 秒后将此级别增加 1%,并希望显示此增量。 我已经尝试了以下代码,但我无法得到我的输出

java代码

public class ChargingActivity extends Activity {
    TextView textBatteryLevel = null;
    int level;

    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context ctxt, Intent intent) {
            level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                public void run() {
                    // add your stuff here
                    level++;
                }
            }  
         , 5000);
            textBatteryLevel.setText(String.valueOf(level) + "%");
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chargingactivity);
        textBatteryLevel = (TextView) findViewById(R.id.btrylevel);
        this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

但电池电量在每 5 秒后没有增加。我做错了什么?

【问题讨论】:

  • 你似乎已经“添加了你的东西”而不是它告诉你的地方......

标签: android


【解决方案1】:

我建议使用View 类的postDelayed(...) 方法,也不要使用实际的BroadcastReceiver

例如,Intent.ACTION_BATTERY_CHANGED 是一个STICKY 广播,因此不需要BroadcastReceiver 来处理它。相反,如果我们将null 作为第一个参数传递给registerReceiver(...) 方法,则实际上没有注册接收器,但该调用的返回是来自粘性广播的Intent。示例...

Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

下一步是为TextView 设置 5 秒更新。 Android View 类有一个postDelayed(...) 方法,它接受Runnable 参数以及以毫秒为单位的延迟。示例...

textBatteryLevel.postDelayed(levelChecker, 5000);

ViewpostDelayed(...) 方法是一次性(非重复)“发布”,因此请确保在每次调用时在 Runnablerun() 方法中对其进行重置。

我还没有测试过以下代码,但我认为它应该可以工作。但请记住,不能保证电池电量水平会在任何 5 秒内发生变化。每 1% 的电量可能需要大约 1 分钟才能为我的平板电脑和手机上的类似设备充电,所以我当然不希望看到 TextView 每 5 秒更新一次。

public class ChargingActivity extends Activity {

    TextView textBatteryLevel = null;
    int level;
    LevelChecker levelChecker = new LevelChecker();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chargingactivity);
        textBatteryLevel = (TextView) findViewById(R.id.btrylevel);

        // Get the current battery level
        Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);

        // Set the starting level
        textBatteryLevel.setText(String.valueOf(level) + "%");
    }

    @Override
    protected void onResume() {
        super.onResume();
        textBatteryLevel.postDelayed(levelChecker, 5000);
    }

    @Override
    protected void onPause() {
        textBatteryLevel.removeCallbacks(levelChecker);
    }

    private class LevelChecker extends Runnable {

        @Override
        public void run() {
            Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
            int currentLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
            if (currentLevel != level) {
                level = currentLevel;
                textBatteryLevel.setText(String.valueOf(level) + "%");
            }
            textBatteryLevel.postDelayed(levelChecker, 5000);
        }
    }

}

【讨论】:

    【解决方案2】:

    在 TimerTask 中移动文本更改代码。

    Timer timer = new Timer();
    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
            @Override
            public void onReceive(Context ctxt, Intent intent) {
                level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                timer.schedule(new TimerTask() {
                    public void run() {
                        level++;
                         textBatteryLevel.setText(String.valueOf(level) + "%");
                        }
                    }
                , 5000);
            }
          };
    

    【讨论】:

    • level++; 应该在显示文本之后出现。
    • 然后在您的问题中提供异常堆栈跟踪。
    • @Divers :BroadcastReceiver 的生命周期是从调用 onReceive(...) 直到该方法退出。 BroadcastReceiver 应该永远执行任何长时间运行的操作,并且在 onReceive(...) 中创建 Timer 永远不会起作用。
    • @Squonk 那么您认为 TimerThread(在 Timer 内部使用)会在执行期间被系统杀死?有可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多