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
});
}
这种结构的利弊,欢迎大家的评论。。。
android 在基类activity中注册BroadcastReceiver,子activity类实现响应的更多相关文章
- 【Android】12.3 在当前Activity中获取另一个Activity的返回值
分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...
- android开发之在activity中控制另一个activity的UI更新
转自:http://blog.csdn.net/jason0539/article/details/18075293 第一种方法: 遇到一个问题,需要在一个activity中控制另一个acitivit ...
- 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler
来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...
- Android开发中在一个Activity中关闭另一个Activity
比如有ActivityA, ActivityB,在ActivityB中关闭ActivityA 解决方案: 1. 在 ActivityA 里面设置一个静态的变量instance,初始化为this在 Ac ...
- 【Android开发-8】生命周期,Activity中打开另外一个Activity
前言:生命中有很多人陪伴自己走过一生中的某段旅程,仅仅是有些人仅仅是某阶段出现,有些人却陪伴自己非常久.就像小学.中学.高中.大学,那些以前以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意.或失 ...
- Android在一个Activity中关闭另一个Activity
比如有ActivityA, ActivityB,在ActivityB中关闭ActivityA. 解决方案: 1.在 ActivityA 里面设置一个静态的变量instance,初始化为this,在 A ...
- 在一个Activity中启动另一个Activity
一.新建一个空的工程 二.添加一个Activity并命名为BAty 三.在activity_main.xml中添加一个按钮,设置id号为btnStartB <Button android:lay ...
- Activity 中的Toast在Activity销毁后报错,解决方法,把context改成应用的
ToastUtil.showShort(context, R.string.connection_fail); 改成 ToastUtil.showShort(BusinesslinkApplicati ...
- Android中退出多个Activity的两个经典方法
这里介绍两种方法:一种把每个activity记住,然后逐一干掉:另一种思路是使用广播. 方法一.用list保存activity实例,然后逐一干掉 上代码: import java.util.Linke ...
随机推荐
- 第1章:C++泛型技术基础:模板——《C++泛型:STL原理和应用》读书笔记整理
第1章:C++泛型技术基础:模板 1.2 关于模板参数 1.2.1 模板参数类型 类型参数 typename声明的参数都属于类型参数,它的实参必须为系统内置或者用户自定义的数据类型,包括类模板实体 ...
- IT兄弟连 HTML5教程 和页面布局有关的CSS属性
使用DIV+CSS对网页进行标准化布局前,除了要掌握盒子模型,还要掌握定位和浮动两个比较重要的概念,它们可以控制在页面上排列和显示元素的方式.一个盒子是装内容的区块,如果多个盒子组合在一起使用,再通过 ...
- drf请求模块分析
一.drf请求模块 .drf的request是在wsgi的request基础上再次封装 .wsgi的request作为drf的request一个属性:_request .新的request对旧的req ...
- What happened when new an object in JVM ?
原文链接:https://www.javaspring.net/java/what-happened-when-new-an-object-in-jvm I. Introduction As you ...
- Prometheus监控(二)
Prometheus监控(二) 数据类型 Counter(计数器类型) Counter类型的指标的工作方式和计数器一样,只增不减(除非系统发生了重置),Counter一般用于累计值. Gauges(仪 ...
- create connection SQLException, url: jdbc:mysql://localhost:3306/demo, errorCode 1045, state 28000
错误原因: 配置文件中 username 与 Mysql 关键字冲突 改为:
- 【实习第十天】odoo开发基础整合
前言 发文时间是2019年7月19日.提一下学习odoo的感受,odoo目前在国内并不是很流行,且主流是在企业型软件,所以导致目前odoo在网上的文献很少,学习相对来说比其他框架吃力.以下为大家总结1 ...
- MySQL解惑——GROUP BY隐式排序
MySQL中GROUP BY隐式排序是什么概念呢? 主要是其它RDBMS没有这样的概念,如果没有认真了解过概念,对这个概念会感觉有点困惑,我们先来看看官方文档的介绍: 官方文档MySQL 5.7 Re ...
- 如何使用coe_load_sql_profile.sql来固定sql profile
SQLT工具包含一个脚本,名字是 coe_load_sql_profile.sql,下面以用户SCOTT的EMP表为例,说明如何使用该脚本固定sql profile. 1. SQL> -- 对e ...
- source insight搭建python环境
SI是一个受到广泛欢迎的代码阅读/编辑器,那么能不能用SI来进行python开发呢,经过一晚上的试验,终于实现了这一功能. 1.python的语法高亮 source insight 4.0版本已经默认 ...