Функция фонового сканирования iBeacon PRO библиотеки RadiusNetworks?

Я использую API RadiusNetworks для работы с iBeacons.

Я использовал эту библиотеку, и она отлично работает, однако я должен спросить, что я делаю неправильно, что фоновое сканирование не происходит в моем приложении? Что мне не хватает?

Вот реализация, которая у меня есть до сих пор, я сохранил только код, относящийся к стороне маяка, однако установка активности в фоновом режиме полностью останавливает сканирование...

package ro.gebs.zonizbeacon;



public class MainActivity extends FragmentActivity
        implements NavigationDrawerFragment.NavigationDrawerCallbacks, SearchView.OnQueryTextListener, IBeaconConsumer, RangeNotifier, IBeaconDataNotifier {
    /**
     * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
     */
    private NavigationDrawerFragment mNavigationDrawerFragment;
    private MainOffersFragment mOffersFragment;

    protected static final String TAG = "BeaconActivity";
    private IBeaconManager iBeaconManager = IBeaconManager.getInstanceForApplication(this);


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //getActionBar().setIcon(R.drawable.home);
        setContentView(R.layout.activity_main);



        BeaconUtils.verifyBluetooth(MainActivity.this);
        iBeaconManager.bind(this);
    }




    @Override
    protected void onDestroy() {
        super.onDestroy();
        iBeaconManager.unBind(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (iBeaconManager.isBound(this)) iBeaconManager.setBackgroundMode(this, true);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (iBeaconManager.isBound(this)) iBeaconManager.setBackgroundMode(this, false);

    }


    @Override
    public void onIBeaconServiceConnect() {
        Region region = new Region("MainActivityRanging", null, null, null);
        try {
            iBeaconManager.startRangingBeaconsInRegion(region);
            iBeaconManager.setRangeNotifier(this);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void iBeaconDataUpdate(IBeacon iBeacon, IBeaconData iBeaconData, DataProviderException e) {
        if (e != null) {
            Log.d(TAG, "data fetch error:" + e);
        }
        if (iBeaconData != null) {
            String displayString = iBeacon.getProximityUuid() + " " + iBeacon.getMajor() + " " + iBeacon.getMinor() + "\n" + "Welcome message:" + iBeaconData.get("welcomeMessage");
            Log.d(TAG, displayString);
        }
    }

    @Override
    public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
        for (IBeacon iBeacon : iBeacons) {
            iBeacon.requestData(this);
            String displayString = iBeacon.getProximityUuid() + " " + iBeacon.getMajor() + " " + iBeacon.getMinor() + "\n";
            Log.d(TAG, displayString);
        }
    }
}

person Adrian Olar    schedule 17.01.2014    source источник


Ответы (1)


Как вы отправляете свою активность в фоновый режим? Вы нажимаете кнопку «Назад», кнопку «Домой» или что?

Я подозреваю, что происходит то, что Android фактически завершает работу вашего приложения. Ваш метод onDestroy выглядит так:

@Override
protected void onDestroy() {
    super.onDestroy();
    iBeaconManager.unBind(this);
}

Если Android вызовет этот метод, iBeaconManager отвяжется от AndroidIBeaconService, эффективно остановив сканирование. Даже если вы удалите этот код, Android все равно автоматически завершит службу, если решит закрыть приложение.

Если вы хотите, чтобы это работало в фоновом режиме, вам нужно прикрепить IBeaconManager к чему-то, что имеет более длительный жизненный цикл, чем это действие. Проще всего это сделать с помощью пользовательского класса приложения Android, подобного этому (который также должен быть объявлен в вашем манифесте):

public class MyTestIBeaconApplication extends Application {
    private BackgroundPowerSaver backgroundPowerSaver;
    private IBeaconManager iBeaconManager;

    public void onCreate() {
        super.onCreate();
        // Simply constructing this class and holding a reference to it 
        // enables auto battery saving of about 60%
        backgroundPowerSaver = new BackgroundPowerSaver(this);
        iBeaconManager = IBeaconManager.getInstanceForApplication(this);
    }
}

Часть BackgroundPowerSaver (только в Pro-версии библиотеки) является необязательной, но автоматически снижает частоту сканирования, когда ваше приложение находится в фоновом режиме, для экономии заряда батареи. Если вы используете это, вам больше не нужно делать вызовы setBackgroundMode в ваших различных методах onPause и onResume.

person davidgyoung    schedule 17.01.2014
comment
Спасибо за ответ, действительно полезные советы и классная библиотека! :) - person Adrian Olar; 18.01.2014