Отправить строку из проекта 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;
});