【问题标题】:Pass variable values from Xamarin.Android to Xamarin.Forms将变量值从 Xamarin.Android 传递到 Xamarin.Forms
【发布时间】:2020-03-30 13:32:15
【问题描述】:

我在 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 中捕捉到事件(消息的时刻)

如何做到这一点?

【问题讨论】:

标签: c# xamarin.forms dependency-injection xamarin.android


【解决方案1】:

同意 Jason,你可以使用MessagingCenter 来实现它。这是SmsBroadcastRceiver中的代码

    [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");
        }
    }

您可以在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();
        }
    }

这是我的跑步动图。

这里是代码演示代码(注:我没有实现运行时权限,你应该手动添加权限)。

https://github.com/851265601/BroadcastReceSMS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多