Android App用电优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leo_eight/article/details/51527498
优秀的App都应该重视手机的电量使用情况,如果一个App耗电量很大,很有可能被用户删除。下面我通过用BroadcastReceiver来监听手机的充电状态和网络连接状态,分别做出相应的操作,从而降低App用电量。

首先介绍监听充电状态。

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>


创建BroadcastReceiver类:

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>}
});


猜你喜欢

转载自blog.csdn.net/Leo_eight/article/details/51527498