Android App框架设计之编写基类BaseActivity
2015-05-20 18:16
459 查看
Android App框架设计之编写基类BaseActivity
编写基类BaseActivity
- OOP里面子类里面能够共享父类的方法,提高代码的可复用性
- 基类的编写要根据实际项目的情况,有的可能很简单 比如只是显示 “关于” 信息, 业务功能非常少 你可以不用继承基类进行扩展
BaseActivity继承Activity 还是 FragmentActivity 还是其它? 也是根据你的技术要求,因为解决问题的方法有很多种,或者你根本不用写基类也能完成工作。
我们的目的是编写较好的代码,提高代码可复用性,可扩展性,尤其是团队协作非常重要,这就是OOP为什么出现的原因之一。
考虑基类都应写什么?通用的代码。
网络环境监控
统一的数据接口
生命周期不同方法应该做的事情
刚工作的时候,看Spring源码 根本就不知道为什么搞那么多接口和对象,一层层的。 随着经验的积累才知道OOP的好处。
下面我们编写一个基础的基类,并不复杂。 假设我们的业务是公司的移动OA系统 我们需要管理员工。
抽象一个员工
数据交互的模型
下面是数据回调接口,我们从网络端获取数据 需要通知给UI
下面是独立出来一个UIHandler,一般是写在Activity里面作为内部类,我这里没有
我们有了基本的东西,现在组合到BaseActivity中
有了基类现在编写一个子类Activity
UML关系图
本文编写了基本的BaseActivity代码,显然不可能是完美的,需要不断学习和改进,有问题欢迎探讨,Thanks.
编写基类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.
相关文章推荐
- Android App框架设计之编写基类BaseActivity
- Android App框架设计 基类BaseActivity
- Android BaseActivity App框架设计BaseActivity封装
- android app 框架之BaseActivity
- Android中基类BaseActivity的设计与实现
- Android实战:手把手实现“捧腹网”APP(二)-----捧腹APP原型设计、实现框架选取
- Android实战:手把手实现“捧腹网”APP(二)-----捧腹APP原型设计、实现框架选取
- 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发
- 设计模式 && android 框架 && app 设计
- Android 基类BaseActivity的封装
- Android当中的MVP模式(六)View 层 Activity 的基类--- BaseMvpActivity 的封装
- android应用框架搭建------BaseActivity
- Android 从硬件到应用:一步一步向上爬 6 -- 编写APP测试框架层硬件服务(完)
- Android快速开发框架Android_BaseLib,集成了常用工具类,自定义View控件,Base基类封装,常用开源框架
- Android新手轻松学知乎日报开发(二)BaseActivity简单设计
- Android基类Activity的设计
- Android模板设计模式之 - 构建整个应用的BaseActivity
- Android 基类BaseActivity的封装
- android应用框架搭建之BaseActivity
- Android通用框架设计与完整电商APP开发一