安卓信标库真的支持后台扫描吗?

6

我正在使用Android Beacon Library示例进行BLE扫描。在前台,无论是监视还是范围扫描都可以正常工作。但是,在后台中,当我从任务切换器中杀掉应用程序时,它仅适用于按下“Home”并且屏幕关闭的情况。在示例中,我找不到任何类似服务的东西可以使后台扫描正常工作。

问题:

  1. 如果应用程序在任务切换器中被杀死,Android Beacon Library是否支持后台扫描?
  2. 如果支持,如何实现?有示例吗?

1. Android Beacon Library在应用程序被杀死的情况下是否支持后台扫描? 2. 如果支持,如何实现?是否有示例?

在这种情况下,当应用程序未在后台运行时,您应该使用“广播接收器”和“服务”。为蓝牙连接(启动信标服务)和断开连接(停止信标服务)设置广播过滤器。 - Zubair Ahmed
尝试使用Estimote信标,它们有自己的SDK和实现。我制作了一个应用程序,在其中使用了这些信标,对于任何初学者来说,了解Android信标和BLE非常有用。从此链接https://github.com/Estimote/Android-SDK尝试此操作。 - Zubair Ahmed
1
@ZubairAhmadKhan iBeacon库可搜索Estimote信标以及自定义信标。 - Dhruv
3个回答

4

我曾经使用过 Android iBeacon 库,并为后台扫描创建了一个服务,在服务中定义了监控和范围。当程序销毁时,我启动了该服务并达到了预期效果。您也可以像这样创建新的服务。

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();
}
}

在 AndroidManifest.xml 中

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

你提到的"android iBeacon library"是不是和Android Beacon Library是同一个东西?能否请你通过一些代码示例来详细说明一下这个库的使用方法? - Rice
1
演示只展示了前台扫描,无法在后台工作。请建议您的服务需要绑定什么来完成此操作。谢谢。 - Rice
没问题,这是我的荣幸。 - Narendra Motwani

4
是的,即使应用程序被杀死,Android Beacon Library 也会继续检测信标,但是重新扫描可能需要一些时间。详情请参见此处: http://altbeacon.github.io/android-beacon-library/resume-after-terminate.html 该库使用AlarmManager来实现此功能,重新扫描可能需要最多五分钟的时间。
您链接的参考应用程序实际上有一个使用RegionBootstrap类设置此功能的示例。在此处的后台启动应用程序部分中,代码示例提供了更详细的示例:http://altbeacon.github.io/android-beacon-library/samples.html

我查看了这个并尝试了这个例子。但是我在应用程序被杀后无法看到它运作。(在杀死应用程序约30分钟后,我打开一个信标,但是应用程序没有扫描和通知) 你试过吗?能否提供更多关于如何做到这一点的细节? - Rice
1
Android 4.x 的默认后台扫描周期为每5分钟一次。因此,在从任务切换器中杀死应用程序后,可能需要五分钟才能恢复扫描服务,然后再等待最多五分钟才能开始主动扫描周期。您还可以尝试连接电源,因为这是触发扫描重新启动的第二种方式,如果闹钟失败的话。 - davidgyoung
我在想如果AlarmManager的最小限制是15分钟,那么如何在5分钟内重新启动扫描呢? - Parth Parekh
1
上面的评论是四年前写的,当时普遍适用,但现在只适用于Android 4-7。自那时以来,发布了阻止后台服务的Android 8。对于Android 8+,在应用程序被杀死后恢复扫描需要0-15分钟,与作业间隔相同。因此平均需要7.5分钟。 - davidgyoung
@davidgyoung,使用无限前台服务是否可以更快地进行搜索? - ruben

-2
1. 不会,其他应用也不行。通过任务切换器结束任务意味着杀死该应用程序的进程,而由于你的后台扫描依赖于服务,因此该服务也将被终止,因为服务不会启动自己的进程。 2. 你可以使用AlarmManager定期检查你的服务是否正在运行,并在未运行时自动启动它,但如果间隔设置得太短,这将严重影响电池寿命。

1
虽然从任务切换器中关闭一个应用确实会终止所有进程,但是通过各种技术手段,一个应用可以重新启动自身以便后台服务能够运行。Android Beacon Library就是利用AlarmManager来实现这一点的。请参考我上面的回答。 - davidgyoung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接