xamarin 如何从本地广播管理器接收广播消息?

cwdobuhd  于 2023-05-21  发布在  其他
关注(0)|答案(1)|浏览(192)

我在Android上使用Xamarin。我有一个广播接收器,它可以像这样抓住耳机上的按钮:

public class MyMediaButtonBroadcastReceiver : BroadcastReceiver
    {
        public string ComponentName { get { return Class.Name; } }

        private MediaMetadataRetriever reader = new MediaMetadataRetriever();

        public override void OnReceive(Context context, Intent intent)
        {
            if (intent.Action != Intent.ActionMediaButton)
                return;

            var keyEvent = (KeyEvent)intent.GetParcelableExtra(Intent.ExtraKeyEvent);

            switch (keyEvent.KeyCode)
            {
                case Keycode.Headsethook:
                    break;
                case Keycode.MediaPlay:
                    Toast.MakeText(Activity_Player.ctx, "PLAY", ToastLength.Short).Show();
                    break;
                case Keycode.MediaPlayPause:

                    break;
                case Keycode.MediaNext:
                    Toast.MakeText(Activity_Player.ctx, "NEXT", ToastLength.Short).Show();

                    break;
                case Keycode.MediaPrevious:
                    Toast.MakeText(Activity_Player.ctx, "Prev", ToastLength.Short).Show();

                    break;
            }
        }

现在,一旦headsethook被触发,我需要发送另一个本地广播到我的主活动。
这意味着,我需要在我的主活动中一个侦听器函数,现在可以在主活动中触发函数。但是我还没有找到任何关于如何接收本地广播的方法,只有如何发送广播。接下来我可以尝试什么?

编辑

[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionMediaButton })]
public class MyMediaButtonBroadcastReceiver : BroadcastReceiver
{
    public string ComponentName { get { return Class.Name; } }

    public override void OnReceive(Context context, Intent intent)
    {
        if (intent.Action != Intent.ActionMediaButton)
            return;

        var keyEvent = (KeyEvent)intent.GetParcelableExtra(Intent.ExtraKeyEvent);

        switch (keyEvent.KeyCode)
        {
            case Keycode.Headsethook:
                Activity_Player.Instance.PlayOrPauseLogic();
                break;
            case Keycode.MediaPlay:
                Toast.MakeText(Activity_Player.ctx, "PLAY", ToastLength.Short).Show();
                Activity_Player.Instance.PlayOrPauseLogic();
                break;
            case Keycode.MediaPlayPause:
                Activity_Player.Instance.PlayOrPauseLogic();
                break;
            case Keycode.MediaNext:
                Toast.MakeText(Activity_Player.ctx, "NEXT", ToastLength.Short).Show();
                if(Activity_Player.CurrentSongObject != null)
                    Activity_Player.Instance.ChooseRandomNewSongAndPlay(false);
                break;
            case Keycode.MediaPrevious:
                Toast.MakeText(Activity_Player.ctx, "Prev", ToastLength.Short).Show();
                if (Activity_Player.CurrentSongObject != null)
                    Activity_Player.mediaPlayer.SeekTo(0);
                break;
        }
    }

}
rbl8hiat

rbl8hiat1#

如何从本地广播管理器接收广播消息?
让我们假设您有一个名为ServiceBroadcastReceiver的BroadcastReceiver,它对Intent extra起作用。在这个例子中,如果我收到一个“播放”的意图额外的,我会做一些与该信息。
将其作为Activity的内部类:

[BroadcastReceiver]
public class ServiceBroadcastReceiver : BroadcastReceiver
{
    Context context;

    public ServiceBroadcastReceiver(Context context)
    {
       this.context = context;
    }
    public override void OnReceive(Context context, Intent intent)
    {
        if (intent.HasExtra("play"))
        {
           // sent a "play" cmd, do something.
           // context is your activity, you can call methods on it
           (context as SomeActivity)?.PlayReceived();
        }
    }
}

现在向接收器发送广播:

var intent = new Intent(Application.Context, typeof(ServiceBroadcastReceiver));
intent.PutExtra("play", true);
SendBroadcast(intent);

当“活动”正在运行时,您可以注册以接收以下广播:
在OnResume覆盖中,您可以创建/注册它:

// serviceBroadcastReceiver is a class level variable 
 serviceBroadcastReceiver = new ServiceBroadcastReceiver(this);
 RegisterReceiver(packageBroadcastReceiver, intentFilter);

OnPause覆盖中,取消注册并清理:

UnregisterReceiver(serviceBroadcastReceiver);
serviceBroadcastReceiver.Dispose();
serviceBroadcastReceiver = null;

相关问题