Android App框架设计之编写基类BaseActivity
Android App框架设计之编写基类BaseActivity
编写基类BaseActivity
- OOP里面子类里面能够共享父类的方法,提高代码的可复用性
- 基类的编写要根据实际项目的情况,有的可能很简单 比如只是显示 “关于” 信息, 业务功能非常少 你可以不用继承基类进行扩展
BaseActivity继承Activity 还是 FragmentActivity 还是其它? 也是根据你的技术要求,因为解决问题的方法有很多种,或者你根本不用写基类也能完成工作。
我们的目的是编写较好的代码,提高代码可复用性,可扩展性,尤其是团队协作非常重要,这就是OOP为什么出现的原因之一。
考虑基类都应写什么?通用的代码。
- 网络环境监控
- 统一的数据接口
- 生命周期不同方法应该做的事情
刚工作的时候,看Spring源码 根本就不知道为什么搞那么多接口和对象,一层层的。 随着经验的积累才知道OOP的好处。
下面我们编写一个基础的基类,并不复杂。 假设我们的业务是公司的移动OA系统 我们需要管理员工。
抽象一个员工
//Domine为通用实体类,后面可作为泛型参数有用
public class Employee extends Domine {
private static final long serialVersionUID = 1L;
public Employee() {
}
public String fullName;
public String mobileTel;
public String email;
public String empNo;
}
//可以添加公共属性
public class Domine implements Serializable {
private static final long serialVersionUID = 1L;
public Domine() {
}
public int id;
public String desc;
}
数据交互的模型
public class MData<T> implements Serializable {
private static final long serialVersionUID = 1L;
public String id;
public String type;
public T dataList;//多种类型数据,一般是List集合,比如获取所有员工列表
}
下面是数据回调接口,我们从网络端获取数据 需要通知给UI
public interface IDataCallback<T> { //我们一样传入通用类型
public void onNewData(T data);
public void onError(String msg,int code);
}
下面是独立出来一个UIHandler,一般是写在Activity里面作为内部类,我这里没有
public class UIHandler extends Handler {
private IHandler handler;//回调接口,消息传递给注册者
public UIHandler(Looper looper) {
super(looper);
}
public UIHandler(Looper looper,IHandler handler) {
super(looper);
this.handler = handler;
}
public void setHandler(IHandler handler) {
this.handler = handler;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (handler != null) {
handler.handleMessage(msg);//有消息,就传递
}
}
}
public interface IHandler {
public void handleMessage(Message msg);
}
我们有了基本的东西,现在组合到BaseActivity中
public abstract class BaseActivity extends Activity {
// 可以把常量单独放到一个Class中
public static final String ACTION_NETWORK_CHANGE = "android.net.conn.CONNECTIVITY_CHANGE";
public static final String ACTION_PUSH_DATA = "fm.data.push.action";
public static final String ACTION_NEW_VERSION = "apk.update.action";
protected static UIHandler handler = new UIHandler(Looper.getMainLooper());
// 数据回调接口,都传递Domine的子类实体
protected IDataCallback<MData<? extends Domine>> dataCallback;
public BaseActivity() {
}
//这个地方有点“模板方法“的设计模式样子
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setBase();
setHandler();
initContentView(savedInstanceState);
}
private void setHandler() {
handler.setHandler(new IHandler() {
public void handleMessage(Message msg) {
handler(msg);//有消息就提交给子类实现的方法
}
});
}
// 初始化UI,setContentView等
protected abstract void initContentView(Bundle savedInstanceState);
// 可能全屏或者没有ActionBar等
private void setBase() {
requestWindowFeature(Window.FEATURE_NO_TITLE);// 例
}
protected void addLeftMenu(boolean enable) {
// 如果你的项目有侧滑栏可以处理此方法
if (enable) { // 是否能有侧滑栏
} else {
}
}
//让子类处理消息
protected abstract void handler(Message msg);
// 横竖屏切换,键盘等
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
try {
super.onRestoreInstanceState(savedInstanceState);
} catch (Exception e) {
}
}
@Override
protected void onResume() {
super.onResume();
// 你可以添加多个Action捕获
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_NETWORK_CHANGE);
filter.addAction(ACTION_PUSH_DATA);
filter.addAction(ACTION_NEW_VERSION);
registerReceiver(receiver, filter);
//还可能发送统计数据,比如第三方的SDK 做统计需求
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
//还可能发送统计数据,比如第三方的SDK 做统计需求
}
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 处理各种情况
String action = intent.getAction();
if (ACTION_NETWORK_CHANGE.equals(action)) { // 网络发生变化
// 处理网络问题
} else if (ACTION_PUSH_DATA.equals(action)) { // 可能有新数据
Bundle b = intent.getExtras();
MData<Employee> mdata = (MData<Employee>) b.get("data");
if (dataCallback != null) { // 数据通知
dataCallback.onNewData(mdata);
}
} else if (ACTION_NEW_VERSION.equals(action)) { // 可能发现新版本
// VersionDialog 可能是版本提示是否需要下载的对话框
}
}
};
public void setDataCallback(
IDataCallback<MData<? extends Domine>> dataCallback) {
this.dataCallback = dataCallback;
}
}
有了基类现在编写一个子类Activity
public class EmployeeDisplayActivity extends BaseActivity implements IDataCallback<MData<? extends Domine>> { //实现数据回调接口
public EmployeeDisplayActivity() {
}
@Override
protected void initContentView(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
loadData();
}
private void loadData() {
setDataCallback(this);//设置回调函数
//我们还可以把这个Callback传给其它获取数据的类,比如HTTP获取数据
//比如 HttClient.get(url,this);
}
@Override
public void onNewData(MData<? extends Domine> data) {
//update UI 更新UI数据
final List<Employee> list = (List<Employee>) data.dataList;
handler.post(new Runnable() {
public void run() {
//更新UI
}
});
//或者
handler.sendEmptyMessage(0);//通知Handler
}
@Override
public void onError(final String msg, final int code) {
handler.post(new Runnable() {
public void run() {
//通知错误消息
}
});
//或者
handler.sendEmptyMessage(0);//通知Handler
}
@Override
protected void handler(Message msg) { //我们可以处理数据消息了
switch (msg.what) {
case 0:
break;
case -1:
break;
default:
break;
}
}
}
UML关系图
本文编写了基本的BaseActivity代码,显然不可能是完美的,需要不断学习和改进,有问题欢迎探讨,Thanks.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。