我使用altbeacon的Android Beacon Library进行背景接近扫描,以便在应用程序处于后台时进入我的信标范围时向用户显示通知。我已将其添加到我的应用程序文件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报告电池问题"每小时1%到2%的电池使用量"即使我不靠近任何信标。我已经在不同的扫描频率上进行了很多迭代,并且已经将问题隔离开来完全独立于didEnterRegion
中的实际情况,并且此时我已经把头发拉了出来。任何人都知道减少电池消耗的方法仍然会触发didEnterRegion
?
答案 0 :(得分:1)
您可以通过在BackgroundPowerSaver
中保留Application
的实例来节省一些电量。
import org.altbeacon.beacon.powersave.BackgroundPowerSaver;
public class MyApplication extends Application {
private BackgroundPowerSaver backgroundPowerSaver;
public void onCreate() {
super.onCreate();
backgroundPowerSaver = new BackgroundPowerSaver(this);
}
}
答案 1 :(得分:1)
您提到的每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 ,因为这将在前景和后台扫描周期之间自动切换您的应用。如果你不使用它,你将一直以前台速率扫描。