首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >所有活动的活动

所有活动的活动
EN

Stack Overflow用户
提问于 2013-12-17 13:03:24
回答 1查看 75关注 0票数 0

对于所有的活动,有什么方法可以在一个类中抛出一个事件吗?

实际上,我正在使用自定义监听器并在某个地方注册它们。但是我知道我是否可以抛出一个定制的事件,比如"newMessageEvent“或者类似的,并且在每个活着的活动中接收它。

我是用一种好的方式还是存在一种更好的方式?

有人知道吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-12 08:43:42

回答我自己很久以前为帮助别人而提出的问题,如果有人需要,一个可行的解决办法是:

1-创建一个Singleton类来管理这样的事件:

代码语言:javascript
复制
    public class EventsManager {

    public enum EventType{
        //Define here your types
    }

    public interface EventsManagerListener{
        void onEvent(EventType eventType);
    }

    private static EventsManager instance;



    private  HashMap<EventType,List<EventsManagerListener>> listenersMap;

    private EventsManager(){
        listenersMap = new HashMap<>();
    }

    public static EventsManager getInstance(){
        if(instance == null){
            instance = new EventsManager();
        }
        return instance;
    }

    public void registerForEvent(EventType eventType, EventsManagerListener listener ){
        List<EventsManagerListener> eventListeners = listenersMap.get(eventType);
        if(eventListeners == null){
            eventListeners = new ArrayList<>();
            listenersMap.put(eventType,eventListeners);
        }
        if(!eventListeners.contains(listener)) {
            eventListeners.add(listener);
        }
    }

    public void unregisterForEvent(EventType eventType, EventsManagerListener listener){
        List<EventsManagerListener> eventListeners = listenersMap.get(eventType);
        if(eventListeners != null){
            eventListeners.remove(listener);
        }
    }


    public void throwEvent(EventType eventType){
        List<EventsManagerListener> eventListeners = listenersMap.get(eventType);
        if(eventListeners != null){

            //This iteration sends the event to the newest activity first
            for(int i = eventListeners.size()-1; i >= 0; i--){
                EventsManagerListener listener = eventListeners.get(i);
                listener.onEvent(eventType);
            }
        }
    }

}

2-子类活动(例如MyBaseActivity)

代码语言:javascript
复制
public class MyBaseActivity extends Activity{

}

3-覆盖onCreate和onDestroy方法,调用事件管理器并使活动实现EventsManagerListener

代码语言:javascript
复制
    public class MyBaseActivity extends Activity implements EventsManagerListener{
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            //...

            EventsManager.getInstance().registerForEvent(THE_EVENT_YOU_WANT, this);
        }

        @Override
        protected void onDestroy(Bundle savedInstanceState) {
            super.onDestroy(savedInstanceState);

            //...

            EventsManager.getInstance().unregisterForEvent(THE_EVENT_YOU_WANT, this);
        }

        public void onEvent(EventsManager.EventType eventType){
             //... handle the event
        }

}

4.最后,您必须在下一行中调用要发送该事件的位置:

代码语言:javascript
复制
EventsManager.getInstance().throwEvent(YOUR_EVENT);

希望这能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20634942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档