前言
构建一个项目,架构方面我们需要考虑到很多因素。而在这其中,我们频繁接触的activity就是必须要着手的一方面。
在activity中公用的封装起来,对于我们项目的后续开发,会显著提高开发效率,降低成本。
这里,将列举一些常见的场景:
场景1:进公司第一次接手一个项目,项目经理让你修改某个界面相关布局
这个时候我们就需要快速的锁定该界面所对应的activity中的布局文件,可是我们第一次拿到这个项目,相关类并不熟悉,如何找到该activity呢?
最笨的办法,莫过于从AndroidManifest.xml找到入口activity,然后结合界面的跳转顺序,顺藤摸瓜,一步一步,找下去,这样,明显费时费力;即便是对于一个长久接触该项目的开发人员而言,项目中的activity类数量繁多,我们不可能一一记住,总有忘记某个activity对应的类的时候?
如何快速锁定呢?
我们可以编写一个BaseActivity.java,在onCreate()方法中顺便打印出该类的类名,代码如下:
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
}
}
在我们今后创建的activity都继承自BaseActivity,这样每次创建activity时,都会有打印信息:
这样在adt中运用ctrl+shift+r快捷键,快速找到所需类了,减少了不必要的时间成本。
场景2:快速退出程序
如何结合BaseActivity,封装一个任意时间点退出程序的功能?
步骤1:新建一个ActivityCollector类作为活动管理器,代码如下:
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
步骤2:BaseActivity.java中代码如下:
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
这样,我们在继承自BaseActivity的某个类中的退出程序的按钮中编写一行代码即可:
Button button = (Button) findViewById(R.id.button_3);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ActivityCollector.finishAll();
}
});
场景3:我们在启动他人编写的activity,往往需要传入某些特定的参数,而我们不知道具体的参数类型?
跳转另一个activity,代码经常会类似于如下形式:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("param1", "data1");
intent.putExtra("param2", "data2");
startActivity(intent);
对接他人代码,这种情况下,一个是我们自己去阅读需要启动的activity中的代码,二是询问负责编写 SecondActivity
的同事,这样就会很是麻烦!不免又加大了时间的成本。
较好的启动activity的写法如下:
在边写自己的activity时,留下一个启动该activity的接口方法,将所需的参数封装进去,代码如下:
public class SecondActivity extends BaseActivity {
public static void actionStart(Context context, String data1, String data2) {
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
}
……
}
这样对所需参数就会一目了然,我们在启动这个activity时:
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
}
});
养成一个良好的习惯,给你编写的每个活动都添加类似的启动方法,这样不仅可以让启动活动变得非常简单,还可以节省不少你同事过来询问你的时间。