Как использовать Xamarin Android LocalBroadcastManager
Я искал способ отправить локальное сообщение в моем приложении и нашел здесь учебное руководство на веб-сайте Xamarin, посвященное широковещательным приемникам, в частности, внизу веб-страницы, посвященное LocalBroadcastManager. Я следовал этому руководству и несколько раз читал страницу, но мой класс BroadcastReceiver все еще не получает ничего, когда я отправляю сообщение. Я задал много вопросов, касающихся LocalBroadcastManager для Java, но, похоже, не могу понять, чего не хватает в 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 ответа
Есть два вопроса с этим кодом. Во-первых, вы должны использовать регистрацию Receiver с 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);
Для них необходимо добавить широковещательный приемник. Например, установите для 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);