Android - зарегистрировать / отменить регистрацию получателя динамически с помощью вспомогательного класса со статическими методами? - PullRequest
0 голосов
/ 07 марта 2019

СИТУАЦИЯ:
У меня есть вспомогательный класс со статическими методами для динамического включения / отключения BroadcastReceiver.
Я вызываю эти методы из других классов, когда мне нужно зарегистрировать (или) отменить регистрацию Получателя.

ВЫПУСК:
Я не могу понять, как динамически UN Зарегистрировать получателя из класса помощника.
(Когда я пытаюсь сделать context.unregisterReceiver(myReceiver);, он не распознает myReceiver).

ВОПРОС:
Как правильно ссылаться на myReceiver из метода receiverUnregister в приведенном ниже коде?


public class GpsReceiverHelper {


    //  Called from a different Class when I need to Register the Receiver
    public static void receiverRegister(Context context) {

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.location.PROVIDERS_CHANGED");

        final BroadcastReceiver myReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //  Receiver code goes here    
            }
        };
        context.registerReceiver(myReceiver, intentFilter);
    }



    //  Called from a different Class when I need to UN-Register the Receiver
    public static void receiverUnregister(Context context) {

        //  THIS DOESN'T WORK BECAUSE "myReceiver" can't be found..
        context.unregisterReceiver(myReceiver);

    }


}


Опять же, я планирую вызывать эти методы из другого класса.
Как правильно поступить так и правильно назначить все?

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Вы должны хранить ссылки на все получатели, которые вы зарегистрировали.Вы можете сделать это по-разному.Одним из способов является создание статической коллекции, которая хранит их в этом вспомогательном классе (не лучший подход).Другой способ - вернуть получателя вашим методом receiverRegister.Таким образом, тот, кто вызывает метод, должен поддерживать ссылку, а затем использовать ее для отмены регистрации.

public BroadcastReceiver registerReceiver(...) {
  ...
  return receiver;
}

public void unregisterReceiver(Context context, BroadcastReceiver receiver) {
  context.unregisterReceiver(receiver);
}
0 голосов
/ 08 марта 2019

Вы можете инкапсулировать процесс, сделав intentFilter членом класса GpsReceiverHelper и удалив ключевое слово static из recieverRegister и receiverUnregister.

.
public class GpsReceiverHelper {

    private final BroadcastReceiver myReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //  Receiver code goes here    
            }
    };

    //  Called from a different Class when I need to Register the Receiver
    public void receiverRegister(Context context) {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.location.PROVIDERS_CHANGED");
        context.registerReceiver(myReceiver, intentFilter);
    }

    //  Called from a different Class when I need to UN-Register the Receiver
    public void receiverUnregister(Context context) {
        context.unregisterReceiver(myReceiver);
    }
}

Приведенный выше код теперь является настоящим классом Helper, а не просто служебным классом с кучей статических методов.

Пример использования:

class TestActivity extends Activity{
  private GpsRecieverHelper helper = new GpsRecieverHelper();

  public void onStart(){
      helper.receiverRegister(this);
  }

  public void onStop(){
      helper.receiverUnregister(this);
  }
}

Если вам нужно повторно использовать тот же экземпляр помощника, вы можете использовать публичное статическое ключевое слово:

public static GpsRecieverHelper helper = new GpsRecieverHelper();

Помощник выше теперь доступен в каждом классе, например <NameOfTheCLass>.helper.

Отказ от ответственности: я никогда не проверял код в реальной IDE.

0 голосов
/ 08 марта 2019

Мне удалось решить мою проблему, добавив поля в поле для static BroadcastReceiver myReceiver, а затем присвоив его как myReceiver= ... внутри моего статического метода, содержащего фактический код BroadcastReceiver. Кроме того, я понял, что могу избежать уничтожения BroadcastReceiver при вызове finish(); просто заменив context.registerReceiver на context.getApplicationContext.registerReceiver. Проблема (и) решена!

...