对于所有的活动,有什么方法可以在一个类中抛出一个事件吗?
实际上,我正在使用自定义监听器并在某个地方注册它们。但是我知道我是否可以抛出一个定制的事件,比如"newMessageEvent“或者类似的,并且在每个活着的活动中接收它。
我是用一种好的方式还是存在一种更好的方式?
有人知道吗?
发布于 2015-08-12 08:43:42
回答我自己很久以前为帮助别人而提出的问题,如果有人需要,一个可行的解决办法是:
1-创建一个Singleton类来管理这样的事件:
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)
public class MyBaseActivity extends Activity{
}3-覆盖onCreate和onDestroy方法,调用事件管理器并使活动实现EventsManagerListener
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.最后,您必须在下一行中调用要发送该事件的位置:
EventsManager.getInstance().throwEvent(YOUR_EVENT);希望这能帮上忙!
https://stackoverflow.com/questions/20634942
复制相似问题