2013-12-06 10:04:42 new_abc 阅读数 6518
  • 【第五场】小型团队的Android应用质量保障之道(全)

    Android从推出之日算起已经有十余年了,这十余年里无数工程师为之奋斗,对Android每个版本、每一个新特性都欢欣鼓舞。时光流转,在今天这个时候,我们年轻一代的主力Android工程师更关注Android开发什么内容?他们有...

    5248课时 0分钟 429人学习 CSDN讲师
    免费试看

新建一个Receiver用于接受ACTION_BATTERY_CHANGED广播。   

 private int mBatteryLevel;
    private int mBatteryScale;
    class BatteryReceiver extends BroadcastReceiver{  
    	  
        @Override  
        public void onReceive(Context context, Intent intent) {  
            // TODO Auto-generated method stub  
            //判断它是否是为电量变化的Broadcast Action  
            if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){  
                //获取当前电量  
            	mBatteryLevel = intent.getIntExtra("level", 0);  
                //电量的总刻度  
            	mBatteryScale = intent.getIntExtra("scale", 100);  
            }  
        }  
          
    } 

在onCreate中:

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);  
        BatteryReceiver batteryReceiver = new BatteryReceiver();
        registerReceiver(batteryReceiver, intentFilter);  
        mBackupManager = IBackupManager.Stub.asInterface(
                ServiceManager.getService(Context.BACKUP_SERVICE));

这里有一点需要注意,ACTION_BATTERY_CHANGED广播为粘性广播,所以已注册就会会调用onReceive,获取到当前的电量信息。

2016-02-19 11:27:08 XiaYiZhanQiHang 阅读数 21047
  • 【第五场】小型团队的Android应用质量保障之道(全)

    Android从推出之日算起已经有十余年了,这十余年里无数工程师为之奋斗,对Android每个版本、每一个新特性都欢欣鼓舞。时光流转,在今天这个时候,我们年轻一代的主力Android工程师更关注Android开发什么内容?他们有...

    5248课时 0分钟 429人学习 CSDN讲师
    免费试看

方法一:注册广播

这个方法网上一搜一大堆,我也贴出部分代码

IntentFilter filter2 = new IntentFilter();
filter2.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(filter2,receiver);
接收到广播后,用getIntExtra("level")和getIntExtra("scale")获得相应值

方法二:通过执行命令(不需要root)
通过adb shell dumpsys battery,返回结果后有电池的各种信息,其中就包括level(百分比)

方法三:通过BatteryManager
BatteryManager batteryManager=(BatteryManager)getSystemService(BATTERY_SERVICE);
System.out.println(batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER));
System.out.println(batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE));
System.out.println(batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW));

这个需要Api>=21才行,所以说4.4.2的手机是不支持的。4.4.2手机执行上述代码的时候程序会崩溃。
我是第一次碰到这种问题,所以标记一下。

2015-08-31 22:59:49 androidxiaogang 阅读数 7160
  • 【第五场】小型团队的Android应用质量保障之道(全)

    Android从推出之日算起已经有十余年了,这十余年里无数工程师为之奋斗,对Android每个版本、每一个新特性都欢欣鼓舞。时光流转,在今天这个时候,我们年轻一代的主力Android工程师更关注Android开发什么内容?他们有...

    5248课时 0分钟 429人学习 CSDN讲师
    免费试看

广播分为静态广播动态广播,其实非常容易理解:

静态广播就是我们在xml文件中的application注册的广播,当我们退出应用时,广播依然在运行。
动态广播是我们在代码中注册的广播,比如在activity中注册的广播,它的生命周期随着activity的结束而结束。


下面主要介绍一下动态注册广播获取当前电量信息,从BroadcastReceive中获取电量信息,并传递给activity,显示在textview中

xml文件中只有一个textview

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="当前电池电量"
        android:textSize="25dp" />

</RelativeLayout>

定义一个MyReceiver继承BroadcastReceiver,重写onReceive()方法,在方法中获取电量的信息

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //获取当前电量
        int level = intent.getIntExtra("level", 0);
        //电量的总刻度
        myListener.onListener(level+"");
        System.out.println(level + "%");
    }
    //设置监听回调,用于把电量的信息传递给activity
    public MyListener myListener;
    public interface MyListener {
        public void onListener(String level);
    }
    public void setMyListener(MyListener myListener) {
        this.myListener = myListener;
    }
}

在MainActivity中通过意图过滤器来注册广播,IntentFilter是对意图进行过滤的,就是我想要接收哪些广播,不想接收哪些广播,主要过滤Intent中Action,Data和Category的字段。
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);中Intent的参数ACTION_BATTERY_CHANGED,通过看源码知这是一个系统级别广播,作用就是获取当明电池的信息;
这里写图片描述
在MainActivity中的代码如下

public class MainActivity extends ActionBarActivity implements MyReceiver.MyListener {
    MyReceiver myReceiver;
    private TextView textview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textview = (TextView) findViewById(R.id.textview);
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        myReceiver = new MyReceiver();
        registerReceiver(myReceiver, intentFilter);
        myReceiver.setMyListener(this);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
    //通过回调,得到BroadcastReceiver中的电量使用情况,并且设置给textview;
    @Override
    public void onListener(String level) {
        textview.setText(level + "%");
    }
}

最后运行结果:
这里写图片描述
注:如果我们不退出activity时,电池的电量随着时间变化而变化,比如我们如果在充电,就是在textview中看到电量的上升,但我们退出activity时,广播已经取消了,再次进行的时候,是重新获取的。
还有一点,就是我们在代码是注册的广播一定要在适合的时候注销,有人可能问activity关闭,广播不是不起作用了吗,为什么一定要关闭呢。如果没有及时关闭广播,广播在原有的activity中并不会注销,这是比较耗费内存资源的,因此对于在代码中注册的广播都要手工关闭,在onDestory()方法中注销就可以了。

2017-12-05 10:45:03 wxd_csdn_2016 阅读数 13053
  • 【第五场】小型团队的Android应用质量保障之道(全)

    Android从推出之日算起已经有十余年了,这十余年里无数工程师为之奋斗,对Android每个版本、每一个新特性都欢欣鼓舞。时光流转,在今天这个时候,我们年轻一代的主力Android工程师更关注Android开发什么内容?他们有...

    5248课时 0分钟 429人学习 CSDN讲师
    免费试看

第一种方法:注册广播

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(receiver,filter);
接收到广播后,用getIntExtra("level")和getIntExtra("scale")获得相应值
这种方法比较被动,需要电量变化系统发出广播才能得到电量


第二种方法: 通过BatteryManager

BatteryManager batteryManager = (BatteryManager)getSystemService(BATTERY_SERVICE);
int battery = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
这种方法可以主动去获取电量,不必被动的等电量变化之后才能获取到

第三种方法:使用adb去获取

通过adb shell dumpsys battery,返回结果后有电池的各种信息,其中就包括level(百分比)


注意:

android.intent.action.SCREEN_ON

android.intent.action.SCREEN_OFF

android.intent.action.BATTERY_CHANGED

这两个广播只能动态注册



2016-09-18 13:42:14 androidWuYou 阅读数 0
  • 【第五场】小型团队的Android应用质量保障之道(全)

    Android从推出之日算起已经有十余年了,这十余年里无数工程师为之奋斗,对Android每个版本、每一个新特性都欢欣鼓舞。时光流转,在今天这个时候,我们年轻一代的主力Android工程师更关注Android开发什么内容?他们有...

    5248课时 0分钟 429人学习 CSDN讲师
    免费试看



Android开发者可以利用BroadcastReceiver机制,获取电池电量变化的ACTION_BATTERY_CHANGED intent,进而获取当前android设备的电池状态。
具体操作步骤:
1. 创建一个监听ACTION_BATTERY_CHANGED事件的intentFilter。
2. 创建一个BroadcastReceiver对象,该对象可以接收broadcast intent。
3. 注册BroadcastReceiver对象来监听ACTION_BATTERY_CHANGED事件。
4. 在BroadcastReceiver对象中,重写onReceive方法,在onReceive方法的传入参数intent里获取需要的电池状态信息。

5. 在生命周期结束时,取消step4中的注册。

java代码
package mm.shandong.com.testbattery;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;

public class TestBatteryActivity extends AppCompatActivity {
    BatteryChangedReceiver batteryChangedReceiver;
    Button btn_register;
    Button btn_unregister;
    TextView tv_heath;
    TextView tv_level;
    TextView tv_maxlevel;
    TextView tv_pluged;
    TextView tv_status;
    TextView tv_other;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_battery);
        tv_heath= (TextView) findViewById(R.id.tv_heath);
        tv_level= (TextView) findViewById(R.id.tv_level);
        tv_maxlevel= (TextView) findViewById(R.id.tv_maxlevel);
        tv_pluged= (TextView) findViewById(R.id.tv_pluged);
        tv_status= (TextView) findViewById(R.id.tv_status);
        tv_other= (TextView) findViewById(R.id.tv_other);
        batteryChangedReceiver=new BatteryChangedReceiver();
        btn_register= (Button) findViewById(R.id.btn_register);
        btn_unregister= (Button) findViewById(R.id.btn_unregister);
        btn_unregister.setEnabled(false);
    }
    //注册电量监听的Broadcastreceiver
    public void registBatter(View view){
        IntentFilter intentFilter=getFilter();
        registerReceiver(batteryChangedReceiver,intentFilter);
        btn_register.setEnabled(false);
        btn_unregister.setEnabled(true);
        Toast.makeText(this,
                "电量变化的receiver已经注册成功"
                ,Toast.LENGTH_SHORT).show();
    }
    //取消注册电量监听的Broadcastreceiver
    public void unRegistBatter(View view){
        unregisterReceiver(batteryChangedReceiver);
        btn_register.setEnabled(true);
        btn_unregister.setEnabled(false);
        Toast.makeText(this,"电量变化的receiver已经取消注册",
                Toast.LENGTH_SHORT).show();
    }
    ///获取IntentFilter对象
    private IntentFilter getFilter() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction(Intent.ACTION_BATTERY_LOW);
        filter.addAction(Intent.ACTION_BATTERY_OKAY);
        return filter;
    }
    public class BatteryChangedReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            final String action = intent.getAction();
            if (action.equalsIgnoreCase(Intent.ACTION_BATTERY_CHANGED)) {
                // 当前电池的电压
                int voltage = intent.
                        getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
                // 电池的健康状态
                int health = intent.
                        getIntExtra(BatteryManager.EXTRA_HEALTH, -1);
                switch (health) {
                    case BatteryManager.BATTERY_HEALTH_GOOD:
                        tv_heath.setText("很好");
                    case BatteryManager.BATTERY_HEALTH_COLD:
                        tv_heath.setText("BATTERY_HEALTH_COLD");
                        break;
                    case BatteryManager.BATTERY_HEALTH_DEAD:
                        tv_heath.setText("BATTERY_HEALTH_DEAD");
                        break;
                    case BatteryManager.BATTERY_HEALTH_OVERHEAT:
                        tv_heath.setText("BATTERY_HEALTH_OVERHEAT");
                        break;
                    case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
                        tv_heath.setText("BATTERY_HEALTH_OVER_VOLTAGE");
                        break;
                    case BatteryManager.BATTERY_HEALTH_UNKNOWN:
                        tv_heath.setText("BATTERY_HEALTH_UNKNOWN");
                        break;
                    case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
                        tv_heath.
                            setText("BATTERY_HEALTH_UNSPECIFIED_FAILURE");
                        break;
                    default:
                        break;
                }
                // 电池当前的电量, 它介于0和 EXTRA_SCALE之间
                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                tv_level.setText(String.valueOf(level));
                // 电池电量的最大值
                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                tv_maxlevel.setText(String.valueOf(scale));
                // 当前手机使用的是哪里的电源
                int pluged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
                switch (pluged) {
                    case BatteryManager.BATTERY_PLUGGED_AC:
                        // 电源是AC charger.[应该是指充电器]
                        tv_pluged.setText("电源是AC charger.");
                        break;
                    case BatteryManager.BATTERY_PLUGGED_USB:
                        // 电源是USB port
                        tv_pluged.setText("电源是USB port");
                        break;
                    default:
                        break;
                }
                int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
                switch (status) {
                    case BatteryManager.BATTERY_STATUS_CHARGING:
                        // 正在充电
                        tv_status.setText("正在充电");
                        break;
                    case BatteryManager.BATTERY_STATUS_DISCHARGING:
                        tv_status.setText("BATTERY_STATUS_DISCHARGING");
                        break;
                    case BatteryManager.BATTERY_STATUS_FULL:
                        // 充满
                        tv_status.setText("充满");
                        break;
                    case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
                        // 没有充电
                        tv_status.setText("没有充电");
                        break;
                    case BatteryManager.BATTERY_STATUS_UNKNOWN:
                        // 未知状态
                        tv_status.setText("未知状态");
                        break;
                    default:
                        break;
                }
                // 电池使用的技术。比如,对于锂电池是Li-ion
                String technology = intent.
                        getStringExtra(BatteryManager.EXTRA_TECHNOLOGY);
                // 当前电池的温度
                int temperature = intent.
                        getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
                String str= "voltage = " + voltage + " technology = "
                        + technology + " temperature = " + temperature;
                tv_other.setText(str);
            } else if (action.equalsIgnoreCase(Intent.ACTION_BATTERY_LOW)) {
                // 表示当前电池电量低
            } else if (action.equalsIgnoreCase(Intent.ACTION_BATTERY_OKAY)) {
                // 表示当前电池已经从电量低恢复为正常
                System.out.println(
                     "BatteryChangedReceiver ACTION_BATTERY_OKAY---");
            }
        }

    }


}


最后,以上例子都来源与安卓学习手册,例子源码,源码例子文档一网打尽。