[英]Pass variable values from Xamarin.Android to Xamarin.Forms
我在 Xamarin.Android 中收到消息,我需要將其傳遞給 Xamarin.Forms 應用程序。 我現在想到的是依賴注入。 我已經定義了接口:
public interface IReceived
{
event OnReceived Received;
}
及其在 IncomingSms 類中的實現從 BroadcastReceiver 繼承,用於消息偵聽
[assembly: Dependency(typeof(XxmsApp.Api.IncomingSms))]
namespace XxmsApp.Api
{
// [BroadcastReceiver(Enabled = true, Exported = true)]
[BroadcastReceiver(Enabled = true, Label = "SMS Receiver")]
[IntentFilter(new string [] { Telephony.Sms.Intents.SmsReceivedAction })] // "android.provider.Telephony.SMS_RECEIVED"
public class IncomingSms : BroadcastReceiver, IReceived
{
public event OnReceived Received;
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action != Telephony.Sms.Intents.SmsReceivedAction) return;
SmsMessage[] messages = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
OnMessagesReiceved(messages);
}
private void OnMessagesReiceved(SmsMessage[] messages)
{
var smsMesages = new List<(string Address, string Message)>();
var XMessages = new List<XxmsApp.Model.Message>();
for (var i = 0; i < messages.Length; i++)
{
smsMesages.Add((messages[i].OriginatingAddress, messages[i].MessageBody));
XMessages.Add(new XxmsApp.Model.Message
{
Address = messages[i].OriginatingAddress,
Value = messages[i].MessageBody
});
}
Received?.Invoke(XMessages);
}
}
}
我已經訂閱了Received
事件
public App()
{
DBUpdates();
MainPage = (new MasterDetailPage()
{
Master = new MenuPage { Title = "Title" },
Detail = new NavigationPage(new XxmsApp.MainPage()) { BarBackgroundColor = Color.Black }
});
xMessages = DependencyService.Get<XxmsApp.Api.IReceived>();
xMessages.Received += XMessages_Received;//*/
}
private void XMessages_Received(IEnumerable<Model.Message> message)
{
// ...
}
它的工作沒有一些錯誤。 但是當提出行Received?.Invoke(XMessages);
Received 始終為null
。 而且我無法在我的主應用程序 Xamarin.Forms 中捕捉到事件(消息到來的時刻)
怎么能做到這一點?
同意 Jason,您可以使用MessagingCenter
來實現它。 這是SmsBroadcastRceiver
代碼
[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
public class SmsBroadcastRceiver : BroadcastReceiver
{
public SmsBroadcastRceiver()
{
}
public override void OnReceive(Context context, Intent intent)
{
var msgs = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
List<string> msgList = new List<string>();
foreach (var msg in msgs)
{
msgList.Add(msg.DisplayMessageBody);
}
MessagingCenter.Send<List<string>>(msgList, "MyMessage");
}
}
您可以在 PCL 后台代碼中接收消息。
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
MessagingCenter.Subscribe<List<string>>(this, "MyMessage", (expense) =>
{
List<string> mylist= expense as List<string>;
string allText= "";
foreach (string item in mylist)
{
allText += item+" ";
}
editorSms.Text = allText;
});
}
private void Button_Clicked(object sender, EventArgs e)
{
Xamarin.Forms.DependencyService.Get<ISmsReader>().GetSmsInbox();
}
}
這是我的跑步 gif。
這是代碼演示代碼(注意:我沒有實現運行時權限,您應該手動添加權限)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.