android 团队开发技巧1 - activity 启动
标签(空格分隔): 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
, data
,title
, 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 首开机会在数据链接图标的状态栏打开并自行消失主动
- 整理出15个Android很有用的代码片段
- 转:Android 对话框【Dialog】去除白色边框代码
- Github android客户端源代码分析之一:环境搭建
- Android Camera数据流分析全程记录
- 2010-02-27 传智播客—Android(二)数据存储和访问 之文件