c# - 即使我添加了事件处理程序,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)
{
//
}
}
解决方案
我使用问题 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);
}
推荐阅读
- typescript - 如何使用 arrayUnion 更新地图中的数组?
- php - 数据库参考图像上传错误的文件名存储
- powershell - robocopy 将文件夹的内容从本地更新到生产
- r - R闪亮拉丝点表空白NA行
- java - 如何在 java servlet 中以正确的方式执行此命令
- gmail-api - 在 MailApp.sendEmail 中将其他附件 blob 包含到现有邮件附件中
- android - Android:如何制作默认拨号器应用程序?
- virtual-reality - 是否有可探索的虚拟现实场景的术语?
- php - 我正在尝试在 Ultimate Membership Pro 中查找当前登录的用户信息
- node.js - "Object.defineProperty(exports, "__esModule", { value: true });" 在 FunctionFile 中阻止函数执行