【问题标题】:Send string from Android project to PCL with MessagingCenter使用 MessagingCenter 将字符串从 Android 项目发送到 PCL
【发布时间】:2020-03-19 21:44:42
【问题描述】:

这是我在这个论坛上的第一篇文章,所以任何关于如何使问题更易于理解/可读等的提示都非常感谢。

我在做什么?

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

我的问题:

我已经看到很多关于此的主题,但我缺少一些东西。而且因为我是这个论坛的新手,所以我不会写 cmets,所以我必须创建自己的问题。让我给你看一些代码。 (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; 
});

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

【问题讨论】:

  • 您应该使用 Xamarin.Forms DependencyService: developer.xamarin.com/guides/xamarin-forms/… 进入 android 项目。我认为您不需要 MessagingCenter(我总是尽量避免使用它,因为我认为它性能不佳,可能会导致内存泄漏,并且还表明您的整个方法可能会走错路)另外您应该发布 SmsReceiver.cs上课并解释在这种情况下 pcl 和 android 项目是如何协同工作的
  • 哇,真快。好吧,我会试试 DependencyService 看看我能不能解决这个问题。当我尝试过时,我会发布更新。我没有添加整个类的原因是有很多代码对于理解这个问题是不必要的。如果需要,我稍后会添加它。
  • 是的,从基本的角度来看,我认为你的代码应该主要在 pcl 中,你会在那里调用类似“DepencyService.Get().ReceiveSms();”的东西并在非 pcl 项目(android、ios、uwp 等)中实现 ISmsReceiver
  • 这应该可以。您可以在 Message 的签名中使用 Object 而不是 SmsReceiver 以避免未知类型问题。
  • @Jason,你说得对,它确实奏效了!今天早些时候我尝试了同样的事情,但我意识到我使用了“对象”而不是“对象”。呃......我会在有时间时编辑问题以包含解决方案。无论如何,谢谢你的帮助!

标签: c# xaml xamarin xamarin.forms messagingcenter


【解决方案1】:

正如@Jason 在 cmets 中所写,解决方案是使用 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 可能是一个更好的解决方案。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多