代码之家  ›  专栏  ›  技术社区  ›  stealthcopter

在广播接收器响应之前获取电池电量意图.行动\u电池\u更换

  •  41
  • stealthcopter  · 技术社区  · 14 年前

    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent intent) {
            int level = intent.getIntExtra("level", 0);
            // do something...
        }
    }
    
        registerReceiver(this.mBatInfoReceiver, 
                new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    

    但是,此代码必须等待电池状态更新,因此如果需要根据电池级别设置GUI元素,则必须等待电池事件发生。有没有办法轻推它让它工作或只是运行一些代码,看看电池水平是什么在最后一次广播?

    6 回复  |  直到 14 年前
        1
  •  37
  •   Community uzul    7 年前

    有没有一种方法来推动它工作或只是运行一些代码,看看电池的水平是什么 最后一次广播?

    registerReceiver() 用你的 IntentFilter 和一个 null BroadcastReceiver 最后一次广播 Intent . 这是因为 ACTION_BATTERY_CHANGED 是一种所谓的“粘性广播”,我更详细地描述了一下 this StackOverflow question-and-answer .

        2
  •  84
  •   ThomasW    8 年前

    这是在不注册接收器的情况下获取电池电量的方法:

    Intent batteryIntent = context.getApplicationContext().registerReceiver(null,
                        new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    int rawlevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    double scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
    double level = -1;
    if (rawlevel >= 0 && scale > 0) {
        level = rawlevel / scale;
    }
    

    由于广播的粘性,它可以使用空广播接收器。

    它使用getApplicationContext()技巧,以防您在intent接收器中遇到异常:

    android.content.ReceiverCallNotAllowedException异常: 允许注册接收 意图

        3
  •  6
  •   XXX    10 年前
        public static String batteryLevel(Context context)
        {
            Intent intent  = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));   
            int    level   = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
            int    scale   = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
            int    percent = (level*100)/scale;
            return String.valueOf(percent) + "%";
        }
    
        4
  •  2
  •   Hiren Patel    11 年前
    // Put this Code into your MainActivity
    
    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context c, Intent i) {
            int level = i.getIntExtra("level", 0);
            ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);
            pb.setProgress(level);
            TextView tv = (TextView) findViewById(R.id.textfield);
            tv.setText("Battery Level: " + Integer.toString(level) + "%");
        }
    
    };
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        registerReceiver(mBatInfoReceiver, new IntentFilter(
                Intent.ACTION_BATTERY_CHANGED));
    }
    
        5
  •  1
  •   Jorgesys    10 年前

    我使用此方法获取电池电量,而不接收更新。

    public float getMyBatteryLevel() {
            Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
            new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
            return batteryIntent.getIntExtra("level", -1);
    }
    
        6
  •  0
  •   Johan    8 年前

    请注意,您从registerReceiver call获得的意图

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

    if(intent != null){ 
    // do your stuff here... 
    }
    

    我刚得到一个空指针异常,导致应用程序崩溃!