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
原创粉丝点击