C# 无法在另一个事件处理程序(依赖项服务)内调用事件

C# 无法在另一个事件处理程序(依赖项服务)内调用事件,c#,xamarin.forms,C#,Xamarin.forms,我有以下问题。在下面的代码中,我有一个事件,我可以从GetSmSInbox()方法调用它,但在OnReceive()中,它不工作,因为它为null。订阅在主项目中完成。所以问题是为什么它为Null,以及如何从OnReceive()调用它。这是因为OnReceive是一个重写的方法,然后它将执行放在一个单独的踏板上 [assembly: Xamarin.Forms.Dependency(typeof(SmsBroadcastRceiver))] namespace SmsServiceApp.Dr

我有以下问题。在下面的代码中,我有一个事件,我可以从GetSmSInbox()方法调用它,但在OnReceive()中,它不工作,因为它为null。订阅在主项目中完成。所以问题是为什么它为Null,以及如何从OnReceive()调用它。这是因为OnReceive是一个重写的方法,然后它将执行放在一个单独的踏板上

[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不工作,但既然它正在工作,那就应该很好了。