版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leo_eight/article/details/51527498
优秀的App都应该重视手机的电量使用情况,如果一个App耗电量很大,很有可能被用户删除。下面我通过用BroadcastReceiver来监听手机的充电状态和网络连接状态,分别做出相应的操作,从而降低App用电量。
首先介绍监听充电状态。
创建BroadcastReceiver类:
上述的方法有个副作用,就是一旦收到广播,应用就会唤醒设备,唤醒的频率可能会远高于需要的频率。如果有个方法可以开启或关闭BroadcastReceiver就好了。其实是有的!PackageManager可以帮我们完成这个功能。想想这么个场景,当网络断开后,但与网络相关的接收器还在监听,这就造成电量的浪费,这时我们应该把它们关闭。
首先介绍监听充电状态。
BatteryManager会在设备连接或者断开充电器的时候广播一个Action,分别为ACTION_POWER_CONNECTED与ACTION_POWER_DISCONNECTED。所以我们只需注册一个BroadcastReceiver来监听就可以知道手机的充电状态。当充电时,可以增大更新频率;当没充电时,应该减少更新频率,增大手机的续航。
<receiver android:name=".PowerConnectionReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<span style="white-space:pre"> </span><action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
<span style="white-space:pre"> </span></intent-filter>
</receiver>
public class PowerConnectionReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
if(isCharging) {
// 增大更新频率
} else {
// 减少更新频率
}
}
}
下面介绍网络状态的监听。网络状态的监听有很多应用场景哦,例如,当当前网络状态不是wifi时,就停止下载任务,或者停止推送,停止版本更新等。
首先还是用BroadcastReceiver监听
扫描二维码关注公众号,回复:
3432101 查看本文章
<receiver android:name=".ConnectReceiver">
<span style="white-space:pre"> </span><intent-filter >
<span style="white-space:pre"> </span><action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
创建BroadcastReceiver类:
public class ConnectReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
boolean isConnected = info != null && info.isConnectedOrConnecting();
boolean isWifi = info != null && info.getType() == ConnectivityManager.TYPE_WIFI;
if(isConnected) {
// 网络可用
} else {
// 网络不可用
}
if(isWifi) {
// 已连接wifi
} else {
// 断开wifi
}
}
}
上述的方法有个副作用,就是一旦收到广播,应用就会唤醒设备,唤醒的频率可能会远高于需要的频率。如果有个方法可以开启或关闭BroadcastReceiver就好了。其实是有的!PackageManager可以帮我们完成这个功能。想想这么个场景,当网络断开后,但与网络相关的接收器还在监听,这就造成电量的浪费,这时我们应该把它们关闭。
final PackageManager pm = this.getPackageManager();
final ComponentName mReceiver = new ComponentName(this, ConnectReceiver.class);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(flag) {
// turn off
pm.setComponentEnabledSetting(mReceiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
flag = false;
} else {
// turn on
pm.setComponentEnabledSetting(mReceiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
flag = true;
}
<span style="white-space:pre"> </span>}
});