Android общаться между активностью и приемником вещания - PullRequest
5 голосов
/ 30 июля 2011

У меня есть действие, которое отображает некоторые данные, полученные с сервера.Если соединение недоступно, активность отображает некоторые кэшированные данные;если соединение доступно, активность извлекает данные и отображает их.Все работает, как и ожидалось.
Теперь я бы хотел, чтобы мои действия перезагрузили данные, как только будет установлено соединение.Я использую простой приемник, который расширяет BroadcastReceiver:

public class ConnectionChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo != null) {
            //what to do here? 
        } 
     }
}

В моем файле манифеста объявлен широковещательный приемник следующим образом:

<receiver android:name=".ConnectionChangeReceiver"
          android:label="NetworkConnection">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
</receiver>

В своей деятельности я регистрирую получателя:

ConnectionChangeReceiver receive = новый ConnectionChangeReceiver ();this.registerReceiver (приемник, новый IntentFilter (ConnectivityManager.CONNECTIVITY_ACTION));

Теперь я не понимаю, что делать дальше.Когда метод onReceive выполняется, как сделать так, чтобы моя деятельность знала об этом?Я знаю, что могу начать новую деятельность, но это не совсем то, чего я хочу.Должен ли я объявить ConnectionChangeReceiver частным классом моей деятельности?Или есть другое решение?

Ответы [ 2 ]

11 голосов
/ 30 июля 2011

Я думаю, что создание приемника как частного подкласса вашей деятельности - это то, что вам нужно. Таким образом, вы можете контролировать события и данные из вашей деятельности. Затем вы можете просто создать один его экземпляр и зарегистрировать получатель из кода, как вы это делали выше.

Обратите внимание, что вам не нужно регистрировать получателя в манифесте и коде. Одним из них является достаточно - манифест в основном представляет собой «статическую» регистрацию, тогда как выполнение этого в коде позволяет динамическую регистрацию во время выполнения. Кроме того, когда вы регистрируетесь в манифесте, новый экземпляр вашего получателя будет автоматически создан из системы, выполнен и завершен. Выполнение reg в коде позволяет указать на один конкретный экземпляр.

0 голосов
/ 25 января 2019

Интерфейсный подход!

Вы также можете общаться через интерфейс. Этот подход работает даже если ваш BroadcastReceiver находится в отдельном файле. Вы даже не будете должен получить доступ к элементам пользовательского интерфейса Activity в Broadcast.

Это довольно просто. Просто выполните эти 3 простых шага.

1) Создать интерфейс

public interface MyListerner{

    public void performSomething(String arg);

} 

2) Инициализировать слушателя в ConnectionChangeReceiver

public class ConnectionChangeReceiver extends BroadcastReceiver {

      private MyListerner listener;

      @Override
      public void onReceive(Context context, Intent intent) {

            listener = (MyListerner )context;  // initialse

            ConnectivityManager connectivityManager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
            if (activeNetInfo != null) {

              listener.performSomething("Some data");   // Call listener method

            } 
      }
}

3) Реализуйте интерфейс и переопределите метод в своей деятельности

public class YourActivity implements MyListerner{

      // Activity relate stuff onCreate() etc 

     public void updateUI(String result){
         // Your code to update UI
     }

     @Override
     public void performSomething(String arg){
           updateUI(arg);
     }

}

Соответствующие ссылки: Вы можете прочитать подробно Почему использование интерфейса является предпочтительным подходом в этом случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...