1. 程式人生 > >Android用觀察者模式代替廣播通知重新整理介面

Android用觀察者模式代替廣播通知重新整理介面

原始碼下載我們知道廣播是誇程序的,所以不能什麼時候都用廣播,如果涉及到安全問題就最好別用廣播,怕其他應用程序監聽到你的廣播。這裡採用介面去實現廣播的功能。

下面看實現程式碼:

1.首先我定義一個介面

package com.cn.interfacecallbackbroadcast;

/**
 * 傳送廣播介面
 * @author  cWX286335
 * @version  [版本號, 2015年6月11日]
 * @see  [相關類/方法]
 * @since  [產品/模組版本]
 */
public interface IListener
{
    void notifyAllActivity(String str);
}

2.定義3個Activity A、B、C實現這個介面
package com.cn.interfacecallbackbroadcast;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class A extends Activity implements IListener
{
    private EditText tv_a;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.a);
        tv_a = (EditText)findViewById(R.id.tv_a);
        //註冊監聽器
        ListenerManager.getInstance().registerListtener(this);
    }

    @Override
    public void notifyAllActivity(String str)
    {
        tv_a.setText(str);
    }
    
    public void btnClick(View v)
    {
        //a頁面跳轉到B頁面
        Intent intent = new Intent();
        intent.setClass(this, B.class);
        startActivity(intent);
    }
}

package com.cn.interfacecallbackbroadcast;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class B extends Activity implements IListener
{
    private EditText tv_b;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.b);
        tv_b = (EditText)findViewById(R.id.tv_b);
        ListenerManager.getInstance().registerListtener(this);
    }

    @Override
    public void notifyAllActivity(String str)
    {
        tv_b.setText(str);
    }
    
    public void btnClick(View v)
    {
        //b頁面跳轉到c頁面
        Intent intent = new Intent();
        intent.setClass(this, C.class);
        startActivity(intent);
    }
}

package com.cn.interfacecallbackbroadcast;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class C extends Activity implements IListener
{
    private EditText tv_c;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.c);
        tv_c = (EditText)findViewById(R.id.tv_c);
        ListenerManager.getInstance().registerListtener(this);
    }

    @Override
    public void notifyAllActivity(String str)
    {
        tv_c.setText(str);
    }
    
    public void btnClick(View v)
    {
        //傳送廣播通知所有註冊該介面的監聽器
        ListenerManager.getInstance().sendBroadCast("大家能收到我的資訊嗎");
    }
}

3.定義一個管理類去管理一個介面集合
package com.cn.interfacecallbackbroadcast;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class ListenerManager
{
    /**
     * 單例模式
     */
    public static ListenerManager listenerManager;
    
    /**
     * 註冊的介面集合,傳送廣播的時候都能收到
     */
    private List<IListener> iListenerList = new CopyOnWriteArrayList<IListener>();

    /**
     * 獲得單例物件
     */
    public static ListenerManager getInstance()
    {
        if(listenerManager == null)
        {
            listenerManager = new ListenerManager();
        }
        return listenerManager;
    }
    
    /**
     * 註冊監聽
     */
    public void registerListtener(IListener iListener)
    {
        iListenerList.add(iListener);
    }
    
    /**
     * 登出監聽
     */
    public void unRegisterListener(IListener iListener)
    {
        if(iListenerList.contains(iListener))
        {
            iListenerList.remove(iListener);
        }
    }
    
    /**
     * 傳送廣播
     */
    public void sendBroadCast(String str)
    {
        for (IListener iListener : iListenerList)
        {
            iListener.notifyAllActivity(str);
        }
    }
    
}

4.呼叫廣播函式廣播訊息
ListenerManager.getInstance().sendBroadCast("大家能收到我的資訊嗎");

A、B、C三個頁面分別向ListenerManager註冊了自己(ListenerManager.getInstance().registerListtener(this)),然後ListenerManager單例物件會呼叫sendBroadCast()函式去遍歷介面集合執行介面函式notifyAllActivity()以達到廣播通知的效果。然後去更新A、B、C頁面的EditText內容。

這個應用場景很多,希望幫到大家。

原始碼下載