C# 将变量值从Xamarin.Android传递到Xamarin.Forms
我在Xamarin.Android中收到消息,我需要将其传递给Xamarin.Forms应用程序。我现在想到的是依赖注入。我已经定义了接口:C# 将变量值从Xamarin.Android传递到Xamarin.Forms,c#,xamarin.forms,dependency-injection,xamarin.android,C#,Xamarin.forms,Dependency Injection,Xamarin.android,我在Xamarin.Android中收到消息,我需要将其传递给Xamarin.Forms应用程序。我现在想到的是依赖注入。我已经定义了接口: public interface IReceived { event OnReceived Received; } 及其在继承自BroadcastReceiver的IncomingSms类中的实现,用于消息侦听 [assembly: Dependency(typeof(XxmsApp.Api.IncomingSms))] namespace Xx
public interface IReceived
{
event OnReceived Received;
}
及其在继承自BroadcastReceiver的IncomingSms类中的实现,用于消息侦听
[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?.Invoke(XMessages)收到的代码>始终为null
。在我的主应用程序Xamarin.Forms中,我无法捕捉事件(消息即将到来的时刻)
如何做到这一点?同意Jason的说法,您可以使用MessagingCenter
来实现这一点。以下是SMSBroadcastReceiver
[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
public class SmsBroadcastRceiver : BroadcastReceiver
{
public SmsBroadcastRceiver()
{
}
public override void OnReceive(Context context, Intent intent)
{
var msgs = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
List<string> msgList = new List<string>();
foreach (var msg in msgs)
{
msgList.Add(msg.DisplayMessageBody);
}
MessagingCenter.Send<List<string>>(msgList, "MyMessage");
}
}
[BroadcastReceiver(已启用=真,已导出=真)]
[IntentFilter(新[]{“android.provider.Telephony.SMS_RECEIVED”}]
公共类SMSBroadcastReceiver:BroadcastReceiver
{
公共SMSBroadCastReceiver()
{
}
公共覆盖void OnReceive(上下文、意图)
{
var msgs=Telephony.Sms.Intents.GetMessagesFromIntent(intent);
List msgList=新列表();
foreach(msg中的var msg)
{
msgList.Add(msg.DisplayMessageBody);
}
MessagingCenter.Send(msgList,“MyMessage”);
}
}
您可以接收PCL背景代码中的消息
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
MessagingCenter.Subscribe<List<string>>(this, "MyMessage", (expense) =>
{
List<string> mylist= expense as List<string>;
string allText= "";
foreach (string item in mylist)
{
allText += item+" ";
}
editorSms.Text = allText;
});
}
private void Button_Clicked(object sender, EventArgs e)
{
Xamarin.Forms.DependencyService.Get<ISmsReader>().GetSmsInbox();
}
}
[DesignTimeVisible(false)]
公共部分类主页:ContentPage
{
公共主页()
{
初始化组件();
MessagingCenter.Subscribe(此“MyMessage”,(费用)=>
{
列表mylist=费用作为列表;
字符串allText=“”;
foreach(mylist中的字符串项)
{
allText+=项目+“”;
}
editorSms.Text=所有文本;
});
}
已单击私有无效按钮(对象发送者,事件参数e)
{
Xamarin.Forms.DependencyService.Get().GetSmsInbox();
}
}
这是我的跑步记录
下面是代码演示代码(注意:我没有获得运行时权限,您应该手动添加权限)
使用MessagingCenter@Jason谢谢我往这边看
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
MessagingCenter.Subscribe<List<string>>(this, "MyMessage", (expense) =>
{
List<string> mylist= expense as List<string>;
string allText= "";
foreach (string item in mylist)
{
allText += item+" ";
}
editorSms.Text = allText;
});
}
private void Button_Clicked(object sender, EventArgs e)
{
Xamarin.Forms.DependencyService.Get<ISmsReader>().GetSmsInbox();
}
}