android中电池电量的自动更新

android中电池电量的自动更新,android,Android,我正在使用此代码显示我的应用程序中的电池电量。它工作正常,但不会自动更新电池电量 public class MainActivity extends Activity { private TextView txtBattery; private BroadcastReceiver mBatteryLevelReciver = new BroadcastReceiver() { @Override pub

我正在使用此代码显示我的应用程序中的电池电量。它工作正常,但不会自动更新电池电量

   public class MainActivity extends Activity {


        private TextView txtBattery;

        private BroadcastReceiver mBatteryLevelReciver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {

                context.unregisterReceiver(this);
                //int rawLevel = intent.getIntExtra("level", -1);
                int rawLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                //int scale = intent.getIntExtra("scale", -1);
                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                int level = -1;
                if (rawLevel >= 0 && scale > 0) {
                    level = (rawLevel * 100) / scale;
                }
                txtBattery.setText("Battery3 Level Remaining  :" + level + "%");
            }

        };

        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            txtBattery = (TextView) findViewById(R.id.batterymeter_txt);
            batteryLevel();

        }

        private void batteryLevel() {
            IntentFilter batteryLevelFliter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
            registerReceiver(mBatteryLevelReciver, batteryLevelFliter);
        }
}
如何自动更新电池电量

   public class MainActivity extends Activity {


        private TextView txtBattery;

        private BroadcastReceiver mBatteryLevelReciver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {

                context.unregisterReceiver(this);
                //int rawLevel = intent.getIntExtra("level", -1);
                int rawLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                //int scale = intent.getIntExtra("scale", -1);
                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                int level = -1;
                if (rawLevel >= 0 && scale > 0) {
                    level = (rawLevel * 100) / scale;
                }
                txtBattery.setText("Battery3 Level Remaining  :" + level + "%");
            }

        };

        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            txtBattery = (TextView) findViewById(R.id.batterymeter_txt);
            batteryLevel();

        }

        private void batteryLevel() {
            IntentFilter batteryLevelFliter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
            registerReceiver(mBatteryLevelReciver, batteryLevelFliter);
        }
}

将receiver变量移动为class属性,以便在接收到意图时将其保存在内存中:

public class Main extends Activity {

    private TextView txtBattery;

    private BroadcastReceiver mBatteryLevelReciver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {

            //int rawLevel = intent.getIntExtra("level", -1);
            int rawLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            //int scale = intent.getIntExtra("scale", -1);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
            int level = -1;
            if (rawLevel >= 0 && scale > 0) {
                level = (rawLevel * 100) / scale;
            }
            txtBattery.setText("Battery Level Remaining  :" + level + "%");
        }

    };

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txtBattery = (TextView) findViewById(R.id.batterymeter_txt);
        batteryLevel();

    }

    private void batteryLevel() {
        IntentFilter batteryLevelFliter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryLevelReciver, batteryLevelFliter);
    }

为什么要在
onReceive()
方法中注销您的
BroadcastReceiver

context.unregisterReceiver(this);
删除该选项。

尝试此代码

public class AndroidBattery extends Activity {

private TextView batteryLevel, batteryVoltage, batteryTemperature,
batteryTechnology, batteryStatus, batteryHealth;


  /** Called when the activity is first created. */
   @Override
 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   batteryLevel = (TextView)findViewById(R.id.batterylevel);
   batteryVoltage = (TextView)findViewById(R.id.batteryvoltage);
   batteryTemperature = (TextView)findViewById(R.id.batterytemperature);
   batteryTechnology = (TextView)findViewById(R.id.batterytechology);
   batteryStatus = (TextView)findViewById(R.id.batterystatus);
   batteryHealth = (TextView)findViewById(R.id.batteryhealth);

   this.registerReceiver(this.myBatteryReceiver,
     new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
 }

 private BroadcastReceiver myBatteryReceiver
 = new BroadcastReceiver(){

  @Override
  public void onReceive(Context arg0, Intent arg1) {
   // TODO Auto-generated method stub

  if (arg1.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
 batteryLevel.setText("Level: "
 + String.valueOf(arg1.getIntExtra("level", 0)) + "%");
 batteryVoltage.setText("Voltage: "
   + String.valueOf((float)arg1.getIntExtra("voltage", 0)/1000) + "V");
   batteryTemperature.setText("Temperature: "
  + String.valueOf((float)arg1.getIntExtra("temperature", 0)/10) + "c");
 batteryTechnology.setText("Technology: " + arg1.getStringExtra("technology"));

 int status = arg1.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN);
  String strStatus;
 if (status == BatteryManager.BATTERY_STATUS_CHARGING){
  strStatus = "Charging";
  } else if (status == BatteryManager.BATTERY_STATUS_DISCHARGING){
  strStatus = "Dis-charging";
  } else if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING){
strStatus = "Not charging";
  } else if (status == BatteryManager.BATTERY_STATUS_FULL){
  strStatus = "Full";
 } else {
strStatus = "Unknown";
  }
  batteryStatus.setText("Status: " + strStatus);

  int health = arg1.getIntExtra("health", BatteryManager.BATTERY_HEALTH_UNKNOWN);
  String strHealth;
  if (health == BatteryManager.BATTERY_HEALTH_GOOD){
  strHealth = "Good";
 } else if (health == BatteryManager.BATTERY_HEALTH_OVERHEAT){
  strHealth = "Over Heat";
  } else if (health == BatteryManager.BATTERY_HEALTH_DEAD){
  strHealth = "Dead";
  } else if (health == BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE){
   strHealth = "Over Voltage";
  } else if (health == BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE){
   strHealth = "Unspecified Failure";
 } else{
   strHealth = "Unknown";
  }
 batteryHealth.setText("Health: " + strHealth);

  }
 }

   };
}

也许是一个每x秒执行一次的计时器(timertask)?还是我误解了这个问题?@Keyser我刚刚发现了同样的问题。更改上下文。取消注册接收者(此);但我不知道怎么做!afaik一些android设备只有在电池以10的倍数变化时才会发送广播。(即100%->90%->80%等)。不管怎样,您在哪里创建此batteryLevel()?活动?服务?嗨,哈维,我更新了上面的完整代码。你现在能检查一下这个吗。它仍然不起作用!您的代码底部可能有MbatteryLevelReceiver而不是BatteryLevelReceiver?但它仍然不起作用!7个月前发布了另一个相同的问题,以更改上下文;但我不知道怎么做!对不起,我没看到!!删除此行
context.unregisterReceiver(此)并重试。