使用 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;
});
这是我第一次 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;
});