AltBeaconLibrary в сервисе и отдельный процесс. Часть 2
Нужна помощь Спасибо Дэвиду за последний ответ на вопрос - сервис AltBeacon в отдельном андроид-процессе. Я пытаюсь реализовать на Android Xamarin - библиотеку AltBeacon в сервисе и в отдельном процессе. (Отдельный процесс нужен для того, чтобы сканирование работало постоянно, круглосуточно. Что бы андроид не обрезал сканирование через определенное время, после того как телефон перейдет в спящий режим). 1. Что я сделал после инструкций Дэвида - добавленные атрибуты в определении сервиса: [Service (Name = SERVICE_NAME, Process = ": myProcess", Enabled = true, Exported = false, IsolatedProcess = false)]
Установлена новая версия библиотеки - AltBeacon 2.11. На сегодняшний день Xamarin не имеет версии 2.11. Последняя версия 2.7 Я скачал собственную библиотеку AltBeacon v2.11 и обернул ее Managed Callable Wrappers (MCW). [( https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/)][1]. В результате я получил полную библиотеку на Xamarin. - Подключил эту библиотеку к проекту. Для тестирования я удалил атрибут Process: myProcess и запустил приложение. В одном процессе все работает хорошо. Служба работает и находит биконы. В совершенстве! Но - как только я запустил службу в другом процессе, я перестал получать биконы. После другого метода, который запускает это OnBeaconServiceConnect ().
public void OnBeaconServiceConnect ()
{ for (int i = 0; i < guids.Length; i++) { var uuid = Identifier.Parse(guids[i]); var region = new Region("R" + i, uuid, null, null); beaconManager.StartRangingBeaconsInRegion(region); } }
Оказывается, метод не работает в объекте Range Notifier =(
Примерный пример реализации сервиса:
public class myService:Service
{
private BeaconWorker beaconWorker;
public myService()
{
beaconWorker=new beaconWorker(DroidApplication.CurrentInstanceApp);
}
public void MainMethod()
{
var notification = ...Build();
StartForeground(s_id, notification);
while(true)
{
StartMainWork(guids)
}
}
public void StartMainWork(string guid)
{
beaconWorker.GetResult();
}
}
/////////////////////////////////////
public class BeaconWorker:IBeaconConsumer
{
List<Beacon> Beacons;
private Context context;
private RangeNotifier rangeNotifier;
private BeaconManager beaconManager;
//This is main configuring scanning
public BeaconWorker(Context context)
{
Context = context;
this.guids = ...;
rangeNotifier = new RangeNotifier();
BeaconManager.SetDebug(true);
beaconManager =
BeaconManager.GetInstanceForApplication(context);
beaconManager.SetForegroundBetweenScanPeriod(1000);
beaconManager.SetForegroundScanPeriod(1000);
beaconManager.SetBackgroundMode(false);
var beaconParser = new BeaconParser();
beaconParser.SetBeaconLayout("...");
beaconManager.BeaconParsers.Add(beaconParser);
beaconManager.SetRangeNotifier(rangeNotifier);
beaconManager.ApplySettings();
}
//Method that do bind
public void GetResult()
{
beaconManager.Bind(this);
Task.Wait(3000);
beaconManager.UnBind(this);
}
//Implement IBeaconConsumer BindService
public bool BindService(Intent p0, IServiceConnection p1, int p2)
{
return context.BindService(p0, p1, Bind.AutoCreate);
}
public void OnBeaconServiceConnect()
{
for (int i = 0; i < guids.Length; i++)
{
var uuid = Identifier.Parse(guids[i]);
var region = new Region("R" + i, uuid, null, null);
beaconManager.StartRangingBeaconsInRegion(region);
}
}
private class RangeNotifier
{
//THIS METHOD DOES NOT INVOKE =(
public void DidRangeBeaconsInRegion(ICollection<Beacon> beacons, Region region)
{
this.Beacons = beacons;
}
}
}
В логах телефона есть такая информация:
Time Device Name Type PID Tag Message
01-18 18:52:25.370 AGM A8 Warning 17056 BeaconManager Ranging/Monitoring may not be controlled from a separate BeaconScanner process. To remove this warning, please wrap this call in: if (beaconManager.isMainProcess())
Time Device Name Type PID Tag Message
01-18 18:52:25.370 AGM A8 Debug 17056 BeaconManager we have a connection to the service now
Time Device Name Type PID Tag Message
01-18 18:52:25.361 AGM A8 Debug 17056 BeaconManager consumer count is now: 1
Time Device Name Type PID Tag Message
01-18 18:52:25.363 AGM A8 Info 17024 BeaconService beaconService version 2.11 is starting up on the main process
Я знаю о проверке, которую Дэвид указал в ответе на метод IsMainProcess(). Но как я могу назвать эту проверку, если все это происходит в самом сервисе, а не в основном процессе приложения? Скажи мне, где я не прав. Что еще я могу добавить? В статье https://github.com/AltBeacon/android-beacon-library/pull/479 о том, насколько я понял, что бессмысленно указывать RangeNotifier в отдельном процессе. Это так? Буду благодарен за любую помощь! Спасибо!