Уместно ли использовать DependencyService в указанном случае?

230
17 апреля 2022, 13:20

В решении Xamarin.Forms стоит следующая задача: необходимо реализовать систему, которая будет следить за подключением/отключением USB-устройств. Эта задача была мною решена с помощью BroadcastReceiver. Но во время реализации возник вопрос о том, каким же образом общий проект (Не Android) будет узнавать о том, что было подключено или отключено устройство. Проблема была решена с помощью DependencyService следующим образом: в общем проекте я создал следующий класс:

public interface IUsbReceiver
{
    event EventHandler UsbDeviceAttached;
    event EventHandler UsbDeviceDetached;
    void RegisterAttachReceiver();
    void RegisterDetachReceiver();
}

В последствии который наследовал и реализовал в Android-проекте:

[assembly: Dependency(typeof(MobileApp.Droid.Utils.UsbBroadcastReceiver))]
namespace MobileApp.Droid.Utils
{
    public class UsbBroadcastReceiver : IUsbReceiver
    {
        public event EventHandler UsbDeviceAttached;
        public event EventHandler UsbDeviceDetached;
        public UsbBroadcastReceiver() { }
        public void RegisterAttachReceiver()
        {
            UsbAttachBroadcastReceiver usbAttach = new UsbAttachBroadcastReceiver();
            IntentFilter intentAttached = new IntentFilter(UsbManager.ActionUsbDeviceAttached);
            MainActivity.CurrentActivity.RegisterReceiver(usbAttach, intentAttached);
            usbAttach.UsbDeviceAttached += UsbAttach_UsbDeviceAttached;
        }
        public void RegisterDetachReceiver()
        {
            UsbDetachBroadcastReceiver usbDetach = new UsbDetachBroadcastReceiver();
            IntentFilter intentDetached = new IntentFilter(UsbManager.ActionUsbDeviceDetached);
            MainActivity.CurrentActivity.RegisterReceiver(usbDetach, intentDetached);
            usbDetach.UsbDeviceDetached += UsbDetach_UsbDeviceDetached;
        }
        private void UsbDetach_UsbDeviceDetached(object sender, EventArgs e)
        {
            UsbDeviceDetached?.Invoke(this, e);
        }
        private void UsbAttach_UsbDeviceAttached(object sender, EventArgs e)
        {
            UsbDeviceAttached?.Invoke(this, e);
        }
    }
    public class UsbDetachBroadcastReceiver : BroadcastReceiver
    {
        public event EventHandler UsbDeviceDetached;
        public UsbDetachBroadcastReceiver() { }
        public override void OnReceive(Context context, Intent intent)
        {
            UsbDeviceDetached?.Invoke(this, new EventArgs());
        }
    }
    public class UsbAttachBroadcastReceiver : BroadcastReceiver
    {
        public event EventHandler UsbDeviceAttached;
        public UsbAttachBroadcastReceiver() { }
        public override void OnReceive(Context context, Intent intent)
        {
            UsbDeviceAttached?.Invoke(this, new EventArgs());
        }
    }
}

MainActivity.CurrentActivity - это просто статическое свойство в MainActivity.cs Droid-проекта:

    public static Activity CurrentActivity { get; private set; }

Которому я в OnCreate() присваиваю текущий экземпляр:

    CurrentActivity = this;

После реализации класса выше, в общем проекте, в App.xaml.cs, создал статическое свойство:

public static IUsbReceiver UsbReceiver { get; set; }

И в MainPage.xaml (страница содержимого в общем проекте) делаю следующее:

    protected override void OnAppearing()
    {
        base.OnAppearing();
        App.UsbReceiver = DependencyService.Get<IUsbReceiver>();
        App.UsbReceiver.RegisterAttachReceiver();
        App.UsbReceiver.RegisterDetachReceiver();
        App.UsbReceiver.UsbDeviceAttached += UsbReceiver_UsbDeviceAttached;
        App.UsbReceiver.UsbDeviceDetached += UsbReceiver_UsbDeviceDetached;
    }

И в методах UsbReceiver_UsbDeviceAttached и UsbReceiver_UsbDeviceDetached делаю свои необходимые действия. Всё работает. Но я уверен, что подобная реализация неправильная и нарушает правила. Кто-то может что-то посоветовать как можно поступить лучше? Здоровая критика очень приветствуется.

READ ALSO
Как скомпилировать файлы и папки в один .exe

Как скомпилировать файлы и папки в один .exe

Я экспортировал все внутриновсти спомощью dotPeek, получил папки и файлыМне нужно было немного подкоректировать код(добавить пару ссылок), я сделал...

126
Как работает передаваемый параметр index в Points

Как работает передаваемый параметр index в Points

Бьюсь весь день, не могу понять, как работает передаваемый параметр index в Points, а также, что выполняет данная строчка:

189
Почему приложение запускается при подключении устройства?

Почему приложение запускается при подключении устройства?

В XamarinForms при подключении USB-устройства у пользователя запрашивается разрешение на использование устройства

110
Есть ли в питоне что-то похожее на PictureBox из c#?

Есть ли в питоне что-то похожее на PictureBox из c#?

Есть ли в питоне что-то похожее на PictureBox из c#?

131