电量消耗决定某个应用是否被安装的重要因素之一。
移动设备耗电量高值得关注的硬件模块:CPU、网络硬件、蓝牙、GPS、麦克风、加速计、摄像头、扬声器和屏幕。
CPU是应用所使用的主要硬件。在后台操作和处理推送通知时,应用仍然会消耗CPU资源。
应用计算得越多,消耗的电量就越多。在完成相同的基本操作时,老一代的设备会消耗更多电量。
计算量的消耗取决于不同的因素:
* 对数据的处理
* 待处理的数据大小-更大的显示屏允许软件在单个视图中展示更多的信息,但这也意味着要处理更多的数据。
* 处理数据的算法和数据结构
* 执行更新的次数,尤其时在数据更新后,触发应用的状态或UI进行更新。
以下是一些可以在应用中投入使用的最佳实践:
* 针对不同情况选择优化的算法
* 如果应用从服务器接收数据,尽量减少需要在客户端进行的处理。
* 优化静态编译(AOT)处理(动态编译处理的缺点在于它会强制用户等待操作完成。但是激进的AOT处理则会导致计算资源的浪费。需要根据应用和设备选择精确定量的AOT处理。)
* 分析电量消耗
智能的网络访问管理可以让应用响应得更快,并有助于延长电池寿命。
应避免在没有连接WIFI的情况下进行高宽带消耗的操作。
* 需要进行任何网络操作之前,先检查合适的网络连接是否可用。
* 持续监视网络的可用性,并在连接状态发生变化时给予适当的反馈。
使用基于队列网络请求以避免服务器被多个同时发起的请求所轰炸。至少使用两个队列:一个用于通常不是很关键的大量图片下载,另一个用于关键数据的请求。
使用GPS计算坐标需要确定两点信息。
* 时间锁(每个GPS卫星每秒广播唯一一个1023位随机数,因而数据传播速率时1.024Mbit/s。GPS的接收芯片必须正确地与卫星的时间锁槽对齐。)
* 频率锁(GPS接收器必须计算由接收器与卫星的相对运动导致的多普勒偏移带来的信号误差)
计算坐标会不断地使用CPU和GPS的硬件资源,因此它们会迅速地消耗电池电量。
3.1 最佳初始化
在调用startUpdatingLocation 方法时,两个参数起着非常重要的作用。
*distanceFilter:只要设备的移动设备超过了最小距离,距离过滤器就会导致管理器对委托对象的locationManager: didUpdateLocations: 事件通知发生改变。
*精度参数的使用直接影响了使用天线的个数,进而影响了对电池的消耗。精度级别的选择取决与应用的具体用途。按照降序排列。
距离过滤器只是软件层面的过滤器,而精度级别会影响物理天线的使用。当委托的回调方法locationManager: didUpdateLocations: 被调用时,使用距离范围更广的过滤器只会影响间隔。另一方面,更高的精度级别意味着更多的活动天线,这会消耗更多的能量。
3.2 关闭无关紧要的特性
判断何时需要跟踪位置的变化。在需要跟踪时调用startUpdateingLocation方法,无需跟踪时调用stopUpdatingLocation方法。
3.3 只在必要时使用网络
为了提高电量的使用效率,iOS总是尽可能地保持无线网络关闭。当应用需要建立网络连接时,iOS会利用这个机会向后台应用分享网络会话,以便一些优先级的事件能够被处理。如推送通知,收取电子邮件。
关键在于每当应用建立网络连接时,网络硬件都会连接完成后多维持几秒的活动时间。每次集中的网络通信都会消耗大量的电量。
想要减轻这个问题带来的危害,软件需要有所保留的使用网络。应该定期集中短暂地使用网络,而不是持续的保持着活动的数据流。只有这样,网络硬件才有机会被关闭。
3.4 后台定位服务
CLLocationManager 提供了一个替代的方法来监听位置的更新。startMonitoringSignificantLocationChanges可以帮助你在更远的距离跟踪运动。精确的值由内部决定,且与distanceFilter 无关。
- (void)applicationDidEnterBackground:(UIApplication *)application {
[self.locationManager stopUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
}
- (void)willEnterForeground:(UIApplication *)application {
[self.locationManager stopMonitoringSignificantLocationChanges];
[self.locationManager startUpdatingLocation];
}
3.5 NSTimer 、NSThread和定位服务
当应用位于后台时,任何定时器或线程都会挂起。但如果你在应用位于后台状态申请了定位,那么应用会在每次收到更新后被短暂唤醒。在此期间,线程的计时器都会被唤醒。可怕之处在于,如果你在这段时间做了任何网络操作,则会启动所有相关的天线。
3.6 在应用关闭后重启
-(void)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if(launchOptions[UIApplicationLaunchOptionsLocationKey]) {
[self.manager startMonitoringSignificantLocationChanges];
}
}
屏幕非常耗电。屏幕越大就越费电。优化方案如下:
4.1 动画
当应用在前台时使用动画,一旦应用进入后台则立即暂停动 画。通常来说,你可以通过监听 UIApplicationWillResignActiveNotification 或 UIApplic ationDidEnterBackgroundNotification 的通知事件来暂停或停止动画,也可以通过监听 UI ApplicationDidBecomeActiveNotification 的通知事件来恢复动画。
4.2 视频播放
在视频播放期间,最好强制保持屏幕常亮。可以使用 UIApplication 对象的 idleTimerDisabled。属性来实现这个目的。一旦设置为 YES,它会阻止屏幕休眠,从而实现常亮。
当应用进入后台时,应该释放对这些硬件的锁定:
• 蓝牙
• 相机
• 扬声器,除非应用是音乐类的 • 麦克风
我们并不会在这里讨论这些硬件的特性,但是基本规则是一致的——只有当应用处于前台 时才与这些硬件进行交互,应用处于后台时应停止交互。
扬声器和无线蓝牙可能是例外。如果你正在开发音乐、收音机或其他的音频类应用,则需 要在应用进入后台后继续使用扬声器。不要让屏幕仅仅为音频播放的目的而保持常亮。类 似地,若应用还有未完成的数据传输,则需要在应用进入后台后持续使用无线蓝牙,例 如,与其他设备传输文件。
一个智能的应用会考虑到电池的电量和自身的状态,从而决定是否要真正执行资源密集消耗型的操作。另外一个有价值的点是对充电的判断,确定设备是否处于充电状态。
* 最小化硬件使用。
* 在进行密集型任务前,检查电池电量和充电状态。
* 在电量低时,提示用户是否确定要执行任务,并在用户同意后在执行。
* 或提供设置选项,允许用户定义电量的阈值,以便在执行密集操作前提示用户。