Android用觀察者模式代替廣播通知重新整理介面
阿新 • • 發佈:2019-02-05
原始碼下載我們知道廣播是誇程序的,所以不能什麼時候都用廣播,如果涉及到安全問題就最好別用廣播,怕其他應用程序監聽到你的廣播。這裡採用介面去實現廣播的功能。
下面看實現程式碼:
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內容。
這個應用場景很多,希望幫到大家。