Android App框架设计之编写基类BaseActivity
来源:互联网 发布:在淘宝买摩托车可靠吗 编辑:程序博客网 时间:2024/04/30 07:18
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.
11 3
- Android App框架设计之编写基类BaseActivity
- Android BaseActivity App框架设计BaseActivity封装
- android app 框架之BaseActivity
- Android App框架设计 基类BaseActivity
- 编写基类BaseActivity
- 框架搭建之BaseActivity
- Android学习之自定义基类BaseApplication和BaseActivity
- Android模板设计模式之 - 构建整个应用的BaseActivity
- Android模板设计模式之 - 构建整个应用的BaseActivity
- android应用框架搭建------BaseActivity
- android应用框架搭建------BaseActivity
- android 之 Baseactivity 和BaseFragment
- BaseActivity基类封装
- BaseActivity的基类
- 设计模式 && android 框架 && app 设计
- Android中基类BaseActivity的设计与实现
- Android的BaseActivity的设计问题
- 搭建一个简单、易用的 Android 项目框架之BaseActivity(一)
- 算法导论22(基本的图算法)
- Oracle DDL,DML,DCL,TCL 基础概念
- iOS懒加载
- Android Intent的几种用法
- 文件编码格式
- Android App框架设计之编写基类BaseActivity
- 无约束最优化方法——牛顿法、拟牛顿法、BFGS、LBFGS
- Android中 记住密码(SharedPreferences)
- 设计模式-Factory
- SpringMVC-14 自定义拦截器
- 【 D3.js 高级系列 — 6.0 】 值域和颜色
- 从中国经济谈当代技术人的责任与担当
- 完善 C# ListView 系列-可编辑单元格
- ubuntu 下 pem 转换成 ppk