使用 MessagingCenter 将字符串从 Android 项目发送到 PCL

Send string from Android project to PCL with MessagingCenter

这是我第一次 post 在这个论坛上,所以任何关于如何使问题更多 understandable/readable 等的提示都非常感谢。

我在做什么?

我正在使用 Xamarin Forms 制作我的第一个应用程序,我有两个项目,PCL(便携式 Class 库)和 Android。我的 Android 项目接收来自特定号码的传入短信并将其保存为字符串。我想要实现的是,通过使用 MessagingCenter,将字符串从我的 Android 项目发送到我的 PCL.

我的问题:

我已经看到很多与此相关的帖子,但我遗漏了一些东西。而且因为我是这个论坛的新手,所以我不能写评论,所以我必须创建自己的问题。让我向您展示一些代码。 (parsedsms 是包含短信的字符串)

SmsReceiver.cs(在我的 Android 项目中)

MessagingCenter.Send<SmsReceiver, string> (this, "ParsedSmsReceived", parsedsms);

MissionPage.xaml.cs(在我的 PCL 项目中)

MessagingCenter.Subscribe<SmsReceiver, string> (this, "ParsedSmsReceived",
(sender, arg) => 
{ 
    string message = arg; 
});

这是我在 Whosebug 上的另一个线程中找到的示例。我的问题是无法从 PCL 访问 parsedsms。如何从我的 PCL 访问 SmsReceiver class?您不能将 PCL 的引用(因为我猜它是一个库)添加到 Android,只能反过来。

正如@Jason 在评论中所写,解决方案是使用 Object 而不是 SmsReceiver,如下所示:

SmsReceiver.cs

MessagingCenter.Send<Object, string> (this, "ParsedSmsReceived", parsedsms);

MissionPage.xaml.cs

MessagingCenter.Subscribe<Object, string> (this, "ParsedSmsReceived",
(sender, arg) => 
{ 
    string message = arg; 
});

这很好用,但 MessagingCenter 是否真的是正确的方法是另一个问题。正如@Csharpest 评论的那样,使用 DependencyService 可能是更好的解决方案。

该界面可以更好地管理消息。

ISmsReceiver.cs 在 PCL

public interface ISmsReceiver {}

SmsReceiver.cs 在 Android

[assembly: Dependency(typeof(SmsReceiver ))]
namespace App1.MobileApp.Droid
{
    public class SmsReceiver : BroadcastReceiver, ISmsReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            MessagingCenter.Send<ISmsReceiver, string> (this, "ParsedSmsReceived", parsedsms);
        }
    }
}

MissionPage.xaml.cs 在 PCL

MessagingCenter.Subscribe<ISmsReceiver, string> (this, "ParsedSmsReceived",
(sender, arg) => 
{ 
    string message = arg; 
});