【问题标题】:AltBeacon service in separate android processAltBeacon 服务在单独的 android 进程中
【发布时间】:2018-01-05 10:48:53
【问题描述】:

我需要帮助。有一个适用于 Xamarin Android 的应用程序。在其中,启动了一个与 AltBeacon 库一起使用的服务。 在此服务中,创建了一个线程,其中不断扫描信标。服务以 StartForeground(...) 开始。 该服务应该持续工作,因此决定在一个单独的进程中运行它,因为一段时间后 android 系统停止分配 内存和服务终止。 如果您在一个进程中运行应用程序和服务,则一切正常。服务工作,信标被扫描。 但是,一旦我在单独的进程中运行它(使用 Process =: myProcess 属性),扫描不起作用。 DidRangeBeaconsInRegion 方法不适用于 IRangeNotifier 实现对象。 它根本不起作用,没有例外。 简要代码库:

public class BeaconsWorker : Java.Lang.Object, IBeaconConsumer
    {
 private string[] guids;



        private readonly Context context;
        private readonly BeaconManager beaconManager;
        private readonly RangeNotifier rangeNotifier;
        private readonly List<BeaconEntry> beacons;



        public Context ApplicationContext
        {
            get { return context.ApplicationContext; }
        }


        public BeaconsWorker(Context context, string[] guids, int scanTime)
        {
            ...
            this.context = context;         
            rangeNotifier = new RangeNotifier();
            beaconManager = BeaconManager.GetInstanceForApplication(context);
            beaconManager.SetForegroundBetweenScanPeriod(1000);
            beaconManager.SetForegroundScanPeriod(1000);
            beaconManager.SetBackgroundMode(false);
            var beaconParser = new BeaconParser();
            beaconParser.SetBeaconLayout("...");
            beaconManager.BeaconParsers.Add(beaconParser);
            rangeNotifier.DidRangeBeaconsInRegionComplete += OnBeaconsRanging;
            beaconManager.SetRangeNotifier(rangeNotifier);


        }


        public bool BindService(Intent intent, IServiceConnection serviceConnection, [GeneratedEnum] Bind flags)
        {
            return context.BindService(intent, serviceConnection, flags);
        }

        public void OnBeaconServiceConnect()
        {

            foreach (var region in beaconManager.RangedRegions.ToList())
                beaconManager.StopRangingBeaconsInRegion(region);

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

        }

        public void UnbindService(IServiceConnection serviceConnection)
        {
            context.UnbindService(serviceConnection);
        }


        public async Task<BeaconEntry> GetLocationResult()
        {

            beaconManager.Bind(this);
            await Task.Delay(scanTime * 1000);         
            beaconManager.Unbind(this);
            ...

            return result;
        }


        private void OnBeaconsRanging(object sender, RangeEventArgs e)
        {

            lock (beacons)
                foreach (var item in e.Beacons)
                {
                    var beacon = new BeaconEntry()
                    {
                        BeaconGUID = item.Id1.ToString(),
                        BeaconMajor = Int32.Parse(item.Id2.ToString()),
                        BeaconMinor = Int32.Parse(item.Id3.ToString())
                    };

                    beacons.Add(beacon);
                }  
        }


        private class RangeEventArgs : EventArgs
        {
            public Region Region { get; set; }

            public ICollection<Beacon> Beacons { get; set; }
        }

        private class RangeNotifier : Java.Lang.Object, IRangeNotifier
        {
            public event EventHandler<RangeEventArgs> DidRangeBeaconsInRegionComplete;

            public void DidRangeBeaconsInRegion(ICollection<Beacon> beacons, Region region)
            {

                OnDidRangeBeaconsInRegion(beacons, region);
            }

            private void OnDidRangeBeaconsInRegion(ICollection<Beacon> beacons, Region region)
            {                
                DidRangeBeaconsInRegionComplete?.Invoke(this, new RangeEventArgs { Beacons = beacons, Region = region });
            }
        }

【问题讨论】:

  • 有什么想法吗?可能取决于android权限吗?应用程序权限不适用于单独进程中的服务?
  • 方法 OnBeaconServiceConnect 调用很好

标签: android service process tags altbeacon


【解决方案1】:

可以将 Android 信标库设置为在单独的进程中运行。您可以在此处阅读基本配置说明:

https://github.com/AltBeacon/android-beacon-library/pull/479

此多进程设置已通过库版本 2.11 成功测试。然而,2.12 版包含了大量的返工以支持 Android 8,而且我还没有测试 2.12+ 版的多进程支持,因此请谨慎使用这些版本。最好的选择是使用 2.11 版本。

上面链接的说明是为使用标准 Java 或 Kotlin 开发工具集和 Android Studio 或 Gradle 构建的 Android 应用编写的。显然需要进行修改才能使其与 Xamarin 一起使用。由于我不是 Xamarin 专家,因此很难提供更多帮助。

【讨论】:

  • 谢谢!但我在下面的回答中有更多问题。有什么想法吗?
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多