Nitro's

Dec 11, 2013 - Comments - dev tech

观察者模式 监听器

位置:platform/packages/apps/Contacts

位置:platform/packages/apps/ContactsCommon

1、观察者模式

com.android.contacts.ContactSaveService 事件源类集中处理联系人、用户组的增删改,处理这些数据Activity注册ContactSaveService.RegisterListener监听,当调用数据处理方法完毕后通知各自的监听器。

    //定义接口
    public interface Listener {
        //触发事件后通知方法
        public void onServiceCompleted(Intent callbackIntent);
    }
    //监听器列表
    private static final CopyOnWriteArrayList<Listener> sListeners =
            new CopyOnWriteArrayList<Listener>();

    //注册监听
    public static void registerListener(Listener listener) {
        if (!(listener instanceof Activity)) {
            throw new ClassCastException("Only activities can be registered to"
                    + " receive callback from " + ContactSaveService.class.getName());
        }
        sListeners.add(0, listener);
    }
    //解除监听
    public static void unregisterListener(Listener listener) {
        sListeners.remove(listener);
    }

    ......

    void deliverCallbackOnUiThread(final Intent callbackIntent) {

        for (Listener listener : sListeners) {
            if (callbackIntent.getComponent().equals(
                    ((Activity) listener).getIntent().getComponent())) {
                //通知对应的Activity事件触发
                listener.onServiceCompleted(callbackIntent);
                return;
            }
        }
    }

观察者模式适用于:

当其中一个对象(ContactSaveService)的变更会影响其他对象(Activity),却又不知道多少对象必须被同时变更;

当对象(ContactSaveService)应该有能力通知其他对象,又不应该知道其他对象(Activity)的实现细节。

2、监听器

监听器是监听器接口的实现者,提供监听器接口中定义的所有方法的实现代码。简单情形下,一个监听器只监听一种类型的事件,即实现一种监听器接口。复杂的监 听器可以实现多种监听器接口,监听多种类型的事件。在事件处理方法代码中,监听器可以从入口参数中获得事件对象,并通过该对象获得所需的信息,例如事件 源、事件发生时间等等。事件源是一定可以从事件对象中 获得的,因为事件基类EventObject提供了getSource()方法,除此以外,能从事件对象中获得的信息,取决于事件类的定义。

作为事件源的类,必需满足以下条件: 事件源必须在内部维护一个已注册监听器的列表。当某监听器注册时,该监听器被添加到列表中,而监听器注销时,则从列表中删除; 事件源必须提供注册方法,以允许监听器注册为事件的接收者; 事件源必须提供注销方法,以允许监听器注销,停止对事件的接收; 事件源必须能够实例化事件类,即产生事件对象; 当事件对象被产生后,事件源必须向所有的注册监听器广播该消息。事件的广播,是通过逐个调用监听器列表中所有监听器的事件处理方法来实现的。

Android 4.4.1即将来袭 C# 调用动态链接库

comments powered by Disqus