首页 > 解决方案 > 即使我添加了事件处理程序,Xamarin 自定义 BroadcastReceiver 事件也始终为空

问题描述

我正在使用 Xamarin 创建一个 Android 应用程序。基本上,该应用程序会检测传入的 SMS,如果发件人是特定号码,则 GUI 会得到更新。我创建了一个继承 BroadcastReceiver 并在适当的条件下引发事件的类,但事件始终为空,即使我订阅了一个在按钮单击事件中订阅时可以正常工作的方法(我在 MainActivity 中创建了此类的一个实例并在 OnCreate 方法中添加 EventHandler)经过研究,代码 EventHandler 为空似乎有点奇怪......我做错了什么?提前致谢!

广播接收器

[BroadcastReceiver(Exported = true, Enabled = true)]

[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED"}, Priority =(int)IntentFilterPriority.HighPriority)]

public class NewSMSReceived : BroadcastReceiver
{
    public event EventHandler SMSArrived;

    public override void OnReceive(Context context, Intent intent)
    {
        if (Android.Provider.Telephony.Sms.Intents.SmsReceivedAction.Equals(intent.Action))
        {

            var info_Intent = intent.Extras;

            if (info_Intent != null)
            {
                Java.Lang.Object[] pdus = (Java.Lang.Object[]) info_Intent.Get("pdus");

                var msg = SmsMessage.CreateFromPdu((byte[]) pdus[0]);

                var msg_from = msg.DisplayOriginatingAddress;

                if (msg_from == "xxxxxxxxxx")
                {

                    Toast.MakeText(Application.Context, "New message from Weather Station", ToastLength.Short).Show();

                    SMSArrived?.Invoke(this, EventArgs.Empty);
                }
            }
        }
    }
}

主要活动代码

public class MainActivity : AppCompatActivity
{
    private NewSMSReceived SMSNotificator = new NewSMSReceived();

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.activity_main);

        this.SMSNotificator.SMSArrived += new EventHandler(this.showNewData);
    }

    private void showNewData(object sender, EventArgs e)
    {
        //
    }
}

标签: c#androidxamarin

解决方案


我使用问题 Xamarin Android 的答案使其工作:从 Service 或 Receiver 更改 UI TextView 文本,@SushiHangover 的评论帮助我意识到了这个问题。使用 OnResume 方法注册 NewSMSReceived 的实例并使用 OnPause 方法取消注册它解决了这个问题(第一次尝试我没有删除 NewSMSReceived 的属性 IntentFilter 并且它没有工作)。代码修改如下:

[BroadcastReceiver(Exported = true, Enabled = true)]
public class NewSMSReceived : BroadcastReceiver
{
    public event EventHandler SMSArrived;
    //nothing changes

MainActivity 中的代码(实例仅初始化一次,事件在“OnCreate”方法订阅)

    protected override void OnResume()
    {
        base.OnResume();

        var NewSMS = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

        RegisterReceiver(this.SMSNotificator, NewSMS);


    }

    protected override void OnPause()
    {
        base.OnPause();

        UnregisterReceiver(this.SMSNotificator);

    }

推荐阅读