altbeacon如何保持后台服务活着?

时间:2017-02-13 23:04:53

标签: android-service altbeacon beacon

我遇到的问题是这个帖子的相反问题:

AltBeacon not detect beacon when app is closed

我有一个使用altbeacon(http://altbeacon.org/

的应用

应用程序初始化实现应用程序级别接口的alt-beacon,如下所示(详细信息省略)

public class MyApp extends Application implements
    BootstrapNotifier,
    BeaconConsumer {
//some code
@Override
public void onCreate() {
    super.onCreate();
    initBeacons();
}
public void initBeacons() {
    mBackgroundPowerSaver = new BackgroundPowerSaver(this);
    org.altbeacon.beacon.BeaconManager altBeaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    altBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    // estimote
    altBeaconManager.setBackgroundScanPeriod(5000);
    altBeaconManager.setBackgroundBetweenScanPeriod(25000);
    mBeaconManager = MyBeaconManager.getInstance(this, altBeaconManager);
    mRegionBootstrap = new RegionBootstrap(this, MyBeaconManager.getRegions());
    altBeaconManager.bind(this);
}
@Override
public void onBeaconServiceConnect() {
    Thread thread = new Thread() {
        public void run() {
        // Try range the beacons
        rangeMyBeacons();
        }
    };
    thread.start();
}
@Override
public void didEnterRegion(Region region) {
    // Some code 
}
@Override
public void didExitRegion(Region region) {
    // Some code
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
    // Some code    
}
public class MyBeaconManager implements
    RangeNotifier {
// some code

但是,如果我终止应用程序或重新启动手机,没有任何特殊广播或应用权限,alt-beacon服务将恢复活跃状态。换句话说,Alt-beacon一直重新开始。请注意,我没有运行任何前台服务。这里'是几个小时后应用程序的屏幕截图(我重新启动了手机),关闭了所有应用程序。您可以看到alt-beacon处于活动状态并扫描信标。

enter image description here 但是,当我查看alt-beacon代码时,它不是前台服务

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    LogManager.i(TAG,
            intent == null ?
                    "starting with null intent"
                    :
                    "starting with intent " + intent.toString()
    );
    return super.onStartCommand(intent, flags, startId);
}

我在图书馆内进行了搜索,但看到没有点击START_REDELIVER_INTENT或START_STICKY。

我的问题是当应用程序被杀死时,alt-beacon如何使服务保持活动状态?

我想了解这个功能的原因是我正在编写类似的服务但是我只能将它作为alt-beacon工作,如果我将它包装到前台服务中。我试过的其他所有内容,只要应用程序关闭,服务就会被杀死。

谢谢。

1 个答案:

答案 0 :(得分:1)

Android Beacon Library使用AlarmManager来保持扫描服务在后台运行。它会在未来定期设置5分钟的警报,这会导致操作系统向其发送BroadcastIntent,如果停止,将启动扫描服务。运行时,库会不断重新安排此警报。

您可以在此处看到执行此操作的代码:

https://github.com/AltBeacon/android-beacon-library/blob/master/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java#L339

// In case we go into deep sleep, we will set up a wakeup alarm when in the background to kickoff
// off the scan cycle again
protected void setWakeUpAlarm() {
    // wake up time will be the maximum of 5 minutes, the scan period, the between scan period
    long milliseconds = 1000l * 60 * 5; /* five minutes */
    if (milliseconds < mBetweenScanPeriod) {
        milliseconds = mBetweenScanPeriod;
    }
    if (milliseconds < mScanPeriod) {
        milliseconds = mScanPeriod;
    }

    AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + milliseconds, getWakeUpOperation());
    LogManager.d(TAG, "Set a wakeup alarm to go off in %s ms: %s", milliseconds, getWakeUpOperation());
}

此设计可确保如果应用程序因内存不足而需要终止,则扫描将在未来五分钟内重新启动。这允许电话时间完成内存密集型操作,同时仍允许在合理的时间范围内进行信标检测。