Android Best Practice по обновлению пользовательского интерфейса от BroadcastReceiver до определенной активности - PullRequest
24 голосов
/ 18 июля 2010

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

Что я знаю (может быть неправильным)

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

2) Создать ContentObserver?

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

4) Создайте пользовательский фильтр на broadcastReceiver, расположенном в том же классе, что и действие, и используйте context.sendBroadcast (msg of customfilter) и в пользовательском фильтре вызывать updateUI (такой же, как один, но более универсальный?)

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

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

Ответы [ 2 ]

36 голосов
/ 25 октября 2010

Самый простой способ предоставить эту функциональность - это включить в себя приемник вещания и связать / отсоединить его, используя 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 .

0 голосов
/ 16 октября 2013

Что мне недавно пришлось сделать, чтобы изменить текст кнопки после получения данных из 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");  
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...