Onde ouvir para difusão de ação com MVVMCross
-
12-12-2019 - |
Pergunta
Fazendo a minha aplicação Bluetooth eu preciso ter acesso a alguns transmissão de acções no Android lado do meu código.
Tudo isso é executado no meu Core, então eu tenho um ViewModel que será chamada através de minha interface
public interface IConnectionService
{
//Properties
string IntentName { get; }
//Events
event EventHandler<SearchConnectionItemEventArgs> SearchItemFoundEvent;
//Methods
void RunIntent();
void SearchConnection();
void Connect(string macAddress);
}
RunIntent solicita que o usuário ligue o Bluetooth (Poderia ser de outra tecnologia) e eu gostaria então de ter um disparador de evento quando o Bluetooth estado é alterado
Android.Bluetooth.BluetoothAdapter.ActionStateChanged
E também quando eu procurar novos dispositivos que eu preciso
Android.Bluetooth.BluetoothDevice.ActionFound
Mas eu não posso colocar o Android.O tempo de execução.Registrar("ACTION_FOUND")] e [Android.O tempo de execução.Registrar("ACTION_STATE_CHANGED")] na minha classe, só funciona se eu tentar colocá-lo no meu ponto de Vista, mas, se eu faço o que eu preciso de lógica no meu ponto de vista?
É possível colocá-lo no núcleo de alguma forma?
Minha classe implementando minha interface
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
}
}
Solução
Isenção de responsabilidade:Eu não estou familiarizado com esta parte do Android - eu nunca usei a pilha de Bluetooth.
A partir da sua descrição parece que você já sabe a resposta - esses Atributos precisam ir em métodos dentro da Atividade/Vista.
É claro que, uma vez que eles foram adicionados à Atividade/Ver em seguida, é fácil para encaminhar essas chamadas de método através do ViewModel - basta usar o ViewModel
propriedade dentro da Vista.
É provavelmente mais fácil para tentar obter essa parte de seu trabalho como autônomo amostra em primeiro lugar e, em seguida, descobrir como fazer com que ele cross-platform e/ou mvvm.