zoukankan      html  css  js  c++  java
  • android 在基类activity中注册BroadcastReceiver,子activity类实现响应

    android app 一般都会定义自己的BaseActivity, 如果各子Activity都需要接收广播但对广播的处理又不同时,可以考虑在BaseActivity中注册BroadcastReceiver,而在子类中实现各自的响应逻辑,现将代码框架罗列如下:

    1.定义自己的activity基类

    public class BaseActivity extends FragmentActivity {
    	private static final String TAG = "BaseActivity";
    
    	private BroadcastReceiver mReceiver;
    	private IntentFilter mIntentFilter;
            // 用来记录需要处理的action和响应函数
    	private Map<String, List<OnActionResponse>> mCallbacks;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		mIntentFilter = new IntentFilter();
    
    		mReceiver = new CommonReceiver();
    		mCallbacks = new HashMap<String, List<OnActionResponse>>();
    	}
    
    	@Override
    	protected void onPause() {
    		unregisterReceiver(mReceiver);
    		super.onPause();
    	}
    
    	@Override
    	protected void onResume() {
    		registerReceiver(mReceiver, mIntentFilter);
    		super.onResume();
    	}
        
            //子类调用该方法,注册所要处理的广播action
    	/**
    	 * if subclass need response BroadcastReceiver, need invoke this method to
    	 * add can Receive Action
    	 * 
    	 * @param intent
    	 * @param callback
    	 */
    	public void addCanReceiveAction(Intent intent, OnActionResponse callback) {
    		final String action = intent.getAction();
    
    		if (!mIntentFilter.hasAction(action)) {
    			mIntentFilter.addAction(action);
    			registerReceiver(mReceiver, mIntentFilter);
    		}
    
    		if (!mCallbacks.containsKey(action)) {
    			mCallbacks.put(action, Collections.synchronizedList(new ArrayList<OnActionResponse>()));
    		}
    
    		mCallbacks.get(action).add(callback);
    		intent.putExtra(Constants.EXTRA_ACTION_CALLBACK_HASH_CODE, callback.hashCode());
    	}
    
    	private class CommonReceiver extends BroadcastReceiver {
                    
                    // 子类收到广播后的逻辑
    		@Override
    		public void onReceive(Context context, Intent intent) {
    			Log.d(TAG, "CommonReceiver receiver intent:" + intent.getAction());
    			final String action = intent.getAction();
    			if (mCallbacks != null && mCallbacks.containsKey(action)) {
    				int hashCode = intent.getIntExtra(Constants.EXTRA_ACTION_CALLBACK_HASH_CODE, -1);
    				List<OnActionResponse> list = mCallbacks.get(action);
    				if (list != null) {
    					int index = -1;
    					int count = list.size();
    
    					for (int i = 0; i < count; i++) {
    						if (hashCode == list.get(i).hashCode()) {
    							index = i;
    							break;
    						}
    					}
    
    					if (index >= 0) {
    						list.get(index).onResponse(intent);
    					} else {
    						list.get(count - 1).onResponse(intent);
    					}
    
    					if (list.isEmpty()) {
    						mCallbacks.remove(action);
    					}
    				}
    			}
    		}
    	}
            
            //子类具体实现处理逻辑
    	protected interface OnActionResponse {
    		void onResponse(Intent intent);
    	}
    }
    

     2.在子类中的使用

    2.1 首先需要继承基类

    public class A extends BaseActivity
    

     2.2 子类的onCreate中添加要处理的action,例如:addBrodcastAction是为了统一管理该activity可以处理的action

    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
                    。。。。。。
    		addBrodcastAction();
                    。。。。。。
    	}
    

     2.3 实现addBrodcastAction

          private void addBrodcastAction() {
    		// add Action1
    		addCanReceiveAction(new Intent(Action1), new OnActionResponse() {
    
    			@Override
    			public void onResponse(Intent intent) {
    				//处理action1
    		});
    
    		// add Action2
    		addCanReceiveAction(new Intent(Action2), new OnActionResponse() {
    
    			@Override
    			public void onResponse(Intent intent) {
    				//处理action2
    		});
    	}
    

     这种结构的利弊,欢迎大家的评论。。。

  • 相关阅读:
    从B树、B+树、B*树谈到R 树
    The Log-Structured Merge-Tree(译)
    Leveldb源码分析--2
    Leveldb源码分析--1
    little-endian And big-endian
    Fixed数据类型
    Varint数值压缩存储方法
    JavaEE开发之SpringBoot工程的创建、运行与配置
    Javaee基本框架(Struts2,Spring,MyBatista)之间的关系
    XLM解析技术概述
  • 原文地址:https://www.cnblogs.com/zj2012zy/p/3788435.html
Copyright © 2011-2022 走看看