AltBeacon服务在单独的android进程中

AltBeacon服务在单独的android进程中,android,service,process,tags,altbeacon,Android,Service,Process,Tags,Altbeacon,我需要帮助。有一个Xamarin Android应用程序。在它内部,启动了一个与AltBeacon库一起工作的服务。 在这个服务中,创建了一个线程,其中信标不断地被扫描。服务已作为StartForeground(…)启动。 该服务应该持续运行,因此决定在单独的进程中运行,因为一段时间后android系统停止分配 内存和服务终止。 如果在一个进程中运行应用程序和服务,则一切正常。服务正常,信标被扫描。 但是只要我在一个单独的进程中运行它(使用process=:myProcess属性),扫描就不起作

我需要帮助。有一个Xamarin Android应用程序。在它内部,启动了一个与AltBeacon库一起工作的服务。 在这个服务中,创建了一个线程,其中信标不断地被扫描。服务已作为StartForeground(…)启动。 该服务应该持续运行,因此决定在单独的进程中运行,因为一段时间后android系统停止分配 内存和服务终止。 如果在一个进程中运行应用程序和服务,则一切正常。服务正常,信标被扫描。 但是只要我在一个单独的进程中运行它(使用process=:myProcess属性),扫描就不起作用了。 DidRangeBaconRegion方法不适用于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 });
            }
        }
公共类beaconworker:Java.Lang.Object,IBeaconConsumer
{
私有字符串[]guid;
私有只读上下文;
专用只读BeaconManager BeaconManager;
专用只读RangeNotifier RangeNotifier;
专用只读列表信标;
公共上下文应用程序上下文
{
获取{return context.ApplicationContext;}
}
公共BeaconsWorker(上下文,字符串[]GUID,int-scanTime)
{
...
this.context=上下文;
rangeNotifier=新的rangeNotifier();
beaconManager=beaconManager.GetInstanceForApplication(上下文);
信标管理器。在扫描周期(1000)之间设置foreground;
beaconManager.SetForegroundScanPeriod(1000);
beaconManager.SetBackgroundMode(假);
var beaconParser=新的beaconParser();
beaconParser.SetBeaconLayout(“…”);
beaconManager.BeaconParsers.Add(beaconParser);
rangeNotifier.DidRangeBeanConsincinRegionComplete+=OnBeaconsRanging;
beaconManager.SetRangeNotifier(rangeNotifier);
}
public bool BindService(Intent Intent、IServiceConnection serviceConnection、[GeneratedEnum]绑定标志)
{
返回context.BindService(intent、serviceConnection、标志);
}
beacerviceconnect()上的公共无效
{
foreach(beaconManager.RangedRegions.ToList()中的var区域)
站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长;
for(int i=0;i
可以将Android Beacon库设置为在单独的进程中运行。您可以在此处阅读基本配置说明:

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


上面链接的说明是为使用标准Java或Kotlin开发工具集以及Android Studio或Gradle构建的Android应用程序编写的。显然,需要对Xamarin进行修改才能使用Xamarin。因为我不是Xamarin专家,所以我很难提供更多帮助。

有什么想法吗?可能取决于Android权限?应用程序TIONG权限不适用于单独进程中的服务?方法OnBeaconServiceConnect调用Fine谢谢!但我在下面的回答中有更多问题。有什么想法吗?