android开发中经常要使用intent传递参数。之前使用intent向BActivity传递参数的时候,都是在BActivity类中声明几个常量用来当作key,在需要启动ActivBity的时候,向intent中putExtra(key, value),然后在BActivity中获取参数。这种方式用起来没什么问题,但是总觉得不舒服,因为启动BActivity的intent的参数的设置过程显得很松散。今天用Builder的方式对intent的参数设置进行了封装,代码看起来感觉要好一些。记录下来与大家分享。
首先是Builder的抽象基类:
/**
* Created by woookliu on 3/11/14.
*/
public abstract class BaseIntentBuilder {
private Intent intent;
public BaseIntentBuilder(Context context){
this.intent = new Intent(context, getTargetClazz());
}
protected abstract Class<?> getTargetClazz();
public Intent getIntent(){
return this.intent;
}
}
很简单,对外提供getIntent()方法。
下面是需要启动的TestActivity:
/**
* Created by woookliu on 3/11/14.
*/
public class TestActivity extends Activity {
private static final String EXTRA_INT_PARAM = "intParam";
private static final String EXTRA_ARRAY_PARAM = "arrayParam";
/**
* IntentBuilder类,帮助生成intent实例
*/
public static class IntentBuilder extends BaseIntentBuilder {
public IntentBuilder(Context context) {
super(context);
}
@Override
protected Class<?> getTargetClazz() {
return TestActivity.class;
}
/**
* 设置int类型参数
* @param param
* @return
*/
public IntentBuilder setIntParam(int param) {
super.getIntent().putExtra(EXTRA_INT_PARAM, param);
return this;
}
/**
* 设置int array类型参数
* @param paramArray
* @return
*/
public IntentBuilder setArrayParam(int[] paramArray) {
super.getIntent().putExtra(EXTRA_ARRAY_PARAM, paramArray);
return this;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//取出intent中的参数
int intParam = getIntent().getIntExtra(EXTRA_INT_PARAM, -1);
int[] arrayParam = getIntent().getExtras().getIntArray(EXTRA_ARRAY_PARAM);
Toast.makeText(this, "intParam:" + intParam + "\narrayParam:" + Arrays.toString(arrayParam), Toast.LENGTH_SHORT).show();
}
}
其中IntentBuilder类就是帮助生成intent实例的辅助类。
在其他类中使用Builder传递参数:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new TestActivity.IntentBuilder(MainActivity.this)
.setIntParam(5)
.setArrayParam(new int[]{1, 2, 3})
.getIntent());
}
});
}
}
在别的地方生成包含参数的启动TestActivity的intent的时候,可以通过调用方法的形式添加参数。参数作用可以通过方法名比较清楚地传递,同时在编译阶段限制了参数类型。