iPhone4 iOS5电池电量监控我需要添加setBatteryMonitoringEnabled:NO来定期进行电池检查吗?

Ale*_*one 3 objective-c power-management iphone-4 ios5

我正在运行一个应用程序,可以在一夜之间对加速计和陀螺仪数据进行采样.这是一个非常耗电的操作,我想教我的应用程序识别电池电量不足的时间.

这是我的原型代码,它每10分钟检查一次电池电量

NSDate* date = [NSDate date];
      if((int)([date timeIntervalSinceReferenceDate])%600 == 0)
            {
                UIDevice *myDevice = [UIDevice currentDevice];
                [myDevice setBatteryMonitoringEnabled:YES];
                float batLeft = [myDevice batteryLevel]; 
                int batinfo=(batLeft*100);

            [self postStatusMessageWithTitle:nil
                                 description:[NSString stringWithFormat:@"%@ battery level: %i",[dateFormat stringFromDate:dateShow],batinfo]];
                [myDevice setBatteryMonitoringEnabled:NO];
            }
Run Code Online (Sandbox Code Playgroud)

我的问题是:我是否需要将此行添加到代码的末尾:

[myDevice setBatteryMonitoringEnabled:NO];
Run Code Online (Sandbox Code Playgroud)

似乎在那里执行电池检查,没有异步委托调用.将值设置为NO可以节省电池,而无需在一夜之间监控电池电量吗?将它设置为NO可以解决任何问题吗?

谢谢你的任何输入!

Tad*_*rot 11

通常认为最好的做法是避免轮询,而是要求系统发出通知,如下所示:

[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
[[NSNotificationCenter defaultCenter]
        addObserver:self
           selector:@selector(batteryLevelUpdate)
               name:UIDeviceBatteryLevelDidChangeNotification
             object:nil];
Run Code Online (Sandbox Code Playgroud)

...... batteryLevelUpdate看起来像这样:

- (void)batteryLevelUpdate:(NSNotification *)notification
{
    // do whatever, using: [[UIDevice currentDevice] batteryLevel]
}
Run Code Online (Sandbox Code Playgroud)

来自UIDevice类参考:

电池电平变化的通知发送频率不超过每分钟一次.不要试图计算电池排水率或电池剩余时间; 排水率可能会频繁变化,具体取决于内置应用程序和应用程序.

每分钟一次比您的代码当前检查的频率高10倍,同时在CPU方面减少了更少的工作量.但是,它没有提到,更改的粒度会导致通知 - 发送的变化是0.01%,还是需要> 1%的变化?

要回答您的其他问题,如果您应该将其设置setBatteryMonitoringEnabledNO:如果您正在使用通知而不是手动轮询batteryStatus,则答案是您必须将其保留YES,否则可能会丢失通知.

Apple的官方BatteryStatus示例代码使用相同的电池状态报告.

还有一个UIDeviceBatteryStateDidChangeNotification它会通知你当设备放电(使用),充电或已充满电.