Подтвердить что ты не робот

Лучшая практика Android по обновлению пользовательского интерфейса от BroadcastReceiver до определенной активности

Когда у меня есть broadcastReceiver, скажите: android.intent.action.MEDIA_BUTTON, и я хочу обновить текущий пользовательский интерфейс активности без создания нового действия, есть ли какая-нибудь хорошая практика в этом?

Что я знаю (может быть, не так)

1) Я могу поместить BroadcastReceiver в тот же класс, что и активность, и вызвать функцию updateUI после определенной активности

2) Создайте ContentObserver?

3) Сообщайте об услуге, созданной этой деятельностью, используйте helpl. (Я не знаю, как получить текущую услугу, если она зарегистрирована из активности)

4) Создайте настраиваемый фильтр в широковещательном радиоприемнике, который находится в том же классе, что и активность, и используйте context.sendBroadcast(msg настраиваемого фильтра) и в настраиваемом модуле обработки вызовов (например, один, но более общий?)

Окончательный поток будет получен от BroadcastReceiver и завершит обновление пользовательского интерфейса без обновления активности (если активность не будет мертвой?)

Просьба предоставить ссылки/исходный код на то, как вы решаете эту проблему. Большое спасибо заранее:)

4b9b3361

Ответ 1

Самый простой способ предоставить эту функциональность - включить в нее вещательный приемник и связать/отвязать его с помощью registerReceiver и unregisterreceiver:

public class MyActivity extends Activity {
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            MyActivity.this.receivedBroadcast(intent);
        }
    };
    @Override
    public void onResume() {
        super.onResume();
        IntentFilter iff = new IntentFilter();
        iff.addAction("android.intent.action.MEDIA_BUTTON");
        // Put whatever message you want to receive as the action
        this.registerReceiver(this.mBroadcastReceiver,iff);
    }
    @Override
    public void onPause() {
        super.onPause();
        this.unregisterReceiver(this.mBroadcastReceiver);
    }
    private void receivedBroadcast(Intent i) {
        // Put your receive handling code here
    }
}

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

Ответ 2

То, что я недавно должен был сделать, чтобы изменить текст Button после получения данных из LocalBroadcastManager, заключается в том, чтобы сохранить значение в частном поле, а затем сделать материал пользовательского интерфейса в моем методе onResume().

public class myClass extends Activity {

    private String myString;

    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);         
        // register to receive data
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter("myAction"));      
    }

    private BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // get the extra data included in the intent
            myString = intent.getStringExtra("myString");   
        }
    };

    @Override   
    public void onResume() {
        super.onResume();
        System.out.println("onResume");
        // do something to the UI
        myButton.setText(myString != null ? myString : "Default");  
    }
}