美文网首页
android 团队开发技巧1 - activity 启动

android 团队开发技巧1 - activity 启动

作者: Vankaln | 来源:发表于2016-08-17 15:31 被阅读124次

    标签(空格分隔): 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 的出现。

    相关文章

      网友评论

          本文标题:android 团队开发技巧1 - activity 启动

          本文链接:https://www.haomeiwen.com/subject/nlvmsttx.html