Отправить строку из проекта Android в PCL с MessagingCenter

Это мой первый пост на этом форуме, поэтому любые советы о том, как сделать вопрос более понятным / читабельным и так далее, приветствуются.

Что я делаю?

Я делаю свое первое приложение с использованием форм Xamarin, и у меня есть два проекта, PCL (Portable Class Library) и Android. Мой проект Android получает входящие SMS с определенного номера и сохраняет его в строку. Я пытаюсь добиться того, чтобы с помощью MessagingCenter отправлять строку из моего проекта Android на мой PCL.

Моя проблема:

Я видел много тем по этому поводу, но кое-что мне не хватает. И поскольку я новичок в этом форуме, я не могу писать комментарии, поэтому мне нужно создать свой собственный вопрос. Позвольте мне показать вам часть кода. (parsedsms это строка, содержащая SMS)

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

Это пример, который я нашел в другом потоке здесь, на Stackru. Моя проблема в том что parsedsms недоступен из PCL. Как я могу получить доступ к классу SmsReceiver с моего PCL? Вы не можете добавить ссылку из PCL (потому что это библиотека, я думаю) в Android, только наоборот.

1 ответ

Решение

Как писал @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; 
});
Другие вопросы по тегам