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 技巧 - notification center 发出通知时显示文字

this.mBuilder =        new NotificationCompat.Builder(this)        .setSmallIcon(R.drawable.ic_lau...

delphi xe 之路(21)通知推送

今天教大家使用的是通知(Notification)功能,在Delphi XE6很貼心的也將通知的功能封裝成元件,只要簡單的設定屬性就可以使用了。我們以簡單的篇幅教大家快速使用程式的通知功能,在後面我們...
  • 5201314
  • 5201314
  • 2014年12月23日 15:00
  • 1683

Notification 自定义声音提示

在Notification中使用自定义的声音,自己要处理声音提示这个方法:具体 NotificationCompat.Builder builder = new NotificationCompa...

【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter

转载自:http://www.cnblogs.com/neverdie/p/3790879.html?utm_source=tuicool&utm_medium=referral 作者:王选易,...

Android用观察者模式代替广播通知刷新界面

 源码下载我们知道广播是夸进程的,所以不能什么时候都用广播,如果涉及到安全问题就最好别用广播,怕其他应用进程监听到你的广播。这里采用接口去实现广播的功能。 下面看实现代码: 1.首先我定...

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

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

设计模式--观察者模式Notification -NotificationCenter KVO

观察者模式: 1:什么是Notification? 这个要求其实也很容易实现. 每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公...

观察者模式for android demo

  • 2017年09月30日 11:09
  • 22MB
  • 下载

Android基于观察者模式下载管理

  • 2017年11月08日 11:45
  • 459KB
  • 下载

当观察者模式和回调机制遇上Android源码

上一篇博客跟大家分享了Android源码中的装饰者模式,有点意犹未尽,今天跟大家分享下Android中的观察者模式,顺便说一说观察者模式和回调机制的关系,欢迎大家拍砖。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android观察者模式NotificationCenter,可以试试替换BroadCastReceiver
举报原因:
原因补充:

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