Где слушать вещание действия с mvvmcross
-
12-12-2019 - |
Вопрос
Создание моего приложения Bluetooth, мне нужен доступ к некоторым вещательным действиям на стороне Android моего кода.
Все это запускается в моем ядре, поэтому у меня есть просмотр моделе, который позвонит через мой интерфейс
public interface IConnectionService
{
//Properties
string IntentName { get; }
//Events
event EventHandler<SearchConnectionItemEventArgs> SearchItemFoundEvent;
//Methods
void RunIntent();
void SearchConnection();
void Connect(string macAddress);
}
.
RONINTENT предложит пользователю включить Bluetooth (может быть другой технологией), и я бы тогда хотел бы иметь триггер события, когда состояние Bluetooth изменяется
Android.Bluetooth.BluetoothAdapter.ActionStateChanged
.
, а также когда я ищу новые устройства, которые мне нужны
Android.Bluetooth.BluetoothDevice.ActionFound
.
Но я не могу поставить [android.runtime.register ("action_found")] и [android.runtime.register ("action_state_changed")] На моем классе это работает только, если я стараюсь поставить его на мой взгляд,Но если я сделаю это, мне нужна логика на мой взгляд?
Можно ли поставить его в ядро как-то?
Мой класс, реализующий мой интерфейс
using System;
using Android.Bluetooth;
using Android.Content;
using Cirrious.MvvmCross.Android.Platform.Tasks;
using Test.Core.Interfaces;
using Test.Core.Models;
namespace Test.Core.Android
{
public class AndroidBluetooth : MvxAndroidTask, IConnectionService
{
#region Private Fields
private readonly BluetoothAdapter _bluetoothAdapter;
#endregion
#region Public Fields
#endregion
#region Properties
public string IntentName { get { return "Turn on Bluetooth"; }}
#endregion
#region Constructor
public AndroidBluetooth()
{
_bluetoothAdapter = BluetoothAdapter.DefaultAdapter;
}
#endregion
#region Events
public event EventHandler<SearchConnectionItemEventArgs> SearchItemFoundEvent;
private void ItemFound(SearchConnectionItemEventArgs e)
{
if(SearchItemFoundEvent != null)
{
SearchItemFoundEvent(this, e);
}
}
#endregion
#region Methods
public void RunIntent()
{
if (_bluetoothAdapter == null)
{
//No bluetooth support on phone
}
else if(!_bluetoothAdapter.IsEnabled)
{
var intent = new Intent(BluetoothAdapter.ActionRequestEnable);
StartActivity(intent);
}
}
public void SearchConnection()
{
if (_bluetoothAdapter == null)
{
//No bluetooth support on phone
}
else if (!_bluetoothAdapter.IsEnabled)
{
//Bluetooth not turned on
RunIntent();
}
else
{
FindBondedDevices();
}
}
private void FindBondedDevices()
{
var pairedDevices = _bluetoothAdapter.BondedDevices;
if (pairedDevices.Count <= 0) return;
foreach (var item in pairedDevices)
{
ItemFound(new SearchConnectionItemEventArgs {Name = item.Name, MacAddress = item.Address});
}
}
private void FindNewDevices()
{
if (_bluetoothAdapter == null)
{
}
else if (!_bluetoothAdapter.IsEnabled)
{
}
else
{
_bluetoothAdapter.StartDiscovery();
//Bind event for new devices
}
}
public void Connect(string macAddress)
{
}
#endregion
}
}
. Решение
Отказ от ответственности: Я не знаком с этой частью Android - я никогда не использовал стек Bluetooth.
Из вашего описания звучит так, как будто вы уже знаете ответ - эти атрибуты должны идти на методы в пределах действия / представления.
Конечно, после того, как они были добавлены к активности / представлению, то это легко сделать этот метод вызовы до ViewModel - просто используйте свойство ViewModel
в поле зрения.
Это, вероятно, проще попробовать получить эту часть вашей работы в качестве автономного образца первым - а затем выработать, как сделать его кроссплатформой и / или MVVM.