Android - получить ссылку на BroadcastReceiver, определенный в Manifest

Есть ли способ, как получить ссылку на BroadcastReceiver, определенный в Manifest.xml из кода?

В моем случае мы используем BroadcastReceiver, который должен быть включен в Manifest.xml. Однако он обладает функциональностью, которую я хотел бы использовать из нашего кода. Поэтому вместо создания другого подобного BroadcastReceiver и создания его экземпляра из кода я хотел бы получить ссылку на существующий.

Дополнительная информация:

Моя цель - подписаться на событие на моем BroadcastReceiver из моей деятельности - событие, которое я хотел бы использовать повторно - вместо создания другого экземпляра этого получателя в своей деятельности я хотел бы получить ссылку на существующий.

 Jakub Holovsky18 июл. 2016 г., 11:58
@MikeM. Не могли бы вы опубликовать это как ответ, именно то, что я искал.
 Mike M.18 июл. 2016 г., 11:49
Класс Receiver, зарегистрированный в манифесте, не имеет постоянно существующего экземпляра. Новый экземпляр создается каждый раз, когда ему нужно обработать трансляцию. Если вы хотите использовать тот же класс в вашемActivityпросто создай свойnew экземпляр, и зарегистрируйте его динамически.

Ответы на вопрос(2)

Решение Вопроса

BroadcastReceiver в манифесте вы регистрируете класс, а не его экземпляр. Каждый раз, когда происходит трансляция, что ваш<receiver> нуждается в дескрипторе, для этого создается новый экземпляр, поэтому вы не можете получить ссылку на него, как вы описываете.

Вполне нормально динамически создавать и регистрировать экземпляр класса Receiver, который вы также статически зарегистрировали в манифесте. Я хотел бы отметить, однако, что если статически зарегистрированный класс будет запущен в любом случае - то есть, если он будет обрабатывать те же широковещательные рассылки, что и динамически зарегистрированный - вы могли бы рассмотреть просто уведомление вашегоActivity из класса Receiver - например, сLocalBroadcastManagerдругая реализация шины событий и т. д. - вместо дублирования приемников.

BroadcastReceiver который уже зарегистрирован.

Просто отправьIntent который может быть обработан этимBroadcastReceiver запустить его действие из любой точки кода, где у вас естьContext.

context.sendBroadcast(intent);

Если вы хотите вызвать «чистую логику» без вызоваBroadcastReceiver вы должны извлечь из него логику в некоторый класс POJO и вызвать этот класс, опуская непосредственноBroadcastReceiver.

class LocationReceiver extends BroadcastReceiver {

       private SomeAction action;

       public LocationReceiver(){
           action = new SomeAction();
       }

        @Override
        public void onReceive(Context context, Intent intent) {
            action.execute();
        }
    };

BroadcastReceiver можно просто позвонитьexecute() но он ничего не знает о том, как это работает. Вы можете использовать повторноSomeAction где-нибудь в вашем коде, не имея знания оBroadcastReceiver совсем.

Старайтесь не помещать логику в классы Android.

Лучше иметь логику в классах Java POJO, потому что это помогает сохранитьSRP Принцип живой и облегчает тестирование.

 klimat18 июл. 2016 г., 11:45
Если вы извлекаетеSomeAction внеBroadcastReceiver Вы сможете подписаться наSomeAction вместо получателя. Еще больше вы сможете написать юнит-тест к нему :)
 Jakub Holovsky18 июл. 2016 г., 11:55
Я понимаю, что вы имеете ввиду. Да, звучит как решение. Я имел в виду больше похоже на публичное событие Action OnMyAction; в мой BR, получая ссылку на мой BR и затем подписываясь на это событие.
 Jakub Holovsky18 июл. 2016 г., 11:43
спасибо, но я не думаю, что понял мою проблему, возможно, я не дал достаточно подробностей. Я отредактировал свой пост, чтобы он был немного понятнее. У меня нет проблем с отправкой трансляции / выполнением какого-либо действия.

Ваш ответ на вопрос