C# 无法在另一个事件处理程序(依赖项服务)内调用事件
我有以下问题。在下面的代码中,我有一个事件,我可以从GetSmSInbox()方法调用它,但在OnReceive()中,它不工作,因为它为null。订阅在主项目中完成。所以问题是为什么它为Null,以及如何从OnReceive()调用它。这是因为OnReceive是一个重写的方法,然后它将执行放在一个单独的踏板上C# 无法在另一个事件处理程序(依赖项服务)内调用事件,c#,xamarin.forms,C#,Xamarin.forms,我有以下问题。在下面的代码中,我有一个事件,我可以从GetSmSInbox()方法调用它,但在OnReceive()中,它不工作,因为它为null。订阅在主项目中完成。所以问题是为什么它为Null,以及如何从OnReceive()调用它。这是因为OnReceive是一个重写的方法,然后它将执行放在一个单独的踏板上 [assembly: Xamarin.Forms.Dependency(typeof(SmsBroadcastRceiver))] namespace SmsServiceApp.Dr
[assembly: Xamarin.Forms.Dependency(typeof(SmsBroadcastRceiver))]
namespace SmsServiceApp.Droid
{
[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
public class SmsBroadcastRceiver : BroadcastReceiver , ISmsReader
{
SmsBroadcastRceiver()
{
}
public event EventHandler<OnSmsReceivedEventArgs> OnSmsReceive;
public void GetSmsInbox()
{
//Toast.MakeText(Application.Context, "Tess Dependency", ToastLength.Long).Show();
OnSmsReceive?.Invoke(this, new OnSmsReceivedEventArgs("Test"));
}
public override void OnReceive(Context context, Intent intent)
{
var msgs = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
foreach (var msg in msgs)
{
OnSmsReceive?.Invoke(this, new OnSmsReceivedEventArgs(msg.DisplayMessageBody));
// Toast.MakeText(Application.Context, msg.DisplayMessageBody, ToastLength.Short).Show();
}
}
}
[程序集:Xamarin.Forms.Dependency(typeof(smsbroadcastceiver))]
名称空间SmsServiceApp.Droid
{
[BroadcastReceiver(Enabled=true,Exported=true)]
[IntentFilter(新[]{“android.provider.Telephony.SMS_RECEIVED”}]
公共类SMSBroadcastReceiver:BroadcastReceiver、ISmsReader
{
SMSBroadCastReceiver()
{
}
公共事件事件处理程序OnSmsReceive;
public void GetSmsInbox()
{
//MakeText(Application.Context,“Tess Dependency”,ToastLength.Long).Show();
OnSmsReceive?.Invoke(这是新的OnSmsReceivedEventArgs(“测试”));
}
公共覆盖void OnReceive(上下文、意图)
{
var msgs=Telephony.Sms.Intents.GetMessagesFromIntent(intent);
foreach(msg中的var msg)
{
OnSmsReceive?.Invoke(这是新的OnSmsReceivedEventArgs(msg.DisplayMessageBody));
//Toast.MakeText(Application.Context,msg.DisplayMessageBody,ToastLength.Short).Show();
}
}
}
}
接口实现
public interface ISmsReader
{
void GetSmsInbox();
event EventHandler<OnSmsReceivedEventArgs> OnSmsReceive;
}
公共接口ISmsReader
{
void GetSmsInbox();
事件处理程序OnSmsReceive;
}
订阅
public MainPage()
{
InitializeComponent();
pullRequestButton.Clicked += delegate {
Xamarin.Forms.DependencyService.Get<ISmsReader>().GetSmsInbox();
};
Xamarin.Forms.DependencyService.Get<ISmsReader>().OnSmsReceive += OnSmsReceived;
}
private void OnSmsReceived(object sender, OnSmsReceivedEventArgs e)
{
editorSms.Text = e.MSG;
}
public主页()
{
初始化组件();
pullRequestButton.Clicked+=委托{
Xamarin.Forms.DependencyService.Get().GetSmsInbox();
};
Xamarin.Forms.DependencyService.Get().OnSmsReceive+=OnSmsReceived;
}
私有void OnSmsReceived(对象发送方,OnSmsReceivedEventArgs e)
{
editorSms.Text=e.MSG;
}
首先,我们讨论从OnReceive()调用它的问题。
如果您想阅读短信,请添加以下权限
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.BROADCAST_SMS" />
这里是MySmsReader的
[assembly: Xamarin.Forms.Dependency(typeof(MySmsReader))]
namespace ScanDemo.Droid
{
public class MySmsReader : ISmsReader
{
public void GetSmsInbox()
{
IntentFilter filter = new IntentFilter();
filter.AddAction("android.provider.Telephony.SMS_RECEIVED");
SmsBroadcastRceiver receiver = new SmsBroadcastRceiver();
Application.Context.RegisterReceiver(receiver, filter);
// RegisterReceiver(receiver, filter);
}
}
}
下面是关于接口的代码
public interface ISmsReader
{
void GetSmsInbox();
}
这是前台代码
<Button Text="open broadcase" Clicked="Button_Clicked"/>
<Label x:Name="editorSms"/>
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();
}
背景代码
<Button Text="open broadcase" Clicked="Button_Clicked"/>
<Label x:Name="editorSms"/>
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();
}
public主页()
{
初始化组件();
MessagingCenter.Subscribe(此“MyMessage”,(费用)=>
{
列表mylist=费用作为列表;
字符串allText=“”;
foreach(mylist中的字符串项)
{
allText+=项目+“”;
}
editorSms.Text=所有文本;
});
}
已单击私有无效按钮(对象发送者,事件参数e)
{
Xamarin.Forms.DependencyService.Get().GetSmsInbox();
}
这是一个关于我的演示的运行GIF。
这是我的演示:,我没有实现它的运行时任务,您应该手动授予Permission。由于MessagingCenter正在工作,仍然不理解为什么With event不工作,但既然它正在工作,那就应该很好了。