两个界面之间回调我们可以使用单纯的接口回调,可是很多时候我们要实现这样的操作,一个方法执行后很多地方都要跟着做相应的操作,这种情况下单纯的接口回调已经满足不了我们的需求了。
这时候就要用到这种广播方式的接口回调了,这种方式的好处就是不需要获得对象来设置监听,只需要在调用者和被调用者里设置执行方法和启动方法即可。
实现方法:
1.注册一个管理监听器,内部成员都是用静态的方便在全局任意一个类中都可以获取到。
2.管理监听器中加入添加监听、启动监听、取消监听、判断是否添加监听方法。注意:该管理器的获取方式采用要单例模式。
3.在被调用处获得管理器设置监听,在调用处获得管理器启动监听。
看到这是不是有点乱了,没关系通过下边的代码再看看。
有3个Activity,Activity_A、Activity_B、Activity_C,在C中做操作改变A和B的布局背景颜色。
监听管理器RefreshMonitor
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import com.example.monitordemo.monitor.Monitor.RefreshEnmu; /** * @author quzy * * @Description 定义全局监听 * * @version 创建时间:2016-3-10 下午3:10:31 */ public class RefreshMonitor { /** * <p> * 管理监听器 * </p> * <br/> * * @since 5.0.0 */ private static RefreshMonitor mMonitor; private static Map<String, RefreshMonitorCallback> mMonitorMap = new HashMap<String, RefreshMonitor.RefreshMonitorCallback>(); public static Map<String, RefreshMonitorCallback> getmMonitorMap() { return mMonitorMap; } /** * <p> * 启动监听者 * </p> * <br/> * * @since 5.0.0 */ public void IssuedMonitor(RefreshEnmu mRefreshEnmu) { Iterator iter = mMonitorMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); RefreshMonitorCallback val = (RefreshMonitorCallback) entry.getValue(); val.AppOperation(mRefreshEnmu); } } /** * <p> * 监听者初始化 * </p> * <br/> * * @since 5.0.0 * @return */ public static RefreshMonitor getInstance() { if (mMonitor == null) { mMonitor = new RefreshMonitor(); } return mMonitor; } /** * <p> * 监听者注册 * </p> * <br/> * * @since 5.0.0 */ public void register(RefreshMonitorCallback listener, String key) { mMonitorMap.put(key, listener); } /** * <p> * 判断是否已注册 * </p> * <br/> * * @since 5.0.0 * @author sunxh * @return */ public boolean isRegister(String key) { if (mMonitorMap.get(key) != null) { return true; } return false; } /** * <p> * 取消注册 * </p> * <br/> * * @since 5.0.0 * @param key */ public void cancelRegister(String key) { mMonitorMap.remove(key); } /** * <p> * 操作监听接口 * </p> * <br/> * * @since 5.0.0 */ public interface RefreshMonitorCallback { public void AppOperation(RefreshEnmu mRefreshEnmu); } }
public class Monitor { public enum RefreshEnmu{ REFRESH_LAYOUT_COLRE,REFRESH_TEXT; } }
Activity_A
package com.example.monitordemo; import com.example.monitordemo.monitor.RefreshMonitor; import com.example.monitordemo.monitor.Monitor.RefreshEnmu; import com.example.monitordemo.monitor.RefreshMonitor.RefreshMonitorCallback; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; public class Activity_A extends Activity { private LinearLayout ll_bg_a; private Button btn_a; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); ll_bg_a = (LinearLayout) findViewById(R.id.ll_bg_a); btn_a = (Button) findViewById(R.id.btn_a); setListener(); } private void setListener() { btn_a.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), Activity_B.class); startActivity(intent); } }); RefreshMonitor.getInstance().register(new RefreshMonitorCallback() { @Override public void AppOperation(RefreshEnmu mRefreshEnmu) { switch (mRefreshEnmu) { case REFRESH_LAYOUT_COLRE: ll_bg_a.setBackgroundColor(Color.BLUE); break; default: break; } } }, Activity_A.class.getName()); } @Override protected void onDestroy() { //判断监听是否注册过,有则取消监听 if(RefreshMonitor.getInstance().isRegister(Activity_A.class.getName())){ RefreshMonitor.getInstance().cancelRegister(Activity_A.class.getName()); } super.onDestroy(); } public Activity getActivity(){ return Activity_A.this; } }
import com.example.monitordemo.monitor.RefreshMonitor; import com.example.monitordemo.monitor.Monitor.RefreshEnmu; import com.example.monitordemo.monitor.RefreshMonitor.RefreshMonitorCallback; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; public class Activity_B extends Activity { private LinearLayout ll_bg_b; private Button btn_b; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); ll_bg_b = (LinearLayout) findViewById(R.id.ll_bg_b); btn_b = (Button) findViewById(R.id.btn_b); setListener(); } private void setListener() { btn_b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), Activity_C.class); startActivity(intent); } }); //设置监听 RefreshMonitor.getInstance().register(new RefreshMonitorCallback() { @Override public void AppOperation(RefreshEnmu mRefreshEnmu) { switch (mRefreshEnmu) { case REFRESH_LAYOUT_COLRE: ll_bg_b.setBackgroundColor(Color.BLUE); break; default: break; } } }, Activity_B.class.getName()); } @Override protected void onDestroy() { //判断监听是否注册过,有则取消监听 if(RefreshMonitor.getInstance().isRegister(Activity_B.class.getName())){ RefreshMonitor.getInstance().cancelRegister(Activity_B.class.getName()); } super.onDestroy(); } public Activity getActivity() { return Activity_B.this; } }
import com.example.monitordemo.monitor.RefreshMonitor; import com.example.monitordemo.monitor.Monitor.RefreshEnmu; import com.example.monitordemo.monitor.RefreshMonitor.RefreshMonitorCallback; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class Activity_C extends Activity { private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_c); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //启动监听 RefreshMonitor.getInstance().IssuedMonitor(RefreshEnmu.REFRESH_LAYOUT_COLRE); finish(); } }); } }
源码地址:http://download.csdn.net/detail/linder_qzy/9457896