如何使用Xamarin Android本地广播管理器(LocalBroadcastManager)

3
我一直在寻找一种方法来发送应用程序内部的本地消息,并在Xamarin网站上找到了有关Broadcast Receivers的教程,具体内容在这里(链接),特别是网页底部关于LocalBroadcastManager的部分。我按照教程进行操作并阅读了几遍该页面,但当我发送一条消息时,我的BroadcastReceiver类仍然没有接收到任何内容。我遇到了许多关于java中LocalBroadcastManager的问题,但似乎无法弄清楚C#缺少什么。
这是触发发送消息的代码:
Intent intent = new Intent("dirty");
intent.PutExtra("dirtyAppCount", dirtyAppCount);
LocalBroadcastManager.GetInstance(Context).SendBroadcast(intent);

在OnResume()方法中,这里是我注册接收器的地方:

_dirtyMessageReceiver = new DirtyBroadcastReceiver();
RegisterReceiver(_dirtyMessageReceiver, new IntentFilter("dirty"));

在OnPause()中取消注册接收器:

UnregisterReceiver(_dirtyMessageReceiver);

这是我的接收器类:

[BroadcastReceiver(Enabled = true, Exported = false)]
public class DirtyBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        int dirtyAppCount = intent.GetIntExtra("dirtyAppCount", 0);
        OnMessageReceived?.Invoke(this, new MessageArgs(dirtyAppCount));
    }
}
2个回答

3

这段代码有两个问题。首先,你应该使用LocalBroadcastManager注册接收器:

 _dirtyMessageReceiver = new DirtyBroadcastReceiver();
RegisterReceiver(_dirtyMessageReceiver, new IntentFilter("dirty"));

应该是这样的

 _dirtyMessageReceiver = new DirtyBroadcastReceiver();
 LocalBroadcastManager.GetInstance(this).RegisterReceiver(_dirtyMessageReceiver, new IntentFilter("dirty"));

其次,取消注册接收器也应该针对LocalBroadcastManager进行操作:
UnregisterReceiver(_dirtyMessageReceiver);

成为

LocalBroadcastManager.GetInstance(this).UnregisterReceiver(_dirtyMessageReceiver);

啊...我知道这只是一些简单的问题 :/ 我以为像我这样注册/注销广播接收器的方式可以捕获所有东西。看来不是这样。谢谢! - Brooks Lindsey

0
你需要为这些添加广播接收器。例如,将Android.Content.Intent设置为ActionTimeTick,这样Android操作系统就会在时间更改时广播消息(即Android意图)。
[BroadcastReceiver(Enabled = true)]
    [IntentFilter(new[] { Android.Content.Intent.ActionTimeTick })]
    public class GridStartBroadcastReceiver : BroadcastReceiver
    {
        public static readonly string GRID_STARTED = "GRID_STARTED";
        public override void OnReceive(Context context, Intent intent)
        {
           if (intent.Action == GRID_STARTED)
            {
         //your logic
            }
        }
    }

你需要先注册广播接收器。将以下代码添加到oncreate方法中以注册广播接收器。

IntentFilter filter = new IntentFilter(GridStartBroadcastReceiver.GRID_STARTED);
            filter.AddCategory(Intent.CategoryDefault);
            _receiver = new GridStartBroadcastReceiver();
            RegisterReceiver(_receiver, filter);

接下来将广播发送到广播接收器。

//calling
                    Intent BroadcastIntent = new Intent(this, typeof(MainActivity.GridStartBroadcastReceiver));
                    BroadcastIntent.SetAction(MainActivity.GridStartBroadcastReceiver.GRID_STARTED);
                    BroadcastIntent.AddCategory(Intent.CategoryDefault);
                    SendBroadcast(BroadcastIntent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接