从广播接收器更新活动UI组件?

时间:2014-07-24 10:56:45

标签: java android broadcastreceiver

我有非常基本的问题。它可能很简单,但我没有得到它。 我有一个Activity,我正在使用一些UI组件。我还有一个广播接收器(从清单注册) 我需要更新Activity类的一些UI组件。 喜欢 -

    Class MyActivity extends Activity
     {

        onCreate(){

         //using some UI component lets say textview
           textView.setText("Some Text");
        }

       updateLayout()
       {
         textView.setText("TextView Upadated...");
       }
 }


Class broadCastReceiver
{

    onReceive()
    {
       //here I want to update My Activity component like 
       UpdateLayout();

    }

} 

为此 - 一个解决方案是使updateLayout()方法公共静态,并通过活动引用在接收器类中使用该方法。但我认为,这不是正确的方法。 有没有正确的方法呢?

6 个答案:

答案 0 :(得分:6)

您可以在运行时注册和取消注册接收器,而不是在清单中注册接收器,如下所示:

还要确保在Intent Filter中使用正确的Action注册接收器。

public class MyActivity extends Activity{

// used to listen for intents which are sent after a task was
// successfully processed
private BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        new UpdateUiTask().execute();
    }
};

@Override
public void onResume() {        
    registerReceiver(mUpdateReceiver, new IntentFilter(
            YOUR_INTENT_ACTION));
    super.onResume();
}

@Override
public void onPause() {     
    unregisterReceiver(mUpdateReceiver);
    super.onPause();
}


// used to update the UI
private class UpdateUiTask extends AsyncTask<Void, Void, String> {

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected String doInBackground(Void... voids) {
        Context context = getApplicationContext();
        String result = "test";
        // Put the data obtained after background task. 
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO: UI update          
    }
}  

}

希望它有所帮助。

答案 1 :(得分:4)

如果您真的必须继续使用从BroadcastReceiver注册的AndroidManifest.xml,那么您可以考虑使用事件总线。 Square中有一个很酷的开源库 Otto

它非常好地实现了发布者/订阅者模式。你会在网上找到很多如何使用它的例子,它非常简单。首先查看奥托的website

如果您可以直接从Activity注册/取消注册接收器,那么我会关注@Ritesh Gune的答案。

答案 2 :(得分:4)

我当然会推荐GreenRobot的EventBus

  

EventBus 是Android优化的发布/订阅事件总线。 Android应用程序的典型用例是将活动,片段和后台线程粘合在一起。这些元件的传统布线通常会引入复杂且容易出错的依赖性和生命周期问题。使用EventBus通过所有参与者(例如后台服务 - &gt;活动 - >多个片段或帮助程序类)传播监听器将被弃用。 EventBus将事件发送者和接收者分离,从而简化了应用程序组件之间的通信。代码更少,质量更好。而且您不需要实现单个界面!

结帐:https://github.com/greenrobot/EventBus

答案 3 :(得分:3)

您可以将ObservableEvent与扩展的Observable类一起使用。

public class ObservableEvent extends Observable {
public void setChanged(){
    super.setChanged();
}
}

制作单身类通知中心

public class NSNotificationCenter {

private HashMap<String, ObservableEvent> observables = new HashMap<String, ObservableEvent>();

/**
 * Lazy load the event bus
 */

public void addObserver(String notification, Observer observer) {
    ObservableEvent observable = observables.get(notification);
    if (observable == null) {
        observable = new ObservableEvent();
        observables.put(notification, observable);
    }
    observable.addObserver(observer);
}

public void removeObserver(String notification, Observer observer) {
    Observable observable = observables.get(notification);
    if (observable != null) {
        observable.deleteObserver(observer);
    }
}


public void postNotification(String notification, Object object) { 
        ObservableEvent observable = observables.get(notification);
        if (observable != null) {
            observable.setChanged();
            if (object == null) { 
                observable.notifyObservers();
            } else {
                observable.notifyObservers(object);
            }
        } 
}

}

只是用来添加观察者观察通知和射击方法使用后期通知

答案 4 :(得分:2)

来自docs

  

您可以使用动态注册此类的实例   Context.registerReceiver()或静态发布实现   通过AndroidManifest.xml中的标记。

Activity.onResume()实施中注册接收方,并在Activity.onPause()中取消注册。

public class MyActivity extends Activity
{
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            MyActivity.this.broadcastReceived(intent);
        }
    };

    public void onResume() {
       super.onResume();
       IntentFilter intentFilter = new IntentFilter();
       // add action, category, data to intentFilter
       this.registerReceiver(this.mBroadcastReceiver, intentFilter);
    }

    public void onPause() {
       super.onPause();
       this.unregisterReceiver(this.mBroadcastReceiver);
    }

    public void broadcastReceived(Intent intent) {
       // Update the UI component here.
    }
}

答案 5 :(得分:0)

你可以使用观察者模式 - 活动在onResume()中注册自己,广播接收者接收更新,onPause()注册本身。

网上有很多材料可以学习观察者模式 - http://en.wikipedia.org/wiki/Observer_pattern