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
});
}

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

android 在基类activity中注册BroadcastReceiver,子activity类实现响应的更多相关文章

  1. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...

  2. android开发之在activity中控制另一个activity的UI更新

    转自:http://blog.csdn.net/jason0539/article/details/18075293 第一种方法: 遇到一个问题,需要在一个activity中控制另一个acitivit ...

  3. 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler

    来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...

  4. Android开发中在一个Activity中关闭另一个Activity

    比如有ActivityA, ActivityB,在ActivityB中关闭ActivityA 解决方案: 1. 在 ActivityA 里面设置一个静态的变量instance,初始化为this在 Ac ...

  5. 【Android开发-8】生命周期,Activity中打开另外一个Activity

    前言:生命中有很多人陪伴自己走过一生中的某段旅程,仅仅是有些人仅仅是某阶段出现,有些人却陪伴自己非常久.就像小学.中学.高中.大学,那些以前以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意.或失 ...

  6. Android在一个Activity中关闭另一个Activity

    比如有ActivityA, ActivityB,在ActivityB中关闭ActivityA. 解决方案: 1.在 ActivityA 里面设置一个静态的变量instance,初始化为this,在 A ...

  7. 在一个Activity中启动另一个Activity

    一.新建一个空的工程 二.添加一个Activity并命名为BAty 三.在activity_main.xml中添加一个按钮,设置id号为btnStartB <Button android:lay ...

  8. Activity 中的Toast在Activity销毁后报错,解决方法,把context改成应用的

    ToastUtil.showShort(context, R.string.connection_fail); 改成 ToastUtil.showShort(BusinesslinkApplicati ...

  9. Android中退出多个Activity的两个经典方法

    这里介绍两种方法:一种把每个activity记住,然后逐一干掉:另一种思路是使用广播. 方法一.用list保存activity实例,然后逐一干掉 上代码: import java.util.Linke ...

随机推荐

  1. mysql之行转列与列转行

    mysql之行转列与列转行是数据查询的常见操作,以更好的来展示数据,下面就详细说说怎么实现. 行转列 行转列的话,就是将一条一条的行数据记录转换为一条列数据展示,一般来说是根据某一列来做汇总数据的操作 ...

  2. linux下的服务器上传与下载

    上传 scp 文件 用户名@服务器ip 服务器保存路径 例如:scp bookmarks_2019_6_24.html root@192.168.0.103:/home 下载 scp 用户名@服务器i ...

  3. epub.js的使用

    epub.js的使用 npm安装 npm install epubjs epub阅读器开发 ePub电子书解析和渲染 生成Book对象 this.book = new Epub(DOWNLOAD_UR ...

  4. MS16-072域内中间人攻击

    0x01 漏洞利用 在目标主机域用户口令已知的条件下,目标主机在进行策略更新时,对域服务器的认证存在漏洞,攻击者劫持认证服务器的过程,引导至伪造的域服务器,并在域服务器中制定用户的计划任务策略,可以获 ...

  5. ABAP分享四 选择屏幕下拉菜单简单实现示例

    PARAMETERS p_carri2 LIKE spfli-carrid                    AS LISTBOX VISIBLE LENGTH 20                ...

  6. 苹果_公司开发者账号_申请DUNS number

    申请DUNS number 注意事项:a.公司英文名称,例如:北京京城科技有限公司,Beijing Jingcheng Technology Co., Ltd.(Co.和Ltd.都是缩写,中间用“逗号 ...

  7. Android五大布局详解——LinearLayout(线性布局)

    Android五大布局 本篇开始介绍Android的五大布局的知识,一个丰富的界面显示总是要有众多的控件来组成的,那么怎样才能让这些控件能够按你的想法进行摆放,从而自定义你所想要的用户界面呢?这就牵涉 ...

  8. ORACLE 12.2RAC之问题 ora.chad OFFLINE

    问题描述: 早上巡检是发现一套RAC的ora.chad一个节点的状态是offline,其他的均正常. crsctl stat res -t ora.chad               ONLINE  ...

  9. Centos8尝鲜

    Centos 8阿里云下载地址https://mirrors.aliyun.com/centos/8.0.1905/isos/x86_64/ Centos8的一些变化 网络服务: 在/etc/sysc ...

  10. table+分页+模糊查询

    这个分页超级棒嘞. 网页链接:http://www.cssmoban.com/cssthemes/7528.shtml