标签(空格分隔): 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(安卓)近百个项目的源代码,覆盖Android开发的每个领域
  4. android bluetooth 移植相关注意事项
  5. Android(安卓)Bundle类别
  6. android 首开机会在数据链接图标的状态栏打开并自行消失主动
  7. android 录音机&示波器
  8. 通過android selector改变界面状态
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. 始终悬浮在Android屏幕的弹窗
  2. Android之TextureView浅析
  3. java(eclipse)与VC++6.0 UDP通信
  4. android 如何自定义通知栏图标(不使用自定
  5. Google 与 Android(安卓)Studio插件自用
  6. Android(安卓)Jetpack框架之LiveData与Vi
  7. Android(安卓)Volley库源码简析(Image Req
  8. Android(安卓)布局优化之include与merge,
  9. 一步一步学习Android(安卓)TV/盒子开发(三
  10. Android之binder驱动个人学习小结