Donde para escuchar la emisión de acciones con MVVMCross
-
12-12-2019 - |
Pregunta
Hacer que mi aplicación Bluetooth tengo acceso a algunos de emisión de acciones en el Android lado de mi código.
Todo esto se ejecuta en el Núcleo de mi, así que tengo un ViewModel que se llame a través de mi interfaz
public interface IConnectionService
{
//Properties
string IntentName { get; }
//Events
event EventHandler<SearchConnectionItemEventArgs> SearchItemFoundEvent;
//Methods
void RunIntent();
void SearchConnection();
void Connect(string macAddress);
}
RunIntent pide al usuario para activar la función Bluetooth (Podría ser de otra tecnología) y entonces me gustaría tener un desencadenador de eventos cuando el Bluetooth del estado es cambiado
Android.Bluetooth.BluetoothAdapter.ActionStateChanged
Y también cuando la búsqueda de nuevos dispositivos necesito
Android.Bluetooth.BluetoothDevice.ActionFound
Pero no puedo poner el [Android.En tiempo de ejecución.Registro("ACTION_FOUND")] y [Android.En tiempo de ejecución.Registro("ACTION_STATE_CHANGED")] en mi clase, esto sólo funciona si intento ponerlo en mi punto de Vista, pero si hago lo que necesito lógica en mi punto de vista?
Es posible ponerlo en el núcleo de alguna manera?
Mi clase de la aplicación de mi interfaz
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
}
}
Solución
Descargo de responsabilidad:No estoy familiarizado con esta parte de Android - yo nunca he usado el Bluetooth stack.
Desde su descripción suena como usted ya sabe la respuesta, estos Atributos deben ir en los métodos dentro de la Actividad/Vista.
Por supuesto, una vez que han sido agregados a la Actividad/Vista entonces es fácil ruta de estas llamadas al método a través del ViewModel - sólo tiene que utilizar el ViewModel
propiedad dentro de la Vista.
Es probablemente más fácil para tratar de conseguir que esta parte de su trabajo como independiente de la muestra de la primera y, a continuación, averiguar cómo hacerlo de la cruz-plataforma y/o mvvm.