Я получаю сообщения в Xamarin. Android и мне нужно передать его в приложение Xamarin.Forms. На данный момент я придумал инъекцию зависимостей. Я определил интерфейс:
public interface IReceived
{
event OnReceived Received;
}
И его реализация внутри класса IncomingSms, унаследованного от BroadcastReceiver для прослушивания сообщений
[assembly: Dependency(typeof(XxmsApp.Api.IncomingSms))]
namespace XxmsApp.Api
{
// [BroadcastReceiver(Enabled = true, Exported = true)]
[BroadcastReceiver(Enabled = true, Label = "SMS Receiver")]
[IntentFilter(new string [] { Telephony.Sms.Intents.SmsReceivedAction })] // "android.provider.Telephony.SMS_RECEIVED"
public class IncomingSms : BroadcastReceiver, IReceived
{
public event OnReceived Received;
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action != Telephony.Sms.Intents.SmsReceivedAction) return;
SmsMessage[] messages = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
OnMessagesReiceved(messages);
}
private void OnMessagesReiceved(SmsMessage[] messages)
{
var smsMesages = new List<(string Address, string Message)>();
var XMessages = new List<XxmsApp.Model.Message>();
for (var i = 0; i < messages.Length; i++)
{
smsMesages.Add((messages[i].OriginatingAddress, messages[i].MessageBody));
XMessages.Add(new XxmsApp.Model.Message
{
Address = messages[i].OriginatingAddress,
Value = messages[i].MessageBody
});
}
Received?.Invoke(XMessages);
}
}
}
И я подписался на событие Received
public App()
{
DBUpdates();
MainPage = (new MasterDetailPage()
{
Master = new MenuPage { Title = "Title" },
Detail = new NavigationPage(new XxmsApp.MainPage()) { BarBackgroundColor = Color.Black }
});
xMessages = DependencyService.Get<XxmsApp.Api.IReceived>();
xMessages.Received += XMessages_Received;//*/
}
private void XMessages_Received(IEnumerable<Model.Message> message)
{
// ...
}
Работает без ошибок. Но когда подняли линию Received?.Invoke(XMessages);
Получено всегда null
. И я не могу поймать событие (момент прихода сообщения) в моем основном приложении Xamarin.Forms
Как это сделать?