Как сделать монитор AltBeacon в фоновом режиме, только если пользователь вошел в систему?

Я хочу поэкспериментировать с iBeacon на Android. Похоже, что AltBeacon — лучший инструмент для использования. Я читал, что если я подклассифицирую приложение своего приложения на это, я могу заставить свое приложение работать, даже если после этого приложение будет уничтожено.

Что делать, если я хочу, чтобы мое приложение контролировало только то, вошел ли пользователь в систему? Приложение будет запускаться при каждом запуске приложения, не так ли? Как запустить BootstrapNotifier в приложении после входа в систему и не запускать его, если пользователь не вошел в систему?

        @Override
        protected void onPostExecute(final Boolean success) {
            if (success) {
                //algorithm to make altbeacon run in the background, even after the app killed
            } else {
                //if failed
            }
        }

Итак, вот предлагаемое решение:

public class BeaconReferenceApplication extends Application implements BootstrapNotifier {

    // OTHER CODE

    public void onCreate() {
        super.onCreate();
        if (loggedin) {
            BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
            Region region = new Region("backgroundRegion", null, null, null);
            regionBootstrap = new RegionBootstrap(this, region);
            BeaconManager.getBeaconSimulator()).createTimedSimulatedBeacons();
        }
    }

    // OTHER CODE

}


public class LoginACtivity {

    // OTHER CODE

    public void onClick {

        if (username == TRUE && password == TRUE) {
            // SINCE THE USER LOGGED IN, HOW DO I MAKE MY APP TO START ALWAYS SCAN EVEN AFTER REBOOTING AS LONG THE USER ISN'T LOGGING OUT?
        }

    }

    // OTHER CODE

}

public class MainActivity {

    // OTHER CODE

    private void logout {

        // SINCE THE USER CLICK LOG OUT BUTTON, HOW DO I MAKE MY APP TO STOP SCANNING EVEN AFTER REBOOTING UNTIL THE USER LOGGING IN AGAIN?

    }

    // OTHER CODE

}

Гарантирует ли этот код, что мое приложение всегда будет сканировать маяк, только если пользователь вошел в систему, даже после перезагрузки, а приложение не запущено?


person stackex    schedule 20.03.2015    source источник
comment
Используйте SharedPreferences или boolean для хранения значения, когда пользователь вошел в систему. Если вы вошли в систему, начните отслеживать и обновлять значение SharedPreferences или это логическое значение.   -  person hrskrs    schedule 20.03.2015
comment
Итак, вы хотите автоматически сканировать маяки после загрузки, если пользователь ранее вошел в систему? Или вы хотите сканировать маяки только после загрузки, если пользователь снова войдет в систему после загрузки?   -  person davidgyoung    schedule 20.03.2015
comment
@davidgyoung Я хочу, чтобы мое приложение автоматически сканировало маяки после загрузки, если пользователь ранее входил в систему. Если пользователь ранее не входил в систему, я хочу, чтобы мое приложение не сканировало маяки. Итак, в основном я хочу, чтобы мое приложение сканировало ТОЛЬКО, если пользователь находится в состоянии входа в систему. Я уже использую SharedPreferences, чтобы отслеживать, вошел ли пользователь в систему или нет, поэтому, если пользователь уже вошел в систему ранее, приложение пропустит раздел входа в систему даже после перезагрузки.   -  person stackex    schedule 23.03.2015


Ответы (1)


Вам просто нужно обернуть код, создающий объект RegionBootstrap, чтобы проверить, входил ли пользователь в систему раньше. Если нет, то не строить.

Позже вы сможете отключить RegionBootstrap и восстановить его при необходимости. Как это:

public class BeaconReferenceApplication extends Application implements BootstrapNotifier {
  ...
  private RegionBootstrap regionBootstrap;

  public RegionBootstrap startBeaconMonitoring() {
    if (regionBootstrap == null) {
        Region region = new Region("backgroundRegion", null, null, null);
        regionBootstrap = new RegionBootstrap(this, region);          
    }
  }

  public RegionBootstrap stopBeaconMonitoring() {
    if (regionBootstrap != null) {
        regionBootstrap.disable();          
    }
  }

  public void onCreate() {
    super.onCreate();
    if (loggedin) {
       startBeaconMonitoring();
       ...
    }
}


public class MainActivity {
  ...
  private void logout() {
    ((BeaconReferenceApplication)this.getApplication()).stopBeaconMonitoring();
  }
  private void login() {
    ((BeaconReferenceApplication)this.getApplication()).startBeaconMonitoring();
  }

}
person davidgyoung    schedule 23.03.2015
comment
В классе BeaconReferenceApplication я проверил условие входа в систему из SharedPreferences. Но BeaconReferenceApplication запускается только один раз, когда пользователь запускает приложение, не так ли? Что, если после этого пользователь войдет в систему, как мне вызвать загрузчик, чтобы он всегда работал в фоновом режиме для сканирования маяка, даже после того, как приложение было убито? Выше я немного обновляю свой код. - person stackex; 24.03.2015
comment
Я расширил свой ответ выше, чтобы показать, как вы можете переключаться туда и обратно - person davidgyoung; 24.03.2015