Search code examples
androidibeaconibeacon-androidandroid-ibeacon

Does Android Beacon Library really support background scanning?


I am using Android Beacon Library for BLE scanning with example. It works fine in foreground for both monitoring and ranging. However, for background, it only works for the cases of pressing "Home" in app and screen off. It is not work when I kill the app from task switcher. In the example, I cannot find anything like Service to make things working in background.

Questions:

  1. Does Android Beacon Library support background scanning if the app is killed in task switcher?
  2. If so, how to do this? Any example?

Solution

  • I worked with android iBeaon library in that for background scanning I created a service and in service I defined both monitoring and ranging. I start the service when application is distroy and its work for me. Create new service like this.

    public class Beaconservice extends Service implements IBeaconConsumer {
    private ArrayList<IBeacon> arrayL = new ArrayList<IBeacon>();
    private BeaconServiceUtility beaconUtill = null;
    private IBeaconManager iBeaconManager = IBeaconManager.getInstanceForApplication(this);
    private Handler hand;
    private Runnable runn;
    private int count = 30;
    
    
    
    @Override
    public void onIBeaconServiceConnect() {
        iBeaconManager.setRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
                arrayL.clear();
                arrayL.addAll((ArrayList<IBeacon>) iBeacons);
                if(count>0){
                    count=0;    
                }
            }
        });
    
        iBeaconManager.setMonitorNotifier(new MonitorNotifier() {
            @Override
            public void didEnterRegion(Region region) {
                Log.e("BeaconDetactorService", "didEnterRegion");
                // logStatus("I just saw an iBeacon for the first time!");
            }
    
            @Override
            public void didExitRegion(Region region) {
                Log.e("BeaconDetactorService", "didExitRegion");
                // logStatus("I no longer see an iBeacon");
            }
    
            @Override
            public void didDetermineStateForRegion(int state, Region region) {
                Log.e("BeaconDetactorService", "didDetermineStateForRegion");
                // logStatus("I have just switched from seeing/not seeing iBeacons: " + state);
            }
    
        });
    
        try {
            iBeaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    
        try {
            iBeaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    
    }
    
    
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    @Override
    public void onCreate() {
        beaconUtill = new BeaconServiceUtility(this);
        Log.e("UUID","start service");
    
        hand = new Handler();
        runn = new Runnable() {
    
            @Override
            public void run() {
                count ++;
                hand.postDelayed(runn, 1000);
            }
        };
    
        hand.post(runn);
        super.onCreate();
    
    }
    @Override
    @Deprecated
    public void onStart(Intent intent, int startId) {
        beaconUtill.onStart(iBeaconManager, this);
        beaconUtill = new BeaconServiceUtility(this);
        super.onStart(intent, startId);
    }
    @Override
    public void onDestroy() {
        beaconUtill.onStop(iBeaconManager, this);
        super.onDestroy();
    }
    }
    

    In AndroidManifest.xml

     <service android:name="com.beacone.keyfinder.app.Beaconservice" >
     </service>