GPS
应用中经常会用到定位服务,Android提供了NetWork定位和GPS,相对于来说,GPS会精确的多,对于一些诸如跑
步,导航类的应用基本会使用GPS定位,然而,GPS定位也会消耗大量的电量。
使用WakeLock或者JobSchedule唤醒设备处理定时的任务之后,一定要及时让设备回到初始状态。每次唤醒蜂窝
信息进行数据传递,都会消耗很多电量,它比WiFi等操作更加的耗电。
WakeLock and Battery Drain
假设你的手机里面装了大量的社交类应用,即使手机处于待机状态,也会经常被这些应用唤醒用来检查同步新的
数据信息。Android会不断关闭各种硬件来延长手机的待机时间,首先屏幕会逐渐变暗直至关闭,然后CPU进入休
眠,这一切操作都是为了节约宝贵的电量资源。但是即使在这种睡眠状态下,大多数应用还是会查实进行工作,
他们将不断的唤醒手机。一个最简单的唤醒手机的方法是使用PowerManager.WakeLock的API来保持CPU工作并防
止屏幕变暗关闭。这使得手机可以被唤醒,执行工作,然后回到睡眠状态。知道如何获取WakeLock是简单的,可
是及时释放WakeLock也是非常重要的,不恰当的使用WakeLock会导致严重错误。例如网络请求的数据返回时间不
确定,导致本来只需要1s的事情一直等待了1个小时,这样会使得电量白白浪费了。这也是为何使用带超时参数
的WakeLock.acquire()方法是很关键的。
但是仅仅设置超时并不足够解决问题,例如设置多长时间的超时比较合适?什么时候进行重试等等?解决上面的
问题,正确的方式可能是使用非精准定时器。同常情况下,我们会设定一个时间进行某个操作,但是动态修改这
通常情况下,电量的消耗有三种状态:
Full power:能量最高的状态,移动网络连接被激活,允许设备以最大的传输速率进行操作。
Low Power:一种中间状态,对电量的消耗差不多是Full power状态下的50%
Standby:最低的状态,没有数据连接需要传输,电量消耗最少。
总之,为了减少电量的消耗,在蜂窝移动网络下,最好做到批量执行网络请求,尽量避免频繁的间隔网络请求。
使用Job_Shedule,应用需要做的事情就是判断哪些任务是不紧急的,可以交给Job Schedule来处理,Job
Scheduler集中处理收到的任务,选择合适的时间,合适的网络,再一起进行执行。
尽可能减少App的电量消耗的建议
优化网络请求
谨慎使用WakeLock
WakeLock 获取释放成对出现
使用超时WakeLock,以防异常导致没有释放
acquire(long timeout)
监听手机充电状态
BatteryManager会发送一个包含充电状态的持续广播,我们可以通过此广播获取充电状态和电量详情。
IntentFilter filter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus=context.registerReceiver(null,filter)
Doze和App Standby
Android 6.0提供了两个用来节省电量的技术Doze和App Standby
Doze
瞌睡,如果设备闲置一段较长事件,Doze技术将通过延迟后台网络活动,CPU运行等来减少电量损耗。
App Standby
应用待机。不是最近得到用户使使用的App,APP Standby将延缓这个应用的后台网络活动。
因为所有Android6.0即以上的设备上,Doze and App Standby都会运行。可能会影响你的App运行。
关于定位
locationManager.removeUpdates(locationListener)
减少更新频率
应用中经常会用到定位服务,Android提供了NetWork定位和GPS,相对于来说,GPS会精确的多,对于一些诸如跑
步,导航类的应用基本会使用GPS定位,然而,GPS定位也会消耗大量的电量。
使用WakeLock或者JobSchedule唤醒设备处理定时的任务之后,一定要及时让设备回到初始状态。每次唤醒蜂窝
信息进行数据传递,都会消耗很多电量,它比WiFi等操作更加的耗电。
WakeLock and Battery Drain
假设你的手机里面装了大量的社交类应用,即使手机处于待机状态,也会经常被这些应用唤醒用来检查同步新的
数据信息。Android会不断关闭各种硬件来延长手机的待机时间,首先屏幕会逐渐变暗直至关闭,然后CPU进入休
眠,这一切操作都是为了节约宝贵的电量资源。但是即使在这种睡眠状态下,大多数应用还是会查实进行工作,
他们将不断的唤醒手机。一个最简单的唤醒手机的方法是使用PowerManager.WakeLock的API来保持CPU工作并防
止屏幕变暗关闭。这使得手机可以被唤醒,执行工作,然后回到睡眠状态。知道如何获取WakeLock是简单的,可
是及时释放WakeLock也是非常重要的,不恰当的使用WakeLock会导致严重错误。例如网络请求的数据返回时间不
确定,导致本来只需要1s的事情一直等待了1个小时,这样会使得电量白白浪费了。这也是为何使用带超时参数
的WakeLock.acquire()方法是很关键的。
但是仅仅设置超时并不足够解决问题,例如设置多长时间的超时比较合适?什么时候进行重试等等?解决上面的
问题,正确的方式可能是使用非精准定时器。同常情况下,我们会设定一个时间进行某个操作,但是动态修改这
个事件也许会更好。这正是JobSheduler API所做的事情。它会根据当前的情况与任务,组合出理想的唤醒时间,
例如等到正在充电或者连接到Wifi的时候,或者集中任务一起执行。我们可以通过这个API实现很多免费的调度算法。
NetWork and Battery Drain通常情况下,电量的消耗有三种状态:
Full power:能量最高的状态,移动网络连接被激活,允许设备以最大的传输速率进行操作。
Low Power:一种中间状态,对电量的消耗差不多是Full power状态下的50%
Standby:最低的状态,没有数据连接需要传输,电量消耗最少。
总之,为了减少电量的消耗,在蜂窝移动网络下,最好做到批量执行网络请求,尽量避免频繁的间隔网络请求。
使用Job_Shedule,应用需要做的事情就是判断哪些任务是不紧急的,可以交给Job Schedule来处理,Job
Scheduler集中处理收到的任务,选择合适的时间,合适的网络,再一起进行执行。
尽可能减少App的电量消耗的建议
优化网络请求
谨慎使用WakeLock
WakeLock 获取释放成对出现
使用超时WakeLock,以防异常导致没有释放
acquire(long timeout)
监听手机充电状态
BatteryManager会发送一个包含充电状态的持续广播,我们可以通过此广播获取充电状态和电量详情。
IntentFilter filter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus=context.registerReceiver(null,filter)
Doze和App Standby
Android 6.0提供了两个用来节省电量的技术Doze和App Standby
Doze
瞌睡,如果设备闲置一段较长事件,Doze技术将通过延迟后台网络活动,CPU运行等来减少电量损耗。
App Standby
应用待机。不是最近得到用户使使用的App,APP Standby将延缓这个应用的后台网络活动。
因为所有Android6.0即以上的设备上,Doze and App Standby都会运行。可能会影响你的App运行。
关于定位
locationManager.removeUpdates(locationListener)
减少更新频率
根据实际情况选择GPS或网络或两者,只使用一个会降低电量损耗。