iPhone在后台运行周期性进程 - 电池优化方式

Posted

技术标签:

【中文标题】iPhone在后台运行周期性进程 - 电池优化方式【英文标题】:iPhone running periodical process in the background - battery optimized way 【发布时间】:2011-11-13 01:07:15 【问题描述】:

我想在后台运行特定任务。此任务需要几秒钟才能完成(它将一些 GPS 位置数据写入文件)。此任务应每 1 小时运行一次。

据我从 SDK 了解到,除非我永远运行定位服务,否则我无法在后台启动某些东西。当这个服务运行时,它会不时地给我一个事件,我可以在这些调用期间运行我的代码。我试过了,即使精度尽可能低,我的电池也很快没电了。

所以,我正在寻找一种每小时运行几秒钟定位服务的方法。其余时间我不想运行定位服务,也不想使用电池。

你能帮忙吗? 谢谢,

格纳

【问题讨论】:

【参考方案1】:

您实际上每小时都想知道什么?您是在尝试准确地确定位置,还是只是确定手机是否发生了明显移动? startMonitoringSignificantLocationChanges 会在手机“明显”移动时通知您(这通常意味着更换手机信号塔)。在城市中,这种情况经常发生。 startMonitoringForRegion:desiredAccuracy: 只会在您移出给定半径时通知您。

startMonitoringSignificantLocationChanges 相当便宜。它主要依赖于蜂窝天线,无论如何它通常都是打开的。如果它每小时触发一次以上,您总是可以跳过处理并返回。但不能保证您每小时会接到一次电话,尤其是在农村地区。

如果您是 VoIP 应用程序,那么您可以在运行代码时注册一个定期的“签入”间隔。但您不能对定位应用执行此操作。

您是否使用 Energy Diagnostics 工具分析了您的代码?什么是真正的吃时间和力量?你在咀嚼收音机、CPU、磁盘吗?

编辑

当应用终止时,重大更改仍会继续运行,并在 iPhone 顶部工具栏上的百分比旁边留下一个小的方向箭头图标。我的用户抱怨杀死应用程序后图标仍然存在

应用终止后,如果您注册了重大更改,您可能会重新启动以响应这些更改。如果您想在被终止的情况下取消注册,您可以将 stopMonitoring... 添加到您的 applicationWillTerminate: 方法中。这不保证会被调用,但这是一件好事,我相信如果用户直接终止您并且您没有被暂停(尚未测试),它将被调用。

同样,只要有小区覆盖,就电池寿命而言,重大的位置变化应该非常便宜。他们不应强制 GPS 保持开启状态。

【讨论】:

谢谢。我会看看这个。 我已经尝试过了,得出以下两个结论: 1. 与常规位置服务相反,重要位置更改服务不允许我在后台运行任务。 2. 没有办法关闭重要位置更改服务。即使应用程序被终止,它也始终保持开启状态。 您在 UIBackgroundModes 中有 location,但您不会因为位置发生重大变化而被唤醒?拨打stopMonitoringSignificantLocationChanges 不会取消您的注册? 1.我在后台模式中有位置。我确实会因为重大的位置变化而被吵醒。但是我无法在后台运行计时器并在此计时器触发时执行操作。与使用定位服务相反,计时器不会在后台触发(计时器会在后台触发)。 2. 如果我可以运行它,Stop 会注销我。但是如果我的应用程序被杀死,我将无法运行它。当应用程序终止时,重大更改仍会继续运行,并在 iPhone 顶部工具栏上的百分比旁边留下一个小的方向箭头图标。我的用户抱怨杀死应用程序后图标仍然存在【参考方案2】:

您最好的选择是使用重大的位置更改...这里有一些链接可以帮助您 -

http://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html

http://www.switchonthecode.com/tutorials/getting-your-location-in-an-iphone-application

http://longweekendmobile.com/2010/07/22/iphone-background-gps-accurate-to-500-meters-not-enough-for-foot-traffic/#more-480

【讨论】:

感谢您的回答。这正是我现在正在做的,也是我不想做的 :) 电池太多了。 好吧..如果您使用显着的位置变化,那么没有更好的方法来延长电池寿命...

以上是关于iPhone在后台运行周期性进程 - 电池优化方式的主要内容,如果未能解决你的问题,请参考以下文章

iphone - 使用 startMonitoringSignificantLocationChanges 和 desiredAccuracy 的电池

通过JNI的方式 android 防止进程被杀

通过JNI的方式 android 防止进程被杀

我想让一个app始终在后台运行,不被杀掉进程,怎么设置?

iphone - 每个组件的电池利用率

如何每小时在后台运行约 30 秒的进程(iphone 应用程序)