package org.altbeacon.beacon.powersave; import android.annotation.TargetApi; import android.app.Activity; import android.app.Application; import android.content.Context; import android.os.Bundle; import org.altbeacon.beacon.BeaconManager; import org.altbeacon.beacon.logging.LogManager; /** * * Simply creating an instance of this class and holding a reference to it in your Application can * improve battery life by 60% by slowing down scans when your app is in the background. * */ @TargetApi(18) public class BackgroundPowerSaver implements Application.ActivityLifecycleCallbacks { private static final String TAG = "BackgroundPowerSaver"; private BeaconManager beaconManager; private int activeActivityCount = 0; /** * * Constructs a new BackgroundPowerSaver * * @param context * @deprecated the countActiveActivityStrategy flag is no longer used. * */ public BackgroundPowerSaver(Context context, boolean countActiveActivityStrategy) { this(context); } /** * * Constructs a new BackgroundPowerSaver using the default background determination strategy * * @param context */ public BackgroundPowerSaver(Context context) { if (android.os.Build.VERSION.SDK_INT < 18) { LogManager.w(TAG, "BackgroundPowerSaver requires API 18 or higher."); return; } beaconManager = BeaconManager.getInstanceForApplication(context); ((Application)context.getApplicationContext()).registerActivityLifecycleCallbacks(this); } @Override public void onActivityCreated(Activity activity, Bundle bundle) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { activeActivityCount++; if (activeActivityCount < 1) { LogManager.d(TAG, "reset active activity count on resume. It was %s", activeActivityCount); activeActivityCount = 1; } beaconManager.setBackgroundMode(false); LogManager.d(TAG, "activity resumed: %s active activities: %s", activity, activeActivityCount); } @Override public void onActivityPaused(Activity activity) { activeActivityCount--; LogManager.d(TAG, "activity paused: %s active activities: %s", activity, activeActivityCount); if (activeActivityCount < 1) { LogManager.d(TAG, "setting background mode"); beaconManager.setBackgroundMode(true); } } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { } @Override public void onActivityDestroyed(Activity activity) { } }