背景扫描的电池问题
Battery issues with background scans
我正在使用 altbeacon 的 Android 信标库进行后台接近扫描,以便在应用程序处于后台时用户进入我的 1 个信标范围时向用户显示通知。我通过将此添加到我的应用程序文件的 onCreate
方法使其工作:
region = new Region("com.myapplication.identifier",
Identifier.parse(Constants.beaconUUID), null, null);
regionBootstrap = new RegionBootstrap(this, region);
beaconManager.setBackgroundScanPeriod(1000l);
beaconManager.setBackgroundBetweenScanPeriod(30000l);
我在 didEnterRegion
方法中有代码来确定该信标的范围并显示该位置的通知。我发现 30 秒是在穿过信标范围时仍能收到通知的最低可接受频率。我注意到,自从我添加此代码后,即使我不在任何信标附近,它也会导致 android 7.0 报告电池问题 "between 1% and 2% battery usage per hour"。我已经在不同的扫描频率上进行了大量迭代,并将问题完全独立于 didEnterRegion
中的实际内容,此时我正在拔头发。任何人都知道减少电池消耗并仍然触发 didEnterRegion
的方法吗?
您可以通过在 Application
中保留 BackgroundPowerSaver
的实例来节省一些电量。
import org.altbeacon.beacon.powersave.BackgroundPowerSaver;
public class MyApplication extends Application {
private BackgroundPowerSaver backgroundPowerSaver;
public void onCreate() {
super.onCreate();
backgroundPowerSaver = new BackgroundPowerSaver(this);
}
}
您提到的每 30 秒扫描 1 秒的占空比将使用大量电池:
beaconManager.setBackgroundScanPeriod(1000l);
beaconManager.setBackgroundBetweenScanPeriod(30000l);
库默认是在后台每5分钟(30000秒)扫描10秒。虽然两者都代表相同的 1/30 占空比,但开始和停止扫描 10 倍的频率会消耗更多的能量。 我会将扫描设置恢复为默认设置,如果可以节省更多电量,我什至会延长后台扫描周期。
了解在 Android 5+ 上,如果周围没有信标,即使在扫描周期之间,应用程序也会继续执行过滤后的低功率扫描。因此,如果在 5 秒内检测到信标,您仍然会收到回调。
在后台进行定期全功率扫描的唯一原因是 (a) Android 4.x 设备 (b) 没有蓝牙芯片支持低功率过滤的设备所有硬件过滤器都在使用的扫描或设备,以及 (c) 已知存在信标的情况,因此过滤后的后台扫描无法继续。
另外,@sunnySydeUp 在他的回答中提出的观点是正确的。 如果您还没有使用 BackgroundPowerSaver,您确实需要使用它,因为这将使您的应用程序在前台和后台扫描周期之间自动切换。如果你不使用它,你将一直以前台速率扫描。
我正在使用 altbeacon 的 Android 信标库进行后台接近扫描,以便在应用程序处于后台时用户进入我的 1 个信标范围时向用户显示通知。我通过将此添加到我的应用程序文件的 onCreate
方法使其工作:
region = new Region("com.myapplication.identifier",
Identifier.parse(Constants.beaconUUID), null, null);
regionBootstrap = new RegionBootstrap(this, region);
beaconManager.setBackgroundScanPeriod(1000l);
beaconManager.setBackgroundBetweenScanPeriod(30000l);
我在 didEnterRegion
方法中有代码来确定该信标的范围并显示该位置的通知。我发现 30 秒是在穿过信标范围时仍能收到通知的最低可接受频率。我注意到,自从我添加此代码后,即使我不在任何信标附近,它也会导致 android 7.0 报告电池问题 "between 1% and 2% battery usage per hour"。我已经在不同的扫描频率上进行了大量迭代,并将问题完全独立于 didEnterRegion
中的实际内容,此时我正在拔头发。任何人都知道减少电池消耗并仍然触发 didEnterRegion
的方法吗?
您可以通过在 Application
中保留 BackgroundPowerSaver
的实例来节省一些电量。
import org.altbeacon.beacon.powersave.BackgroundPowerSaver;
public class MyApplication extends Application {
private BackgroundPowerSaver backgroundPowerSaver;
public void onCreate() {
super.onCreate();
backgroundPowerSaver = new BackgroundPowerSaver(this);
}
}
您提到的每 30 秒扫描 1 秒的占空比将使用大量电池:
beaconManager.setBackgroundScanPeriod(1000l);
beaconManager.setBackgroundBetweenScanPeriod(30000l);
库默认是在后台每5分钟(30000秒)扫描10秒。虽然两者都代表相同的 1/30 占空比,但开始和停止扫描 10 倍的频率会消耗更多的能量。 我会将扫描设置恢复为默认设置,如果可以节省更多电量,我什至会延长后台扫描周期。
了解在 Android 5+ 上,如果周围没有信标,即使在扫描周期之间,应用程序也会继续执行过滤后的低功率扫描。因此,如果在 5 秒内检测到信标,您仍然会收到回调。
在后台进行定期全功率扫描的唯一原因是 (a) Android 4.x 设备 (b) 没有蓝牙芯片支持低功率过滤的设备所有硬件过滤器都在使用的扫描或设备,以及 (c) 已知存在信标的情况,因此过滤后的后台扫描无法继续。
另外,@sunnySydeUp 在他的回答中提出的观点是正确的。 如果您还没有使用 BackgroundPowerSaver,您确实需要使用它,因为这将使您的应用程序在前台和后台扫描周期之间自动切换。如果你不使用它,你将一直以前台速率扫描。