2017-02-13 6 views
1

Я бегу в вопрос, который является противоположностью проблема этой нити:Как альтбекон поддерживает фоновый сервис?

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 

Однако, если я убить приложение или перезагрузить телефон, без каких-либо специальных передач или приложения разрешения, услуга альт-маяка возвращается живым. Другими словами, альт-маяк снова запускается сам. Обратите внимание, что у меня нет запущенных служб переднего плана. Вот скриншот приложения через несколько часов (и я перезагрузил телефон), со всеми приложениями закрыты. Вы можете видеть, что альт-маяк жив и просматривает маяки.

enter image description here но когда я смотрю на код альт-радиомаяка, это не служба переднего плана

@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.

Мой вопрос в том, как альт-маяк поддерживает обслуживание, когда приложение убито?

Причина, по которой я хочу понять эту функцию, заключается в том, что я пишу аналогичную услугу, но я могу только заставить ее работать в качестве альт-маяка, если я завершу ее в службу переднего плана. Все, что я пробовал, служба убивается, как только приложение закрывается.

спасибо.

ответ

0

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

Такая конструкция гарантирует, что если необходимо завершить из-за нехватки памяти приложение, сканирование будет перезагружен через пять минут в будущее. Это позволяет времени телефона завершить интенсивную работу с памятью, сохраняя при этом возможность обнаружения маяковых сигналов в разумные сроки.

Смежные вопросы