package com.v7lin.style.event; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; /** * 基于 {@link LocalBroadcastManager} 实现的事件流 * * {@link LocalBroadcastManager} 的本质是基于观察者模式设计的单例 * * @author v7lin E-mail:v7lin@qq.com */ public class EventBus implements EventConst { private Context mContext; private final AtomicBoolean mCreate = new AtomicBoolean(false); private final AtomicBoolean mStarted = new AtomicBoolean(false); private final AtomicBoolean mResumed = new AtomicBoolean(false); private final Map<String, EventSession> mLocalEventMap = new HashMap<String, EventSession>(); private final Map<String, EventSession> mGlobalEventMap = new HashMap<String, EventSession>(); public EventBus(Context context) { super(); mContext = context; } public void onCreate() { if (mCreate.compareAndSet(false, true)) { registerReceiver(EventMode.CREATE_DESTROY); } } public void onStart() { if (mStarted.compareAndSet(false, true)) { registerReceiver(EventMode.START_STOP); } } public void onResume() { if (mResumed.compareAndSet(false, true)) { registerReceiver(EventMode.RESUME_PAUSE); } } public void onPause() { if (mResumed.compareAndSet(true, false)) { unregisterReceiver(EventMode.RESUME_PAUSE); } } public void onStop() { if (mStarted.compareAndSet(true, false)) { unregisterReceiver(EventMode.START_STOP); } } public void onDestroy() { if (mCreate.compareAndSet(true, false)) { unregisterReceiver(EventMode.CREATE_DESTROY); } } private void registerReceiver(EventMode mode) { EventFilter filter = new EventFilter(mode); Collection<EventSession> localSessions = mLocalEventMap.values(); for (EventSession session : localSessions) { session.registerReceiver(mContext, filter, true); } Collection<EventSession> globalSessions = mGlobalEventMap.values(); for (EventSession session : globalSessions) { session.registerReceiver(mContext, filter, false); } } private void unregisterReceiver(EventMode mode) { EventFilter filter = new EventFilter(mode); Collection<EventSession> localSessions = mLocalEventMap.values(); for (EventSession session : localSessions) { session.unregisterReceiver(mContext, filter, true); } Collection<EventSession> globalSessions = mGlobalEventMap.values(); for (EventSession session : globalSessions) { session.unregisterReceiver(mContext, filter, false); } } /** * 注册广播 */ public void registerEventReceiver(boolean isLocal, String eventKey, EventMode mode, EventReceiver receiver, String... actions) { EventSession session = new EventSession(eventKey, mode, receiver, actions); EventFilter filter = new EventFilter(mode); Map<String, EventSession> eventMap = isLocal ? mLocalEventMap : mGlobalEventMap; EventSession oldSession = eventMap.put(eventKey, session); if (oldSession != null) { oldSession.unregisterReceiver(mContext, null, isLocal);// 不需要过滤器 } session.registerReceiver(mContext, filter, isLocal); } /** * 注销广播 */ public void unregisterEventReceiver(boolean isLocal, String eventKey) { Map<String, EventSession> eventMap = isLocal ? mLocalEventMap : mGlobalEventMap; EventSession session = eventMap.remove(eventKey); if (session != null) { session.unregisterReceiver(mContext, null, isLocal);// 不需要过滤器 } } /** * 发送广播 */ public static void sendEvent(Context context, String action, Bundle extras, boolean isLocal) { Intent intent = new Intent(action); if (extras != null) { intent.putExtra(KEY_BUNDLE_EVENT, extras); } if (isLocal) { LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } else { context.sendBroadcast(intent); } } }