2015-02-20 5 views
0

В эталонном приложении RegionBootstrap инициализируется в пользовательского класса приложения на это OnCreate метод и, конечно, класс приложения вызывается перед какой-либо деятельности, называется.Поздняя инициализация RegionBootstrap

Есть ли способ инициализировать RegionBootstrap внутри действия? Я уже пытался создать статическую переменную RegionBootstrap, поэтому я могу назвать ее в другом виде, но, к сожалению, она не работает.

BeaconApplication.regionBootstrap = new RegionBootstrap((BootstrapNotifier) this.getApplication(), downloadedBeacons); 

В Регионы, которые я должен быть инициализирован придет от сервера, поэтому инициализация RegionBootstrap не должна исходить из класса приложения.

* EDIT *

public class LoginActivity extends ActionBarActivity { 
    … 
    /*** short version ***/ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     /*** after successful login ***/ 
     BeaconApplication.beacons = downloadBeaconsFromServer();  
    } 
} 

public class BeaconActivity extends ActionBarActivity { 
    … 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     … 
     startService(new Intent(this, BeaconService.class)); 
    } 
} 

Это где я реализовал BeaconConsumer

public class BeaconService extends Service implements BeaconConsumer { 
    private BeaconManager beaconManager; 
    private BeaconNotifier beaconNotifier; 
    private RegionBootstrap regionBootstrap; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i(TAG, "onCreate"); 
     beaconManager = BeaconManager.getInstanceForApplication(this); 
     beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
     beaconManager.setBackgroundBetweenScanPeriod(1001); 
     beaconManager.setBackgroundScanPeriod(101); 
     beaconManager.setForegroundScanPeriod(101); 
     beaconManager.setForegroundBetweenScanPeriod(1001); 
     beaconNotifier = new BeaconNotifier(this); 
     beaconManager.bind(this); 
    } 

    @Override 
    public void onBeaconServiceConnect() { 
     beaconManager.setMonitorNotifier(beaconNotifier); 
     monitorBeacons(); 

     regionBootstrap = new RegionBootstrap(beaconNotifier, BeaconApplication.beacons); 
    } 

    private void monitorBeacons() { 
     for (Region beacon : BeaconApplication.beacons) { 
      try { 
       Log.i(TAG, "Monitoring beacon " + beacon.getUniqueId()); 
       beaconManager.startMonitoringBeaconsInRegion(beacon); 
      } catch (RemoteException e) { 
       Log.e(TAG, "Monitoring beacon failed"); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Реализация BeaconNotifier

public class BeaconNotifier implements BootstrapNotifier { 
    private Context context; 

    public BeaconNotifier(Context context) { 
      this.context = context; 
    } 

    @Override 
    didEnter.. etc 

    @Override 
    public Context getApplicationContext() { 
      return context; 
    } 
} 

ответ

1

Вы можете использовать:

BeaconManager.setMonitorNotifier(MonitorNotifier); 
BeaconManager.startMonitoringBeaconsInRegion(Region); 

Но не забывайте, что для использования методов BeaconManager вы должны подождать, пока не будет подключен BeaconService. Помните, что с помощью этих методов вам необходимо создать свой собственный сервис, если вы хотите контролировать маяки, даже если приложение будет убито.

Btw, помню, как только я столкнулся с проблемой RegionBootstrap. Я использовал трюк, чтобы справиться с этой проблемой. Можете ли вы проверить следующий код?

... 
BeaconManager.bind(yourConsumer); 
... 
//wait until BeaconConsumer.onBeaconServiceConnect() is called 
//write following code inside of onBeaconServiceConnect 
RegionBootstrap dummy = new RegionBootstrap(mBootstrapNotifier, new Region("dummy", null, null, null)); 
dummy.disable(); 
//after this point you can create your own RegionBootstrap 

Существует ключевой момент здесь, что вам нужно, чтобы создать свой собственный BootstrapNotifier. Если вы делаете это в деятельности, вы можете сделать это:

public class YourActivity extends Activity implements BootstrapNotifier { 
    ... 
    BootstrapNotifier mBootstrapNotifier = this; 
    ... 

Или в Application классе:

public class YourApp extends Application implements BootstrapNotifier { 
    ... 
    BootstrapNotifier mBootstrapNotifier = this; 
    ... 

В моем случае, я создал адаптер и адаптер требует Context в его конструктор, и я использовал, что адаптер, как BootstrapNotifier:

public class AltBeaconAdapter implements BootstrapNotifier { 
    private Context mContext; 
    ... 

    public AltBeaconAdapter(Context context) { 
     mContext = context; 
     ... 
    } 

    @Override 
    public Context getApplicationContext() { 
     return mContext; 
    } 

    ... 
} 

Кроме того, вы должны реализовать MonitorNotifier методы, поскольку BootstrapNotifier является подклассом MonitorNotifier.

Да, этот трюк странный, и он показывает, что в библиотеке есть ошибка с инициализацией RegionBootstrap, но у меня есть сервис, поэтому я переключился на первый метод, который я вам предлагал. Если этот трюк работает и для вас, сообщите мне, чтобы я мог создать проблему на странице GitHub библиотеки.

+0

Будут ли эти методы открывать приложение из фона и контролировать маяки даже после того, как андроид убивает приложение, как указано здесь? http: //altbeacon.github.io/android-beacon-library/resume-after-terminate.html – user158335

+0

Я обновил свой ответ, пожалуйста, проверьте его и сообщите мне, если он сработает для вас. –

+0

РегионBootstrap нуждается в двух аргументах, а не только в Регионе, как указано в моем вопросе. Я попробовал этот 'RegionBootstrap dummy = новый RegionBootstrap ((BootstrapNotifier) ​​getApplicationContext(), новый Region (" dummy ", null, null, null)) ;, но я получил эту ошибку _java.lang.ClassCastException: com.tektosworld.ibeaconmobileapp. BeaconApplication не может быть передан в org.altbeacon.beacon.startup.BootstrapNotifier_. Это та самая ошибка, с которой я столкнулся, когда я не ставил BootstrapNotifier внутри класса Application. – user158335