2017-02-13 121 views
1

我遇到了一个问题,那就是这个线程的相反的问题:altbeacon如何让后台服务保持活跃状态​​?

AltBeacon not detect beacon when app is closed

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

该应用程序初始化实现接口的altbeacon的应用在应用程序级别如下(详细内容略)

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-信标码,它不是一个前台服务

@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-灯塔保持服务活着的时候,应用程序被杀害?

我想了解此功能的原因是,我写了类似的服务,但我只能把它做的工作为ALT信标,如果我把它包装成前景的服务。我尝试过的其他事情,只要应用程序关闭,服务就会被杀死。

谢谢。

回答

0

Android的灯塔库使用的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()); 
} 

这种设计保证,如果应用程序需要被终止由于内存不足,扫描会在重启5分钟未来。这允许电话时间完成内存密集型操作,同时仍然允许在合理的时间范围内检测信标。

相关问题