观察者模式 监听器

位置: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()方法,除此以外,能从事件对象中获得的信息,取决于事件类的定义。

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