标签(空格分隔): android团队开发技巧 android


前景

记得一开始写安卓的时候,我都是像很多人一样,直接 new 一个 intent ,然后给用 intent.putExtra 方法来传递参数给 下一个 activity。如下代码:

public class OneActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Intent intent = new Intent(this, TwoActivity.class);        intent.putExtra("serverId", 20);        startActivity(intent);    }}public class TwoActivity extends Activity {    private ObjectBean mData;//数据源,实现到界面    private String mTitle;    private int mServerId;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mServerId = getIntent().getIntExtra("serverId", 0);        //加载服务器数据,伪代码,主要看逻辑        requestRemoteData(mServerId, new Listener(){            public void onComplete(RemoteBean bean){                mData = bean.data;                mTitle = bean.title;                setDataToUi();            }        });    }        private void setDataToUi(){        //把 mData 和 mTitle 数据都设置到 ui 上面        //.....    }}

问题

看上面代码的确没什么问题,但是当项目越来越大,需求越来越复杂,接手人数越来越多的时候,就会出现一堆的问题。
现在需求来了,加入 TwoActivity 的数据有可能不来自网络了,来自本地,但界面几乎一样的。面对这样的需求,有人会开一个 activity,但是如果当 activity 的逻辑极其复杂的时候,这样维护2分代码,成本会非常大。所以当页面差别非常小的时候应该采用同一个 activity。于是面对上面的需求,我们会增加一个参数,标志这个是加载本地数据还是服务器数据。代码:

public class OneActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Intent intent = new Intent(this, TwoActivity.class);        intent.putExtra("serverId", 20);        intent.putExtra("launchMode", 0);        startActivity(intent);    }}public class ThreeActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Intent intent = new Intent(this, TwoActivity.class);        intent.putExtra("title", "欢迎光临");        intent.putExtra("data", mData);        intent.putExtra("launchMode", 1);        startActivity(intent);    }}public class TwoActivity extends Activity {    private ObjectBean mData;//数据源,实现到界面    private String mTitle;    private int mServerId;    private int mLaunchMode = 0;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mServerId = getIntent().getIntExtra("serverId", 0);        mData = getIntent().getSerializableExtra("data");        mTitle = getIntent().getStringExtra("title");        mLaunchMode = getIntent().getIntExtra("launchModel", 0);        if(mLaunchMode == 0){            //加载服务器数据,伪代码,主要看逻辑            requestRemoteData(mServerId, new Listener(){                public void onComplete(RemoteBean bean){                    mData = bean.data;                    mTitle = bean.title;                    setDataToUi();                }            });        } else {            setDataToUi();        }            }        private void setDataToUi(){        //把 mData 和 mTitle 数据都设置到 ui 上面        //.....    }}

这样子就实现,同一个页面不同逻辑的需求了,可以看到引入了 mLaunchMode 标志变量来标志他的业务逻辑。的确比用多个activity 方便了。但是问题来了,这样子别人怎么知道放什么到 intent 里面?假如 TwoActivity 是我写的,OneActivity, ThreeActivity 是另外一个同事写得, 他可能放serverId, datatitle, launchMode的组合种情况,这样他需要启动我的页面就要来询问我要传什么参数到我的页面了,这样子大大增加加了沟通成本。

解决问题

为了解决这样的问题,我们在目标 activity 增加启动该页面的静态方法,这样子同事之间再也不会不知道启动别人的页面要传什么参数了,代码如下:

public class OneActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TwoActivity.launch(this, 20);    }}public class ThreeActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TwoActivity.launch(this, "欢迎光临", mData);    }}public class TwoActivity extends Activity {    public static final String EXTRA_SERVER_ID = "EXTRA_SERVER_ID";    public static final String EXTRA_TITLE = "EXTRA_TITLE";    public static final String EXTRA_DATA = "EXTRA_DATA";    public static final String EXTRA_LAUCH_MODE = "EXTRA_LAUCH_MODE";        public static void launch(Activity context, int serverId){        Intent intent = new Intent(context, TwoActivity.class);        intent.putExtra(EXTRA_SERVER_ID, serverId);        intent.putExtra(EXTRA_LAUCH_MODE, 0);        startActivity(intent);    }        public static void launch(Activity context, String title, ObjectBean data){         Intent intent = new Intent(this, TwoActivity.class);        intent.putExtra(EXTRA_TITLE, title);        intent.putExtra(EXTRA_DATA, data);        intent.putExtra(EXTRA_LAUCH_MODE, 1);        startActivity(intent);    }    private ObjectBean mData;//数据源,实现到界面    private String mTitle;    private int mServerId;    private int mLaunchMode = 0;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mServerId = getIntent().getIntExtra(EXTRA_SERVER_ID, 0);        mData = (ObjectBean) getIntent().getSerializableExtra(EXTRA_DATA);        mTitle = getIntent().getStringExtra(EXTRA_TITLE);        mLaunchMode = getIntent().getIntExtra(EXTRA_LAUCH_MODE, 0);        if(mLaunchMode == 0){            //加载服务器数据,伪代码,主要看逻辑            requestRemoteData(mServerId, new Listener(){                public void onComplete(RemoteBean bean){                    mData = bean.data;                    mTitle = bean.title;                    setDataToUi();                }            });        } else {            setDataToUi();        }            }        private void setDataToUi(){        //把 mData 和 mTitle 数据都设置到 ui 上面        //.....    }}

看到上面做了这样的更改,以后同事互相启用对方的页面变得非常简单,你只要打 launch 你就知道目标页面的各种启用方式。而且也不会因为传参数的时候参数名写错,目标页面收不到,等问题,减少很多 bug 的出现。

更多相关文章

  1. android 首开机会在数据链接图标的状态栏打开并自行消失主动
  2. 整理出15个Android很有用的代码片段
  3. 转:Android 对话框【Dialog】去除白色边框代码
  4. Github android客户端源代码分析之一:环境搭建
  5. Android Camera数据流分析全程记录
  6. 2010-02-27 传智播客—Android(二)数据存储和访问 之文件

随机推荐

  1. Android设置或清除默认桌面
  2. 在android中获取系统后台运行的进程
  3. android资源下载
  4. 出错:PhoneFactory.getDefaultPhone must
  5. android快捷方式的创建与删除
  6. Android(安卓)3G网络下 http refused 解
  7. Android(安卓)设置全屏,画图,加载位图
  8. [Android]自定义系统菜单的背景
  9. android友盟注意事项
  10. Js001-数据变量与函数