Как использовать Xamarin Android LocalBroadcastManager

Я искал способ отправить локальное сообщение в своем приложении и нашел руководство на веб-сайте Xamarin по широковещательным приемникам здесь, а точнее внизу веб-страницы, посвященной LocalBroadcastManager. Я следил за учебным пособием и несколько раз читал страницу, но мой класс BroadcastReceiver по-прежнему ничего не получает, когда я отправляю сообщение. Я ответил на множество вопросов, касающихся LocalBroadcastManager для Java, но не могу понять, чего не хватает для С#.

Это код, который запускает отправленное сообщение:

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));
    }
}

person Brooks Lindsey    schedule 19.07.2017    source источник


Ответы (2)


Есть две проблемы с этим кодом. Во-первых, вы должны зарегистрировать Receiver с помощью LocalBroadcastManager:

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

Должно быть

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

Во-вторых, Unregistering of Receiver также должен относиться к LocalBroadcastManager:

UnregisterReceiver(_dirtyMessageReceiver);

становится

LocalBroadcastManager.GetInstance(this).UnregisterReceiver(_dirtyMessageReceiver);
person Anders Martin    schedule 19.07.2017
comment
Ой... Я знал, что это что-то простое :/ Я предполагал, что регистрация/отмена регистрации широковещательных приемников, как я сделал, поймает все. Думаю нет. Спасибо! - person Brooks Lindsey; 19.07.2017

Вам нужно добавить для них широковещательный приемник. Например, установите для 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);
person yash darak    schedule 19.07.2017