Wo Sie mit MvvmCross auf Broadcast-Aktionen hören können
-
12-12-2019 - |
Frage
Beim Erstellen meiner Bluetooth-Anwendung benötige ich Zugriff auf einige Broadcast-Aktionen auf der Android-Seite meines Codes.
All dies wird in meinem Kern ausgeführt, also habe ich ein ViewModel, das über meine Schnittstelle aufgerufen wird
public interface IConnectionService
{
//Properties
string IntentName { get; }
//Events
event EventHandler<SearchConnectionItemEventArgs> SearchItemFoundEvent;
//Methods
void RunIntent();
void SearchConnection();
void Connect(string macAddress);
}
RunIntent fordert den Benutzer auf, Bluetooth einzuschalten (könnte eine andere Technologie sein), und ich möchte dann einen Ereignisauslöser haben, wenn der Bluetooth-Status geändert wird
Android.Bluetooth.BluetoothAdapter.ActionStateChanged
Und auch wenn ich nach neuen Geräten suche, die ich brauche
Android.Bluetooth.BluetoothDevice.ActionFound
Aber ich kann das [Android.Laufzeit.Register("ACTION_FOUND")] und [Android.Laufzeit.Register ("ACTION_STATE_CHANGED")] In meiner Klasse funktioniert dies nur, wenn ich versuche, es in meine Ansicht aufzunehmen, aber wenn ich das tue, brauche ich Logik in meiner Ansicht?
Ist es möglich, es irgendwie in den Kern zu stecken?
Meine Klasse implementiert meine Schnittstelle
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
}
}
Lösung
Haftungsausschluss:Ich bin mit diesem Teil von Android nicht vertraut - ich habe den Bluetooth-Stack noch nie verwendet.
Aus Ihrer Beschreibung geht hervor, dass Sie die Antwort bereits kennen - diese Attribute müssen auf Methoden innerhalb der Aktivität / Ansicht angewendet werden.
Sobald sie der Aktivität / Ansicht hinzugefügt wurden, ist es natürlich einfach, diese Methodenaufrufe an das ViewModel weiterzuleiten - verwenden Sie einfach das ViewModel
eigentum innerhalb der Ansicht.
Es ist wahrscheinlich einfacher, zuerst zu versuchen, diesen Teil Ihrer Arbeit als eigenständiges Beispiel zu erhalten - und dann herauszufinden, wie Sie es plattformübergreifend und / oder mvvm machen können.