Android Beacon库真的支持后台扫描吗?

Android Beacon库真的支持后台扫描吗?,android,ibeacon,ibeacon-android,android-ibeacon,Android,Ibeacon,Ibeacon Android,Android Ibeacon,我使用的是BLE扫描。它在监测和测距方面前景良好。然而,对于后台,它只适用于在应用程序中按“主页”并关闭屏幕的情况。当我从任务切换程序中关闭应用程序时,它不起作用。在这个例子中,我找不到任何类似于服务的东西来让事情在后台工作 问题: 如果应用程序在任务切换程序中被杀死,Android Beacon库是否支持后台扫描 如果是,如何做到这一点?有什么例子吗 我使用安卓iBeaon库,在后台扫描中我创建了一个服务,在服务中我定义了监视和测距。我启动服务时,应用程序是distroy和它的工作为我。创建这

我使用的是BLE扫描。它在监测和测距方面前景良好。然而,对于后台,它只适用于在应用程序中按“主页”并关闭屏幕的情况。当我从任务切换程序中关闭应用程序时,它不起作用。在这个例子中,我找不到任何类似于服务的东西来让事情在后台工作

问题:

  • 如果应用程序在任务切换程序中被杀死,Android Beacon库是否支持后台扫描
  • 如果是,如何做到这一点?有什么例子吗
    我使用安卓iBeaon库,在后台扫描中我创建了一个服务,在服务中我定义了监视和测距。我启动服务时,应用程序是distroy和它的工作为我。创建这样的新服务

    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();
    }
    }
    
    公共类BeacConservice扩展服务实现IBeaconConsumer{
    private ArrayList arrayL=新的ArrayList();
    private BeaconServiceUtility beaconUtill=null;
    私有IBeaconManager IBeaconManager=IBeaconManager.getInstanceForApplication(此应用程序);
    私人手;
    私有可运行的运行;
    私有整数计数=30;
    @凌驾
    public-void-onibeacerviceconnect(){
    setRangeNotifier(新的RangeNotifier(){
    @凌驾
    public void DidRangeBeanConsignRegion(集合iBeacons,Region){
    arrayL.clear();
    arrayL.addAll((ArrayList)iBeacons);
    如果(计数>0){
    计数=0;
    }
    }
    });
    IBMeaconManager.setMonitorNotifier(新的MonitorNotifier(){
    @凌驾
    公共区域(区域){
    Log.e(“BeaconDetactorService”、“didEnterRegion”);
    //logStatus(“我第一次看到iBeacon!”);
    }
    @凌驾
    公共区域(区域){
    Log.e(“BeaconDetactorService”、“didExitRegion”);
    //logStatus(“我不再看到iBeacon”);
    }
    @凌驾
    公共无效不确定地区(国际州、地区){
    Log.e(“BeaconDetactorService”、“DidDeterminateStateforRegion”);
    //logStatus(“我刚从看到/没有看到iBeacons切换到:+state);
    }
    });
    试一试{
    iBeaconManager.StarTrangBeaconRegion(新区域(“MyRangUniqueId”,null,null,null));
    }捕获(远程异常){
    e、 printStackTrace();
    }
    试一试{
    iBeaconManager.startMonitoringBeaconsInRegion(新区域(“myMonitoringUniqueId”,null,null,null));
    }捕获(远程异常){
    e、 printStackTrace();
    }
    }
    @凌驾
    公共IBinder onBind(意图arg0){
    返回null;
    }
    @凌驾
    public void onCreate(){
    beaconUtill=新的BeaconServiceUtility(本);
    Log.e(“UUID”,“启动服务”);
    hand=新处理程序();
    runn=newrunnable(){
    @凌驾
    公开募捐{
    计数++;
    手动延迟(runn,1000);
    }
    };
    手持式邮政(runn);;
    super.onCreate();
    }
    @凌驾
    @不赞成
    公共无效启动(Intent Intent,int startId){
    onStart(iBeaconManager,this);
    beaconUtill=新的BeaconServiceUtility(本);
    super.onStart(intent,startId);
    }
    @凌驾
    公共空间{
    top(iBeaconManager,this);
    super.ondestory();
    }
    }
    
    在AndroidManifest.xml中

     <service android:name="com.beacone.keyfinder.app.Beaconservice" >
     </service>
    
    
    
  • 没有,其他任何应用程序也没有。通过task Switcher终止任务意味着终止该应用程序的进程,而且由于您的后台扫描依赖于某个服务,该服务也会被终止,因为服务不会启动自己的进程

  • 您可能有一个AlarmManager,它可以定期检查您的服务是否正在运行,如果没有,它会自动启动,但我可以想象,如果您将间隔设置得太低,这会严重影响电池


  • 是的,Android Beacon Library将在应用程序关闭后继续检测信标,但扫描恢复可能需要时间。详情请参见此处:

    该库使用AlarmManager来完成此操作,扫描可能需要5分钟才能恢复


    您链接到的参考应用程序实际上有一个示例,说明如何使用
    RegionBootstrap
    类进行设置。一个更具描述性的例子是在这里背景部分启动应用程序下的代码示例:

    在这种情况下,当应用程序不在后台运行时,您应该使用
    广播接收器
    服务
    。在蓝牙连接(为信标启动服务)和断开连接(为信标停止服务)上为您的广播设置
    过滤器
    。尝试
    Estimote
    信标。它们有自己的
    SDK
    和实现。我制作了一个应用程序,我在其中使用了这些工具,这对任何初学者了解Android信标和BLE都非常有用。从这个链接@ZubairAhmadKhan iBeacon Library搜索Estimote信标和自定义信标。你提到的“android iBeacon Library”和你提到的一样吗?你可以通过一些代码示例来分享你是如何做到这一点的吗?演示只是在前台显示扫描,不能在后台工作。请告知您的服务是如何完成的。谢谢。没问题。这是我的荣幸。虽然从任务切换器中删除应用程序确实会删除所有进程,但应用程序可以重新启动,以便后台服务可以使用各种技术运行。Android Beacon库通过AlarmManager实现了这一点。看我上面的答案。我确实看了一下,并尝试了这个例子。但我看不出它在应用程序被杀死后还能工作。(在关闭应用程序大约30分钟后,我打开了一个信号灯,但应用程序没有扫描并注意到)您是否尝试过,请提供有关如何执行此操作的更多详细信息?在Android 4.x上,默认背景扫描周期为每5分钟一次。所以在从t