Android观察者模式NotificationCenter,可以试试替换BroadCastReceiver

原创 2016年08月30日 15:32:17

1、NotificationCenter

NotificationCenter是一个单例类,即与Director类一样。它主要用来管理订阅/发布消息的中心。

单例类的使用:通过 NotificationCenter.getInstance() 来获取单例对象。

它有三个核心函数和一个观察者数组:

订阅消息: addObserver()。订阅感兴趣的消息。

发布消息: postNotification()。发布消息。

退订消息: removeObserver()。不感兴趣了,就退订。

观察者数组: _observers

而观察者对象是NotificationObserver类,它的作用就是:将订阅的消息与相应的订阅者、订阅者绑定的回调函数联系起来。

import java.util.ArrayList;
import java.util.HashMap;

/**
 * @Classname NotificationCenter.java
 *
 * @author chewei
 *
 * @Description 观察者模式
 *
 * @Parameter 
 */
public class NotificationCenter {

    final private HashMap<Integer, ArrayList<Object>> observers = new HashMap<Integer, ArrayList<Object>>();

    final private HashMap<Integer, Object> removeAfterBroadcast = new HashMap<Integer, Object>();
    final private HashMap<Integer, Object> addAfterBroadcast = new HashMap<Integer, Object>();

    private boolean broadcasting = false;

    private static volatile NotificationCenter Instance = null;
    public static NotificationCenter getInstance() {//单例模式创建NotificationCenter
        NotificationCenter localInstance = Instance;
        if (localInstance == null) {
            synchronized (NotificationCenter.class) {
                localInstance = Instance;
                if (localInstance == null) {
                    Instance = localInstance = new NotificationCenter();
                }
            }
        }
        return localInstance;
    }

    public interface NotificationCenterDelegate {//接口用于通知观察者领取信息
        public abstract void didReceivedNotification(int id, Object... args);
    }

    public void postNotificationName(int id, Object... args) {//被观察者发送消息
        synchronized (observers) {
            broadcasting = true;
            ArrayList<Object> objects = observers.get(id);
            if (objects != null) {
                for (Object obj : objects) 
                {   
                    ((NotificationCenterDelegate)obj).didReceivedNotification(id, args);
                }
            }
            broadcasting = false;
            if (!removeAfterBroadcast.isEmpty()) {
                for (HashMap.Entry<Integer, Object> entry : removeAfterBroadcast.entrySet()) {
                    removeObserver(entry.getValue(), entry.getKey());
                }
                removeAfterBroadcast.clear();
            }
            if (!addAfterBroadcast.isEmpty()) {
                for (HashMap.Entry<Integer, Object> entry : addAfterBroadcast.entrySet()) {
                    addObserver(entry.getValue(), entry.getKey());
                }
                addAfterBroadcast.clear();
            }
        }
    }

    public void addObserver(Object observer, int id) {//注册
        synchronized (observers) {
            if (broadcasting) {
                addAfterBroadcast.put(id, observer);
                return;
            }
            ArrayList<Object> objects = observers.get(id);
            if (objects == null) 
            {   
                observers.put(id, (objects = new ArrayList<Object>()));
            }
            if (objects.contains(observer)) {
                return;
            }
            //if( id == MessagesController.contactsDidLoaded)
                //FileLog.d("emm", "postNotificationName addObserver");
            objects.add(observer);
        }
    }

    public void removeObserver(Object observer, int id) {//移除
        synchronized (observers) {
            if (broadcasting) {
                removeAfterBroadcast.put(id, observer);
                return;
            }
            ArrayList<Object> objects = observers.get(id);
            if (objects != null) {
                objects.remove(observer);
                if (objects.size() ==   0) {
                    observers.remove(id);
                }
            }
        }
    }
}

(1)观察者需要implements NotificationCenterDelegate
(2)在界面开始(一般放在Oncreate方法里)和销毁里进行注册和移除(第一个参数一般传该acitivty对象(this))
(3)在didReceivedNotification里面判断标识(id)来进行处理object
(4)剩下的就是获取该单利对象发送消息了,哪块发送就写在哪块postNotificationName,这块的标识和注册、销毁里面的一样

个人感觉这个用起来感觉比Android的BroadCastRecevier好用简洁

Android观察者模式NotificationCenter,可以试试替换BroadCastReceiver

1、NotificationCenterNotificationCenter是一个单例类,即与Director类一样。它主要用来管理订阅/发布消息的中心。单例类的使用:通过 NotificationC...
  • cheweilol
  • cheweilol
  • 2016年08月30日 15:32
  • 729

Android 技巧 - notification center 发出通知时显示文字

this.mBuilder =        new NotificationCompat.Builder(this)        .setSmallIcon(R.drawable.ic_lau...
  • chinalwb
  • chinalwb
  • 2014年02月07日 18:39
  • 2483

BroadcastReceiver中的那些设计模式

前文写过BroadCastReceiver的源码的分析BroadcastReceiver源码解析(二),文章很长终于把广播的注册和发送流程详细的分析了一遍。最近用RationalRose画了画它的类图...
  • tiefeng0606
  • tiefeng0606
  • 2016年05月25日 16:02
  • 3636

Android中BroadcastReceiver的运用

BroadcastReceiver是用来接收广播通知的组件,广播是一种同时通知多个对象的事件通知机制。类似于日常生活中的广播,允许多人同时接收,也允许不收听。Android中的广播来源与系统事件,例如...
  • qq_27561483
  • qq_27561483
  • 2016年09月11日 17:43
  • 1120

Android观察者模式NotificationCenter,可以试试替换BroadCastReceiver

1、NotificationCenterNotificationCenter是一个单例类,即与Director类一样。它主要用来管理订阅/发布消息的中心。单例类的使用:通过 NotificationC...
  • cheweilol
  • cheweilol
  • 2016年08月30日 15:32
  • 729

Android通知Notification详解

Notification的使用大体步骤 Notification简介 PendingIntent简介 使用RemoteViews自定义Notification 更新与移除通知 设定提示响应 附录Not...
  • dsc114
  • dsc114
  • 2016年06月20日 16:11
  • 14324

__NotificationCenter事件通知中心(观察者模式)

__NotificationCenter事件通知中心(观察者模式)
  • xiaowenliuwen
  • xiaowenliuwen
  • 2016年09月01日 15:17
  • 835

Service结合BroadcastReceiver实现跨进程通信的例子

在Android中跨进程通信是能够经常遇见的 ,像下载大文件需要更新下载进度这种东西,因为我们设置了下载的Service是在独立的进程里边,也就是说不是在默认的UI线程里边,传统的handler就无法...
  • qq_28963915
  • qq_28963915
  • 2016年08月18日 17:30
  • 1600

Android Notification常见样式总结

本文总结一下开发中使用的Notification的常见样式 Demo下载地址 demo里有两首歌和打包后的apk,所以比较大,如果网不好下载请耐心!...
  • w804518214
  • w804518214
  • 2016年04月24日 09:21
  • 23052

NotificationCenter(实战)

NotificationCenter实战展示
  • y550918116j
  • y550918116j
  • 2016年01月20日 17:09
  • 693
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android观察者模式NotificationCenter,可以试试替换BroadCastReceiver
举报原因:
原因补充:

(最多只允许输入30个字)