Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将变量值从Xamarin.Android传递到Xamarin.Forms_C#_Xamarin.forms_Dependency Injection_Xamarin.android - Fatal编程技术网

C# 将变量值从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

我在Xamarin.Android中收到消息,我需要将其传递给Xamarin.Forms应用程序。我现在想到的是依赖注入。我已经定义了接口:

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();
        }
    }