一、活动的最佳实践
1. 知晓当前是在哪一个活动
背景:当你进入一家新公司,阅读别人的代码是很头疼的事。现在偏偏需要你在某个界面修改一些非常简单的东西,但是你花了很长时间却找不到这个界面对应的是哪个活动。
首先,我们新建一个BaseActivity继承Activity,然后重写onCreate()方法,代码如下:
public class BaseActivity extend Activity{
@override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
Log.d("BaseActivity",getClass.getSimpleName()); //logcat输出当前Activity的类名
}
}
然后项目中的其他Activity都继承BaseAcitivity,这样每当打开当前的活动,他的名字都会log日志中显示。
2. 随时随地退出程序
背景:比如我们从活动A到B到C,此时我们想一步退出程序,如果按home键只是在挂起在后台,并没有真正的退出。
思路其实很简单,我们只需要一个专门的集合类对所有的活动进行管理就可以了。
public class AcitivityCollector{
public static List<Activity> activities = new ArrayList<Activity>();
//添加Activity
public static void addActivity(Activity activity){
activities.add(activity);
}
//移除Activity
public static void removeAcitivity(Activity activity){
activities.remove(activity);
}
//关闭所有的Activity
public static void finishAll(){
for(Activity activity:activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
//关闭所有Acitivit,只保留某个Acitivity
public static void finishAllKeepOne(Class<?> clazz){
for(Activity activity:activities){
if (!clazz.getSimpleName().equals(activity.getClass().getSimpleName())){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
}
然后我们在BaseAcitivity中稍作改动,每个Activity创建时都加入都集合中,销毁后从集合移除:
public class BaseActivity extend Activity{
@override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
Log.d("BaseActivity",getClass.getSimpleName()); //logcat输出当前Activity的类名\
ActivityCollector.addActivity(this);
}
@override
protected void onDestroy(){
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
从此以后,不管你想在什么地方退出程序,只需要调用AcitivityCollector.finish()方法就可以了。
例如想在ThirdActivity中直接退出程序:
public class ThirdActivity extend BaseActivity{
@override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.third_layout);
Log.d("BaseActivity",getClass.getSimpleName()); //logcat输出当前Activity的类名\
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new onClickListener(){
@override
public void onClick(View v){
ActivityCollector.finishAll();
}
}
);
}
}
3. 启动活动的最佳写法
背景:在退队写作项目中,你负责FirstActivity,而你的同事负责SecondActivity,这是你需要从FirstActivity跳转到SecondActivity,而SecondActivity还需要两个非常重要的字符串参数。这时无非有两种办法,一是你去找你的同事问需要哪两个参数;二是你自己阅读SecondActivity中的代码。
其实我们可以这样来做,避免上面的窘境,请看:
public class SecondActivity extend BaseActivity{
//开启这个Activity的公共方法
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);
}
......
}
这样写的目的是代码一目了然,SecondActivity中所需的参数在方法中都体现出来了,这样你在FirstActivity中启动SecondActivity就非常简单了。
button.setOnClickListener(new onClickListener(){
@override
public void onClick(View v){
SecondActivity.actionStart(FirstActivity.this,"data1","data2");
}
}
);
二、自定义控件简例
问题背景:我们在项目中都会用到很多公用的控件,比如每个页面都有标题,如下图所示,粗略图:
我们可以将布局文件写完,然后再include到每个Activity的xml中,这样确实节省了一些代码,不用每个页面都再写一遍这个布局,但是返回和编辑两个按钮都是需要点击处理的,逻辑代码基本都一样。我们还是要每个页面都处理这两个按钮的点击事件,代码的复用性又变的很差。
解决类似的问题就用到我们自定控件,把按钮的点击事件都写在自定义控件内,如下:
public class TitleLayout extends LinearLayout{
public TitleLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public TitleLayout(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public TitleLayout(Context context) {
this(context,null);
}
private void init(Context context){
//引入布局界面
LayoutInflater.from(context).inflate(R.layout.title, this);
Button titleBack = (Button)findViewById(R.id.back);
Button titleEdit = (Button)findViewById(R.id.edit);
titleBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((Activity) getContext()).finish();
}
});
}
}
这样只需要xml中将自定义控件嵌入,点击按钮的代码就都不需要写了。